X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=src%2Fddns%2F__init__.py;h=84b8c80043a2378284afc254585d4c080b72b837;hb=7ef8eb680cd76ca374c3e60f89b50582ec2f897e;hp=74989f3f7fb2e1f1dabd75fa21382da5d56a5b04;hpb=f3cf1f7090102ea4a4520542d470e18a4791b8d3;p=ddns.git diff --git a/src/ddns/__init__.py b/src/ddns/__init__.py index 74989f3..84b8c80 100644 --- a/src/ddns/__init__.py +++ b/src/ddns/__init__.py @@ -28,16 +28,25 @@ from i18n import _ logger = logging.getLogger("ddns.core") logger.propagate = 1 -from .providers import * +import database +import providers + +from .errors import * from .system import DDNSSystem # Setup the logger. def setup_logging(): rootlogger = logging.getLogger("ddns") - rootlogger.setLevel(logging.DEBUG) + rootlogger.setLevel(logging.INFO) # Setup a logger that logs to syslog. - #handler = logging.handlers.SysLogHandler(address="/dev/log") + handler = logging.handlers.SysLogHandler(address="/dev/log", + facility=logging.handlers.SysLogHandler.LOG_DAEMON + ) + formatter = logging.Formatter("ddns[%(process)d]: %(message)s") + handler.setFormatter(formatter) + handler.setLevel(logging.INFO) + rootlogger.addHandler(handler) handler = logging.StreamHandler() rootlogger.addHandler(handler) @@ -48,14 +57,19 @@ class DDNSCore(object): def __init__(self, debug=False): # In debug mode, enable debug logging. if debug: - logger.setLevel(logging.DEBUG) + rootlogger = logging.getLogger("ddns") + rootlogger.setLevel(logging.DEBUG) + + logger.debug(_("Debugging mode enabled")) # Initialize the settings array. self.settings = {} # Dict with all providers, that are supported. - self.providers = {} - self.register_all_providers() + self.providers = providers.get() + + for handle, provider in sorted(self.providers.items()): + logger.debug("Registered new provider: %s (%s)" % (provider.name, provider.handle)) # List of configuration entries. self.entries = [] @@ -63,43 +77,29 @@ class DDNSCore(object): # Add the system class. self.system = DDNSSystem(self) - def register_provider(self, provider): - """ - Registers a new provider. - """ - assert issubclass(provider, DDNSProvider) + # Open the database. + self.db = database.DDNSDatabase(self, "/var/lib/ddns.db") - provider_handle = provider.INFO.get("handle") - assert provider_handle - - assert not self.providers.has_key(provider_handle), \ - "Provider '%s' has already been registered" % provider_handle - - provider_name = provider.INFO.get("name") - assert provider_name - - logger.debug("Registered new provider: %s (%s)" % (provider_name, provider_handle)) - self.providers[provider_handle] = provider - - def register_all_providers(self): + def get_provider_names(self): """ - Simply registers all providers. + Returns a list of names of all registered providers. """ - for provider in ( - DDNSProviderDHS, - DDNSProviderNOIP, - DDNSProviderLightningWireLabs, - DDNSProviderSelfhost, - ): - self.register_provider(provider) + return sorted(self.providers.keys()) def load_configuration(self, filename): - configs = ConfigParser.SafeConfigParser() + logger.debug(_("Loading configuration file %s") % filename) + + configs = ConfigParser.RawConfigParser() configs.read([filename,]) # First apply all global configuration settings. - for k, v in configs.items("config"): - self.settings[k] = v + try: + for k, v in configs.items("config"): + self.settings[k] = v + + # Allow missing config section + except ConfigParser.NoSectionError: + pass for entry in configs.sections(): # Skip the special config section. @@ -132,29 +132,38 @@ class DDNSCore(object): if not entry in self.entries: self.entries.append(entry) - def updateall(self): + def updateone(self, hostname, **kwargs): + for entry in self.entries: + if not entry.hostname == hostname: + continue + + return self._update(entry, **kwargs) + + raise DDNSHostNotFoundError(hostname) + + def updateall(self, **kwargs): + """ + Update all configured entries. + """ # If there are no entries, there is nothing to do. if not self.entries: logger.debug(_("Found no entries in the configuration file. Exiting.")) return - # Update them all. for entry in self.entries: - self.update(entry) + self._update(entry, **kwargs) - def update(self, entry): + def _update(self, entry, force=False): try: - entry() + entry(force=force) - except DDNSUpdateError, e: + except DDNSError, e: logger.error(_("Dynamic DNS update for %(hostname)s (%(provider)s) failed:") % \ { "hostname" : entry.hostname, "provider" : entry.name }) - logger.error(" %s" % e) + logger.error(" %s: %s" % (e.__class__.__name__, e.reason)) + if e.message: + logger.error(" %s" % e.message) except Exception, e: logger.error(_("Dynamic DNS update for %(hostname)s (%(provider)s) throwed an unhandled exception:") % \ - { "hostname" : entry.hostname, "provider" : entry.name }) - logger.error(" %s" % e) - - logger.info(_("Dynamic DNS update for %(hostname)s (%(provider)s) successful") % \ - { "hostname" : entry.hostname, "provider" : entry.name }) + { "hostname" : entry.hostname, "provider" : entry.name }, exc_info=True)