]>
git.ipfire.org Git - oddments/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?hostname=%(hostname)s&myip=%(address)s"
140 "hostname" : self
.hostname
,
141 "username" : self
.username
,
142 "password" : self
.password
,
143 "address" : self
.get_address("ipv4"),
146 # Send update to the server.
147 response
= self
.send_request(url
)
149 # Get the full response message.
150 output
= response
.read()
152 # Handle success messages.
153 if output
.startswith("good") or output
.startswith("nochg"):
156 # Handle error codes.
157 if output
== "badauth":
158 raise DDNSAuthenticationError
159 elif output
== "aduse":
161 elif output
== "911":
162 raise DDNSInternalServerError
164 # If we got here, some other update error happened.
165 raise DDNSUpdateError
168 class DDNSProviderSelfhost(DDNSProvider
):
170 "handle" : "selfhost.de",
171 "name" : "Selfhost.de",
172 "website" : "http://www.selfhost.de/",
173 "protocols" : ["ipv4",],
176 url
= "https://carol.selfhost.de/update?username=%(username)s&password=%(password)s&textmodi=1"
179 url
= self
.url
% { "username" : self
.username
, "password" : self
.password
}
181 response
= self
.send_request(url
)
183 match
= re
.search("status=20(0|4)", response
.read())
185 raise DDNSUpdateError