]>
git.ipfire.org Git - ddns.git/blob - ddns/providers.py
2 ###############################################################################
4 # ddns - A dynamic DNS client for IPFire #
5 # Copyright (C) 2012 IPFire development team #
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. #
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. #
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/>. #
20 ###############################################################################
22 # Import all possible exception types.
25 class DDNSProvider(object):
27 # A short string that uniquely identifies
31 # The full name of the provider.
34 # A weburl to the homepage of the provider.
35 # (Where to register a new account?)
38 # A list of supported protocols.
39 "protocols" : ["ipv6", "ipv4"],
44 def __init__(self
, core
, **settings
):
47 # Copy a set of default settings and
48 # update them by those from the configuration file.
49 self
.settings
= self
.DEFAULT_SETTINGS
.copy()
50 self
.settings
.update(settings
)
53 return "<DDNS Provider %s (%s)>" % (self
.name
, self
.handle
)
55 def __cmp__(self
, other
):
56 return cmp(self
.hostname
, other
.hostname
)
61 Returns the name of the provider.
63 return self
.INFO
.get("name")
68 Returns the website URL of the provider
69 or None if that is not available.
71 return self
.INFO
.get("website", None)
76 Returns the handle of this provider.
78 return self
.INFO
.get("handle")
80 def get(self
, key
, default
=None):
82 Get a setting from the settings dictionary.
84 return self
.settings
.get(key
, default
)
89 Fast access to the hostname.
91 return self
.get("hostname")
96 Fast access to the username.
98 return self
.get("username")
103 Fast access to the password.
105 return self
.get("password")
108 raise NotImplementedError
110 def send_request(self
, *args
, **kwargs
):
112 Proxy connection to the send request
115 return self
.core
.system
.send_request(*args
, **kwargs
)
117 def get_address(self
, proto
):
119 Proxy method to get the current IP address.
121 return self
.core
.system
.get_address(proto
)
124 class DDNSProviderNOIP(DDNSProvider
):
126 "handle" : "no-ip.com",
128 "website" : "http://www.no-ip.com/",
129 "protocols" : ["ipv4",]
132 # Information about the format of the HTTP request is to be found
133 # here: http://www.no-ip.com/integrate/request and
134 # here: http://www.no-ip.com/integrate/response
136 url
= "http://%(username)s:%(password)s@dynupdate.no-ip.com/nic/update"
140 "username" : self
.username
,
141 "password" : self
.password
,
145 "hostname" : self
.hostname
,
146 "address" : self
.get_address("ipv4"),
149 # Send update to the server.
150 response
= self
.send_request(url
, data
=data
)
152 # Get the full response message.
153 output
= response
.read()
155 # Handle success messages.
156 if output
.startswith("good") or output
.startswith("nochg"):
159 # Handle error codes.
160 if output
== "badauth":
161 raise DDNSAuthenticationError
162 elif output
== "aduse":
164 elif output
== "911":
165 raise DDNSInternalServerError
167 # If we got here, some other update error happened.
168 raise DDNSUpdateError
171 class DDNSProviderSelfhost(DDNSProvider
):
173 "handle" : "selfhost.de",
174 "name" : "Selfhost.de",
175 "website" : "http://www.selfhost.de/",
176 "protocols" : ["ipv4",],
179 url
= "https://carol.selfhost.de/update"
183 "username" : self
.username
,
184 "password" : self
.password
,
188 response
= self
.send_request(self
.url
, data
=data
)
190 match
= re
.search("status=20(0|4)", response
.read())
192 raise DDNSUpdateError