]> git.ipfire.org Git - ddns.git/blame - src/ddns/__init__.py
Merge remote-tracking branch 'stevee/regfish'
[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 (
f3cf1f70 94 DDNSProviderDHS,
39301272 95 DDNSProviderDNSpark,
43b2cd59 96 DDNSProviderDtDNS,
bfed6701 97 DDNSProviderDynDNS,
ee071271 98 DDNSProviderEasyDNS,
aa21a4c6 99 DDNSProviderFreeDNSAfraidOrg,
f22ab085 100 DDNSProviderNOIP,
a36d8df8 101 DDNSProviderLightningWireLabs,
a508bda6 102 DDNSProviderOVH,
ef33455e 103 DDNSProviderRegfish,
f22ab085 104 DDNSProviderSelfhost,
b09b1545 105 DDNSProviderSPDNS,
c8c7ca8f 106 DDNSProviderVariomedia,
f22ab085
MT
107 ):
108 self.register_provider(provider)
109
2dae4713
MT
110 def get_provider_names(self):
111 """
112 Returns a list of names of all registered providers.
113 """
114 return sorted(self.providers.keys())
115
f22ab085 116 def load_configuration(self, filename):
332fd7cc
MT
117 logger.debug(_("Loading configuration file %s") % filename)
118
f22ab085
MT
119 configs = ConfigParser.SafeConfigParser()
120 configs.read([filename,])
121
122 # First apply all global configuration settings.
123 for k, v in configs.items("config"):
124 self.settings[k] = v
125
126 for entry in configs.sections():
127 # Skip the special config section.
128 if entry == "config":
129 continue
130
131 settings = {}
132 for k, v in configs.items(entry):
133 settings[k] = v
134 settings["hostname"] = entry
135
136 # Get the name of the provider.
137 provider = settings.get("provider", None)
138 if not provider:
139 logger.warning("Entry '%s' lacks a provider setting. Skipping." % entry)
140 continue
141
142 # Try to find the provider with the wanted name.
143 try:
144 provider = self.providers[provider]
145 except KeyError:
146 logger.warning("Could not find provider '%s' for entry '%s'." % (provider, entry))
147 continue
148
149 # Create an instance of the provider object with settings from the
150 # configuration file.
151 entry = provider(self, **settings)
152
153 # Add new entry to list (if not already exists).
154 if not entry in self.entries:
155 self.entries.append(entry)
156
1b8c6925
MT
157 def updateone(self, hostname, **kwargs):
158 for entry in self.entries:
159 if not entry.hostname == hostname:
160 continue
161
162 return self._update(entry, **kwargs)
163
164 raise DDNSHostNotFoundError(hostname)
165
166 def updateall(self, **kwargs):
167 """
168 Update all configured entries.
169 """
f22ab085
MT
170 # If there are no entries, there is nothing to do.
171 if not self.entries:
172 logger.debug(_("Found no entries in the configuration file. Exiting."))
173 return
174
f22ab085 175 for entry in self.entries:
1b8c6925 176 self._update(entry, **kwargs)
f22ab085 177
1b8c6925 178 def _update(self, entry, force=False):
f22ab085 179 try:
9da3e685 180 entry(force=force)
f22ab085
MT
181
182 except DDNSUpdateError, e:
183 logger.error(_("Dynamic DNS update for %(hostname)s (%(provider)s) failed:") % \
184 { "hostname" : entry.hostname, "provider" : entry.name })
185 logger.error(" %s" % e)
186
187 except Exception, e:
188 logger.error(_("Dynamic DNS update for %(hostname)s (%(provider)s) throwed an unhandled exception:") % \
189 { "hostname" : entry.hostname, "provider" : entry.name })
190 logger.error(" %s" % e)
191
cbebe191
MT
192 else:
193 logger.info(_("Dynamic DNS update for %(hostname)s (%(provider)s) successful") % \
194 { "hostname" : entry.hostname, "provider" : entry.name })