def read_variables(self, filename=None, package=None, override=False): # type: (str, str, bool) -> None """ Read variable descriptions. :param filename: Explicit filename for loading. :param package: Explicit package name. :param override: `True` to overwrite already loaded descriptions. :raises AttributeError: if neither `filename` nor `package` are given. """ if filename: pass elif package: filename = os.path.join(ConfigRegistryInfo.BASE_DIR, ConfigRegistryInfo.VARIABLES, package + ConfigRegistryInfo.FILE_SUFFIX) else: raise AttributeError("neither 'filename' nor 'package' is specified") cfg = uit.UnicodeConfig() cfg.read(filename) for sec in cfg.sections(): # is a pattern? if sec.find('.*') != -1: self._patterns[sec] = cfg.items(sec) continue # variable already known? if not override and sec in self.variables: continue var = Variable() for name, value in cfg.items(sec): var[name] = value # get current value if self._configRegistry is not None: var.value = self._configRegistry.get(sec, None) self.variables[sec] = var
def read_services(self, filename=None, package=None, override=False): """ Read start/stop levels of services. :param filename: Explicit filename for loading. :param package: Explicit package name. :param override: `True` to overwrite already loaded descriptions. :raises AttributeError: if neither `filename` nor `package` are given. """ if not filename and not package: raise AttributeError( "neither 'filename' nor 'package' is specified") if not filename: filename = os.path.join(ServiceInfo.BASE_DIR, ServiceInfo.SERVICES, package + ServiceInfo.FILE_SUFFIX) cfg = uit.UnicodeConfig() cfg.read(filename) for sec in cfg.sections(): # service already known? if not override and sec in self.services: continue srv = Service() srv['name'] = sec for name, value in cfg.items(sec): srv[name] = value for path in srv.get('programs', '').split(','): # "programs" defines the "/proc/self/cmdline" of the service, # not the executable, therefore we test for a leading "/": # check if it is a real file split to remove parameters if path.startswith('/') and not os.path.exists( path.split(' ', 1)[0]): break # ==> do not execute else else: self.services[sec] = srv
def read_variables(self, filename=None, package=None, override=False): """Read variable descriptions.""" if filename: pass elif package: filename = os.path.join(ConfigRegistryInfo.BASE_DIR, ConfigRegistryInfo.VARIABLES, package + ConfigRegistryInfo.FILE_SUFFIX) else: raise AttributeError( "neither 'filename' nor 'package' is specified") cfg = uit.UnicodeConfig() cfg.read(filename) for sec in cfg.sections(): # is a pattern? if sec.find('.*') != -1: self.__patterns[sec] = cfg.items(sec) continue # variable already known? if not override and sec in self.variables: continue var = Variable() for name, value in cfg.items(sec): var[name] = value # get current value if self.__configRegistry is not None: var.value = self.__configRegistry.get(sec, None) self.variables[sec] = var
def _write_variables(self, filename=None, package=None): # type: (str, str) -> bool """ Persist the variable descriptions into a file. :param filename: Explicit filename for saving. :param package: Explicit package name. :raises AttributeError: if neither `filename` nor `package` are given. :returns: `True` on success, `False` otherwise. """ if filename: pass elif package: filename = os.path.join(ConfigRegistryInfo.BASE_DIR, ConfigRegistryInfo.VARIABLES, package + ConfigRegistryInfo.FILE_SUFFIX) else: raise AttributeError("neither 'filename' nor 'package' is specified") try: with open(filename, 'w') as fd: cfg = uit.UnicodeConfig() for name, var in self.variables.items(): cfg.add_section(name) for key in var.keys(): items = var.normalize(key) for item, value in items.items(): value = value cfg.set(name, item, value) cfg.write(fd) return True except EnvironmentError: return False
def __write_variables(self, filename=None, package=None): """Persist the variable descriptions into a file.""" if filename: pass elif package: filename = os.path.join(ConfigRegistryInfo.BASE_DIR, ConfigRegistryInfo.VARIABLES, package + ConfigRegistryInfo.FILE_SUFFIX) else: raise AttributeError( "neither 'filename' nor 'package' is specified") try: fd = open(filename, 'w') except IOError: return False cfg = uit.UnicodeConfig() for name, var in self.variables.items(): cfg.add_section(name) for key in var.keys(): items = var.normalize(key) for item, value in items.items(): value = value cfg.set(name, item, value) cfg.write(fd) fd.close() return True
def read_categories(self, filename): """Load a single category description file.""" cfg = uit.UnicodeConfig() cfg.read(filename) for sec in cfg.sections(): # category already known? cat_name = sec.lower() if cat_name in self.categories: continue cat = Category() for name, value in cfg.items(sec): cat[name] = value self.categories[cat_name] = cat
def write_customized(self): """Save service cusomization.""" filename = os.path.join(ServiceInfo.BASE_DIR, ServiceInfo.SERVICES, ServiceInfo.CUSTOMIZED) try: with open(filename, 'w') as fd: cfg = uit.UnicodeConfig() for name, srv in self.services.items(): cfg.add_section(name) for key in srv.keys(): items = srv.normalize(key) for item, value in items.items(): cfg.set(name, item, value) cfg.write(fd) return True except EnvironmentError: return False
def write_customized(self): filename = os.path.join(ServiceInfo.BASE_DIR, ServiceInfo.SERVICES, ServiceInfo.CUSTOMIZED) try: fd = open(filename, 'w') except: return False cfg = uit.UnicodeConfig() for name, srv in self.services.items(): cfg.add_section(name) for key in var.keys(): items = var.normalize(key) for item, value in items.items(): cfg.set(name, item, value) cfg.write(fd) fd.close() return True
def cfg(self): """Return UnicodeConfig instance.""" return uit.UnicodeConfig()