]> git.ipfire.org Git - oddments/ddns.git/blame - src/ddns/__init__.py
Replace INFO array with single variables.
[oddments/ddns.git] / src / ddns / __init__.py
CommitLineData
f22ab085 1#!/usr/bin/python
3fdcb9d1
MT
2###############################################################################
3# #
4# ddns - A dynamic DNS client for IPFire #
5# Copyright (C) 2012 IPFire development team #
6# #
7# This program is free software: you can redistribute it and/or modify #
8# it under the terms of the GNU General Public License as published by #
9# the Free Software Foundation, either version 3 of the License, or #
10# (at your option) any later version. #
11# #
12# This program is distributed in the hope that it will be useful, #
13# but WITHOUT ANY WARRANTY; without even the implied warranty of #
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15# GNU General Public License for more details. #
16# #
17# You should have received a copy of the GNU General Public License #
18# along with this program. If not, see <http://www.gnu.org/licenses/>. #
19# #
20###############################################################################
f22ab085
MT
21
22import logging
23import logging.handlers
24import ConfigParser
25
26from i18n import _
27
28logger = logging.getLogger("ddns.core")
29logger.propagate = 1
30
31from .providers import *
32from .system import DDNSSystem
33
34# Setup the logger.
35def setup_logging():
36 rootlogger = logging.getLogger("ddns")
4bba8ae2 37 rootlogger.setLevel(logging.INFO)
f22ab085
MT
38
39 # Setup a logger that logs to syslog.
5ad24917
MT
40 handler = logging.handlers.SysLogHandler(address="/dev/log",
41 facility=logging.handlers.SysLogHandler.LOG_DAEMON
42 )
43 handler.setLevel(logging.INFO)
44 rootlogger.addHandler(handler)
f22ab085
MT
45
46 handler = logging.StreamHandler()
47 rootlogger.addHandler(handler)
48
49setup_logging()
50
51class DDNSCore(object):
52 def __init__(self, debug=False):
53 # In debug mode, enable debug logging.
54 if debug:
87649e22
MT
55 rootlogger = logging.getLogger("ddns")
56 rootlogger.setLevel(logging.DEBUG)
57 for handler in rootlogger.handlers:
58 handler.setLevel(logging.DEBUG)
59
4bba8ae2 60 logger.debug(_("Debugging mode enabled"))
f22ab085
MT
61
62 # Initialize the settings array.
63 self.settings = {}
64
65 # Dict with all providers, that are supported.
66 self.providers = {}
67 self.register_all_providers()
68
69 # List of configuration entries.
70 self.entries = []
71
72 # Add the system class.
73 self.system = DDNSSystem(self)
74
75 def register_provider(self, provider):
76 """
77 Registers a new provider.
78 """
79 assert issubclass(provider, DDNSProvider)
80
6a11646e
MT
81 if not all((provider.handle, provider.name, provider.website)):
82 raise DDNSError(_("Provider is not properly configured"))
f22ab085 83
6a11646e
MT
84 assert not self.providers.has_key(provider.handle), \
85 "Provider '%s' has already been registered" % provider.handle
f22ab085 86
6a11646e
MT
87 logger.debug("Registered new provider: %s (%s)" % (provider.name, provider.handle))
88 self.providers[provider.handle] = provider
f22ab085
MT
89
90 def register_all_providers(self):
91 """
92 Simply registers all providers.
93 """
94 for provider in (
3b16fdb1 95 DDNSProviderAllInkl,
f3cf1f70 96 DDNSProviderDHS,
39301272 97 DDNSProviderDNSpark,
43b2cd59 98 DDNSProviderDtDNS,
bfed6701 99 DDNSProviderDynDNS,
3a8407fa 100 DDNSProviderDynU,
ee071271 101 DDNSProviderEasyDNS,
aa21a4c6 102 DDNSProviderFreeDNSAfraidOrg,
d1cd57eb 103 DDNSProviderNamecheap,
f22ab085 104 DDNSProviderNOIP,
a36d8df8 105 DDNSProviderLightningWireLabs,
a508bda6 106 DDNSProviderOVH,
ef33455e 107 DDNSProviderRegfish,
f22ab085 108 DDNSProviderSelfhost,
b09b1545 109 DDNSProviderSPDNS,
7488825c 110 DDNSProviderStrato,
a6183090 111 DDNSProviderTwoDNS,
03bdd188 112 DDNSProviderUdmedia,
c8c7ca8f 113 DDNSProviderVariomedia,
98fbe467 114 DDNSProviderZoneedit,
f22ab085
MT
115 ):
116 self.register_provider(provider)
117
2dae4713
MT
118 def get_provider_names(self):
119 """
120 Returns a list of names of all registered providers.
121 """
122 return sorted(self.providers.keys())
123
f22ab085 124 def load_configuration(self, filename):
332fd7cc
MT
125 logger.debug(_("Loading configuration file %s") % filename)
126
f22ab085
MT
127 configs = ConfigParser.SafeConfigParser()
128 configs.read([filename,])
129
130 # First apply all global configuration settings.
131 for k, v in configs.items("config"):
132 self.settings[k] = v
133
134 for entry in configs.sections():
135 # Skip the special config section.
136 if entry == "config":
137 continue
138
139 settings = {}
140 for k, v in configs.items(entry):
141 settings[k] = v
142 settings["hostname"] = entry
143
144 # Get the name of the provider.
145 provider = settings.get("provider", None)
146 if not provider:
147 logger.warning("Entry '%s' lacks a provider setting. Skipping." % entry)
148 continue
149
150 # Try to find the provider with the wanted name.
151 try:
152 provider = self.providers[provider]
153 except KeyError:
154 logger.warning("Could not find provider '%s' for entry '%s'." % (provider, entry))
155 continue
156
157 # Create an instance of the provider object with settings from the
158 # configuration file.
159 entry = provider(self, **settings)
160
161 # Add new entry to list (if not already exists).
162 if not entry in self.entries:
163 self.entries.append(entry)
164
1b8c6925
MT
165 def updateone(self, hostname, **kwargs):
166 for entry in self.entries:
167 if not entry.hostname == hostname:
168 continue
169
170 return self._update(entry, **kwargs)
171
172 raise DDNSHostNotFoundError(hostname)
173
174 def updateall(self, **kwargs):
175 """
176 Update all configured entries.
177 """
f22ab085
MT
178 # If there are no entries, there is nothing to do.
179 if not self.entries:
180 logger.debug(_("Found no entries in the configuration file. Exiting."))
181 return
182
f22ab085 183 for entry in self.entries:
1b8c6925 184 self._update(entry, **kwargs)
f22ab085 185
1b8c6925 186 def _update(self, entry, force=False):
f22ab085 187 try:
9da3e685 188 entry(force=force)
f22ab085 189
4689f5d3 190 except DDNSError, e:
f22ab085
MT
191 logger.error(_("Dynamic DNS update for %(hostname)s (%(provider)s) failed:") % \
192 { "hostname" : entry.hostname, "provider" : entry.name })
4689f5d3
MT
193 logger.error(" %s: %s" % (e.__class__.__name__, e.reason))
194 if e.message:
195 logger.error(" %s" % e.message)
f22ab085
MT
196
197 except Exception, e:
198 logger.error(_("Dynamic DNS update for %(hostname)s (%(provider)s) throwed an unhandled exception:") % \
708da5a4 199 { "hostname" : entry.hostname, "provider" : entry.name }, exc_info=True)
f22ab085 200
cbebe191
MT
201 else:
202 logger.info(_("Dynamic DNS update for %(hostname)s (%(provider)s) successful") % \
203 { "hostname" : entry.hostname, "provider" : entry.name })