Example #1
0
 def read_config(self, *args, **kwargs):
     try:
         config = self.core.config_manager.get(self.NAME)
         self.key_exists = True
     except ConfigError:
         self.key_exists = False
         self.resolvcfg = ResolvCfgAutoconf()
     else:
         self.resolvcfg = deserialize(config)
Example #2
0
 def __init__(self):
     ConfigServiceComponent.__init__(self)
     self.addConfFile('/etc/resolv.conf', 'root:root', '0644')
     self.key_exists = False
     self.resolvcfg = ResolvCfgAutoconf()
Example #3
0
class ResolvComponent(ConfigServiceComponent):
    NAME = "resolv"
    VERSION = "1.0"

    REQUIRES = ('config',)

    INIT_SCRIPT = "/bin/true"

    CONFIG = { 'nameservers': '',
               'domain': ''
             }
    CONFIG_DEPENDS = ()

    ROLES = {
        'conf_read': set(('getResolvConfig', 'getRunningConfig', 'getDomain', 'test')),
        'conf_write': set(('setResolvConfig',)),
    }

    def __init__(self):
        ConfigServiceComponent.__init__(self)
        self.addConfFile('/etc/resolv.conf', 'root:root', '0644')
        self.key_exists = False
        self.resolvcfg = ResolvCfgAutoconf()

    def init(self, core):
        ConfigServiceComponent.init(self, core)
        if not self.key_exists:
            self.useDefaultConf()

    def read_config(self, *args, **kwargs):
        try:
            config = self.core.config_manager.get(self.NAME)
            self.key_exists = True
        except ConfigError:
            self.key_exists = False
            self.resolvcfg = ResolvCfgAutoconf()
        else:
            self.resolvcfg = deserialize(config)

    def apply_config(self, responsible, paths, arg=None):
        """
        Callback for config manager
        """
        nameservers = []
        for dns in [self.resolvcfg.nameserver1, self.resolvcfg.nameserver2]:
            if dns:
                nameservers.append(dns)

        template_variables = {
            'domain' : self.resolvcfg.domain,
            'nameservers' : ('127.0.0.1',)
        }
        self.generate_configfile(template_variables)

    def rollback_config(self, responsible, paths, arg=None):
        """
        same as apply but commit and save default conf if current conf is empty
        """
        # FIXME must be done but not supported yet
        #if not self.key_exists:
        #    self.useDefaultConf()
        return self.apply_config(responsible, paths, arg=arg)

    def useDefaultConf(self):
        """
        commit & apply default conf
        """
        self.debug("take in account default configuration")
        self.save_config(
            CONFIG_AUTOCONFIGURATION,
            "Resolv module Autoconfiguration"
            )
        self.core.config_manager.signalAutoconf()

    def save_config(self, action, message, context=None):
        with self.core.config_manager.begin(self, context, action=action) as cm:
            try:
                cm.delete(self.NAME)
            except ConfigError:
                pass
            cm.set(self.NAME, self.resolvcfg.serialize())
            cm.commit(message)

    def getDomain(self):
        return self.resolvcfg.domain

    def service_getDomain(self, context):
        return self.getDomain()

    # Services
    def service_getResolvConfig(self, context):
        return self.resolvcfg.serialize()

    def service_getRunningConfig(self, context):
        return self.core.config_manager.get(
            self.NAME,
            which_configuration='applied'
            )

    def service_setResolvConfig(self, context, serialized, message):
        resolvcfg = deserialize(serialized)
        invalid_data = resolvcfg.isInvalid()
        if not invalid_data:
            self.resolvcfg = resolvcfg
            self.save_config(CONFIG_MODIFICATION, message, context)
        else:
            raise ResolvError("Error : '%s'" % invalid_data)

    def service_status(self, context):
        """See service status"""
        return self.NAME, ServiceStatusValues.NOT_A_SERVICE

    def service_test(self, context, data):
        server = data.get('server')
        query = data.get('query')
        #TODO: validate both variables as IP or FQDN
        return deferToThread(dig, self, **{
            'defaultserver': self.resolvcfg.nameserver1,
            'server': server,
            'query': query}
            )