]> git.ipfire.org Git - ddns.git/blame - src/ddns/__init__.py
Merge remote-tracking branch 'stevee/zoneedit.com'
[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:
55 logger.setLevel(logging.DEBUG)
4bba8ae2 56 logger.debug(_("Debugging mode enabled"))
f22ab085
MT
57
58 # Initialize the settings array.
59 self.settings = {}
60
61 # Dict with all providers, that are supported.
62 self.providers = {}
63 self.register_all_providers()
64
65 # List of configuration entries.
66 self.entries = []
67
68 # Add the system class.
69 self.system = DDNSSystem(self)
70
71 def register_provider(self, provider):
72 """
73 Registers a new provider.
74 """
75 assert issubclass(provider, DDNSProvider)
76
77 provider_handle = provider.INFO.get("handle")
78 assert provider_handle
79
80 assert not self.providers.has_key(provider_handle), \
81 "Provider '%s' has already been registered" % provider_handle
82
83 provider_name = provider.INFO.get("name")
84 assert provider_name
85
86 logger.debug("Registered new provider: %s (%s)" % (provider_name, provider_handle))
87 self.providers[provider_handle] = provider
88
89 def register_all_providers(self):
90 """
91 Simply registers all providers.
92 """
93 for provider in (
3b16fdb1 94 DDNSProviderAllInkl,
f3cf1f70 95 DDNSProviderDHS,
39301272 96 DDNSProviderDNSpark,
43b2cd59 97 DDNSProviderDtDNS,
bfed6701 98 DDNSProviderDynDNS,
3a8407fa 99 DDNSProviderDynU,
ee071271 100 DDNSProviderEasyDNS,
aa21a4c6 101 DDNSProviderFreeDNSAfraidOrg,
d1cd57eb 102 DDNSProviderNamecheap,
f22ab085 103 DDNSProviderNOIP,
a36d8df8 104 DDNSProviderLightningWireLabs,
a508bda6 105 DDNSProviderOVH,
ef33455e 106 DDNSProviderRegfish,
f22ab085 107 DDNSProviderSelfhost,
b09b1545 108 DDNSProviderSPDNS,
7488825c 109 DDNSProviderStrato,
a6183090 110 DDNSProviderTwoDNS,
03bdd188 111 DDNSProviderUdmedia,
c8c7ca8f 112 DDNSProviderVariomedia,
98fbe467 113 DDNSProviderZoneedit,
f22ab085
MT
114 ):
115 self.register_provider(provider)
116
2dae4713
MT
117 def get_provider_names(self):
118 """
119 Returns a list of names of all registered providers.
120 """
121 return sorted(self.providers.keys())
122
f22ab085 123 def load_configuration(self, filename):
332fd7cc
MT
124 logger.debug(_("Loading configuration file %s") % filename)
125
f22ab085
MT
126 configs = ConfigParser.SafeConfigParser()
127 configs.read([filename,])
128
129 # First apply all global configuration settings.
130 for k, v in configs.items("config"):
131 self.settings[k] = v
132
133 for entry in configs.sections():
134 # Skip the special config section.
135 if entry == "config":
136 continue
137
138 settings = {}
139 for k, v in configs.items(entry):
140 settings[k] = v
141 settings["hostname"] = entry
142
143 # Get the name of the provider.
144 provider = settings.get("provider", None)
145 if not provider:
146 logger.warning("Entry '%s' lacks a provider setting. Skipping." % entry)
147 continue
148
149 # Try to find the provider with the wanted name.
150 try:
151 provider = self.providers[provider]
152 except KeyError:
153 logger.warning("Could not find provider '%s' for entry '%s'." % (provider, entry))
154 continue
155
156 # Create an instance of the provider object with settings from the
157 # configuration file.
158 entry = provider(self, **settings)
159
160 # Add new entry to list (if not already exists).
161 if not entry in self.entries:
162 self.entries.append(entry)
163
1b8c6925
MT
164 def updateone(self, hostname, **kwargs):
165 for entry in self.entries:
166 if not entry.hostname == hostname:
167 continue
168
169 return self._update(entry, **kwargs)
170
171 raise DDNSHostNotFoundError(hostname)
172
173 def updateall(self, **kwargs):
174 """
175 Update all configured entries.
176 """
f22ab085
MT
177 # If there are no entries, there is nothing to do.
178 if not self.entries:
179 logger.debug(_("Found no entries in the configuration file. Exiting."))
180 return
181
f22ab085 182 for entry in self.entries:
1b8c6925 183 self._update(entry, **kwargs)
f22ab085 184
1b8c6925 185 def _update(self, entry, force=False):
f22ab085 186 try:
9da3e685 187 entry(force=force)
f22ab085
MT
188
189 except DDNSUpdateError, e:
190 logger.error(_("Dynamic DNS update for %(hostname)s (%(provider)s) failed:") % \
191 { "hostname" : entry.hostname, "provider" : entry.name })
192 logger.error(" %s" % e)
193
194 except Exception, e:
195 logger.error(_("Dynamic DNS update for %(hostname)s (%(provider)s) throwed an unhandled exception:") % \
196 { "hostname" : entry.hostname, "provider" : entry.name })
197 logger.error(" %s" % e)
198
cbebe191
MT
199 else:
200 logger.info(_("Dynamic DNS update for %(hostname)s (%(provider)s) successful") % \
201 { "hostname" : entry.hostname, "provider" : entry.name })