class BaseRedisConfig(BaseConfig): config_type = 'redis' def set(self, option, value, append=False): if not self.data: self.data = Configuration(self.config_type) if os.path.exists(self.path): self.data.read(self.path) if value: if append: self.data.add(option, str(value)) else: self.data.set(option,str(value), force=True) else: self.data.comment(option) if self.autosave: self.save_data() self.data = None def set_sequential_option(self, option, seq): is_typle = type(seq) is tuple try: assert seq is None or is_typle except AssertionError: raise ValueError('%s must be a sequence (got %s instead)' % (option, seq)) self.set(option, ' '.join(map(str,seq)) if is_typle else None) def get_sequential_option(self, option): raw = self.get(option) return raw.split() if raw else () def get_list(self, option): if not self.data: self.data = Configuration(self.config_type) if os.path.exists(self.path): self.data.read(self.path) try: value = self.data.get_list(option) except NoPathError: try: value = getattr(self, option+'_default') except AttributeError: value = () if self.autosave: self.data = None return value def get_dict_option(self, option): raw = self.get_list(option) d = {} for raw_value in raw: k,v = raw_value.split() if k and v: d[k] = v return d def set_dict_option(self, option, d): try: assert d is None or type(d)==dict #cleaning up #TODO: make clean process smarter using indexes for i in self.get_list(option): self.set(option+'[0]', None) #adding multiple entries for k,v in d.items(): val = ' '.join(map(str,'%s %s'%(k,v))) self.set(option, val, append=True) except ValueError: raise ValueError('%s must be a sequence (got %s instead)' % (option, d))
config.read(os.path.join(bus.share_path, "nginx/server.tpl")) if disttool.is_debian_based(): # Comment /etc/nginx/sites-enabled/* try: i = config.get_list('http/include').index('/etc/nginx/sites-enabled/*') config.comment('http/include[%d]' % (i+1)) self._logger.debug('comment site-enabled include') except (ValueError, IndexError): self._logger.debug('site-enabled include already commented') elif disttool.is_redhat_based(): def_host_path = '/etc/nginx/conf.d/default.conf' if os.path.exists(def_host_path): default_host = Configuration('nginx') default_host.read(def_host_path) default_host.comment('server') default_host.write(def_host_path) if dump == self._dump_config(config): self._logger.debug("Main nginx config wasn`t changed") else: # Write new nginx.conf shutil.copy(nginx_conf_path, nginx_conf_path + '.bak') config.write(nginx_conf_path) if reload_service: self.api._reload_service() def _insert_iptables_rules(self, *args, **kwargs): if iptables.enabled(): iptables.FIREWALL.ensure([ {"jump": "ACCEPT", "protocol": "tcp", "match": "tcp", "dport": "80"},
class BaseConfig(object): ''' Parent class for object representations of postgresql.conf and recovery.conf which fortunately both have similar syntax ''' autosave = None path = None data = None config_name = None config_type = None comment_empty = False def __init__(self, path, autosave=True): self._logger = logging.getLogger(__name__) self.autosave = autosave self.path = path @classmethod def find(cls, config_dir): return cls(os.path.join(config_dir.path, cls.config_name)) def set(self, option, value): if not self.data: self.data = Configuration(self.config_type) if os.path.exists(self.path): self.data.read(self.path) if value: self.data.set(option,str(value), force=True) elif self.comment_empty: self.data.comment(option) if self.autosave: self.save_data() self.data = None def set_path_type_option(self, option, path): if not os.path.exists(path): raise ValueError('%s %s does not exist' % (option, path)) self.set(option, path) def set_numeric_option(self, option, number): try: assert number is None or type(number) is int except AssertionError: raise ValueError('%s must be a number (got %s instead)' % (option, number)) is_numeric = type(number) is int self.set(option, str(number) if is_numeric else None) def get(self, option): if not self.data: self.data = Configuration(self.config_type) if os.path.exists(self.path): self.data.read(self.path) try: value = self.data.get(option) except NoPathError: try: value = getattr(self, option+'_default') except AttributeError: value = None if self.autosave: self.data = None return value def get_numeric_option(self, option): value = self.get(option) try: assert value is None or int(value) except AssertionError: raise ValueError('%s must be a number (got %s instead)' % (option, type(value))) return value if value is None else int(value) def save_data(self): if self.data: self.data.write(self.path)