def _load_config_data(self, file_name): try: config_obj = ConfigObj(file_name, raise_errors = True, list_values = False, interpolation = False) except ConfigObjError as e: raise InvalidProfileException("Cannot parse '%s'." % file_name, e) config = collections.OrderedDict() for section in config_obj.keys(): config[section] = collections.OrderedDict() try: keys = config_obj[section].keys() except AttributeError: raise InvalidProfileException("Error parsing section '%s' in file '%s'." % (section, file_name)) for option in keys: config[section][option] = config_obj[section][option] dir_name = os.path.dirname(file_name) # TODO: Could we do this in the same place as the expansion of other functions? for section in config: for option in config[section]: config[section][option] = self._expand_profile_dir(dir_name, config[section][option]) # TODO: HACK, this needs to be solved in a better way (better config parser) for unit_name in config: if "script" in config[unit_name] and config[unit_name].get("script", None) is not None: script_path = os.path.join(dir_name, config[unit_name]["script"]) config[unit_name]["script"] = [os.path.normpath(script_path)] return config
def load(self, profile_names): if type(profile_names) is not list: profile_names = profile_names.split() profile_names = list(filter(self.safe_name, profile_names)) if len(profile_names) == 0: raise InvalidProfileException( "No profile or invalid profiles were specified.") if len(profile_names) > 1: log.info("loading profiles: %s" % ", ".join(profile_names)) else: log.info("loading profile: %s" % profile_names[0]) profiles = [] processed_files = [] self._load_profile(profile_names, profiles, processed_files) if len(profiles) > 1: final_profile = self._profile_merger.merge(profiles) else: final_profile = profiles[0] final_profile.name = " ".join(profile_names) if "variables" in final_profile.units: self._variables.add_from_cfg( final_profile.units["variables"].options) del (final_profile.units["variables"]) # FIXME hack, do all variable expansions in one place self._expand_vars_in_devices(final_profile) return final_profile
def execute(self, args): if not super(self.__class__, self).execute(args): return None if args[1] == args[2]: log.error("assertion '%s' failed: '%s' == '%s'" % (args[0], args[1], args[2])) raise InvalidProfileException("Assertion '%s' failed." % args[0]) return None
def _load_config_data(self, file_name): try: config_obj = ConfigParser(delimiters=('='), inline_comment_prefixes=('#')) config_obj.optionxform = str with open(file_name) as f: config_obj.read_file(f, file_name) except Error as e: raise InvalidProfileException("Cannot parse '%s'." % file_name, e) config = collections.OrderedDict() dir_name = os.path.dirname(file_name) for section in list(config_obj.sections()): config[section] = collections.OrderedDict() for option in config_obj.options(section): config[section][option] = config_obj.get(section, option, raw=True) config[section][option] = self._expand_profile_dir( dir_name, config[section][option]) if config[section].get("script") is not None: script_path = os.path.join(dir_name, config[section]["script"]) config[section]["script"] = [os.path.normpath(script_path)] return config
def _load_profile(self, profile_names, profiles, processed_files): for name in profile_names: filename = self._profile_locator.get_config(name, processed_files) if filename is None: raise InvalidProfileException("Cannot find profile '%s' in '%s'." % (name, list(reversed(self._profile_locator._load_directories)))) processed_files.append(filename) config = self._load_config_data(filename) profile = self._profile_factory.create(name, config) if "include" in profile.options: include_name = profile.options.pop("include") self._load_profile([include_name], profiles, processed_files) profiles.append(profile)
def _load_profile(self, profile_names, profiles, processed_files): for name in profile_names: filename = self._profile_locator.get_config(name, processed_files) if filename == "": continue if filename is None: raise InvalidProfileException("Cannot find profile '%s' in '%s'." % (name, list(reversed(self._profile_locator._load_directories)))) processed_files.append(filename) config = self._load_config_data(filename) profile = self._profile_factory.create(name, config) if "include" in profile.options: include_names = re.split(r"\b\s*[,;]\s*", self._variables.expand(profile.options.pop("include"))) self._load_profile(include_names, profiles, processed_files) profiles.append(profile)
def _load_config_data(self, file_name): try: config_obj = ConfigObj(file_name, raise_errors=True) except ConfigObjError as e: raise InvalidProfileException("Cannot parse '%s'." % file_name, e) config = collections.OrderedDict() for section in config_obj.keys(): config[section] = collections.OrderedDict() for option in config_obj[section].keys(): config[section][option] = config_obj[section][option] # TODO: HACK, this needs to be solved in a better way (better config parser) for unit_name in config: if "script" in config[unit_name] and config[unit_name].get( "script", None) is not None: dir_name = os.path.dirname(file_name) script_path = os.path.join(dir_name, config[unit_name]["script"]) config[unit_name]["script"] = [os.path.normpath(script_path)] return config
def load(self, profile_names): if type(profile_names) is not list: profile_names = profile_names.split() profile_names = filter(self.safe_name, profile_names) if len(profile_names) == 0: raise InvalidProfileException("No profile or invalid profiles were specified.") if len(profile_names) > 1: log.info("loading profiles: %s" % ", ".join(profile_names)) else: log.info("loading profile: %s" % profile_names[0]) profiles = [] processed_files = [] self._load_profile(profile_names, profiles, processed_files) if len(profiles) > 1: final_profile = self._profile_merger.merge(profiles) else: final_profile = profiles[0] final_profile.name = " ".join(profile_names) return final_profile