From: Michael Tremer Date: Mon, 16 Jun 2014 15:19:14 +0000 (+0200) Subject: Merge remote-tracking branch 'stevee/no-ip' X-Git-Tag: 001~43 X-Git-Url: http://git.ipfire.org/?p=oddments%2Fddns.git;a=commitdiff_plain;h=313d1a74410e05d9ab659f701af7359237650312;hp=88f39629b6c58aee3bb6825c8dadc1321a7fb70b Merge remote-tracking branch 'stevee/no-ip' --- diff --git a/ddns.conf.sample b/ddns.conf.sample index bb0e839..3d08267 100644 --- a/ddns.conf.sample +++ b/ddns.conf.sample @@ -34,6 +34,11 @@ # username = user # password = pass +# [test.freedns.afraid.org] +# provider = freedns.afraid.org +# token = token +# proto = ipv4 OR ipv6 + # [test.no-ip.org] # provider = no-ip.com # username = user @@ -44,6 +49,11 @@ # username = user # password = pass +# [test.spdns.org] +# provider = spdns.org +# username = user +# password = pass + # [test.lightningwirelabs.com] # provider = dns.lightningwirelabs.com @@ -51,3 +61,9 @@ # token = token # username = user # password = pass + +# [test.variomedia.de] +# provider = variomedia.de +# username = user +# password = pass +# proto = ipv4 OR ipv6 diff --git a/src/ddns/__init__.py b/src/ddns/__init__.py index 5172832..f731887 100644 --- a/src/ddns/__init__.py +++ b/src/ddns/__init__.py @@ -95,9 +95,12 @@ class DDNSCore(object): DDNSProviderDNSpark, DDNSProviderDtDNS, DDNSProviderDynDNS, + DDNSProviderFreeDNSAfraidOrg, DDNSProviderNOIP, DDNSProviderLightningWireLabs, DDNSProviderSelfhost, + DDNSProviderSPDNS, + DDNSProviderVariomedia, ): self.register_provider(provider) diff --git a/src/ddns/providers.py b/src/ddns/providers.py index 7dca932..9eea16d 100644 --- a/src/ddns/providers.py +++ b/src/ddns/providers.py @@ -115,6 +115,13 @@ class DDNSProvider(object): def protocols(self): return self.INFO.get("protocols") + @property + def token(self): + """ + Fast access to the token. + """ + return self.get("token") + def __call__(self, force=False): if force: logger.info(_("Updating %s forced") % self.hostname) @@ -258,7 +265,6 @@ class DDNSProviderDtDNS(DDNSProvider): # http://www.dtdns.com/dtsite/updatespec url = "https://www.dtdns.com/api/autodns.cfm" - def update(self): data = { "ip" : self.get_address("ipv4"), @@ -355,6 +361,45 @@ class DDNSProviderDynDNS(DDNSProvider): raise DDNSUpdateError +class DDNSProviderFreeDNSAfraidOrg(DDNSProvider): + INFO = { + "handle" : "freedns.afraid.org", + "name" : "freedns.afraid.org", + "website" : "http://freedns.afraid.org/", + "protocols" : ["ipv6", "ipv4",] + } + + # No information about the request or response could be found on the vendor + # page. All used values have been collected by testing. + url = "https://freedns.afraid.org/dynamic/update.php" + + @property + def proto(self): + return self.get("proto") + + def update(self): + address = self.get_address(self.proto) + + data = { + "address" : address, + } + + # Add auth token to the update url. + url = "%s?%s" % (self.url, self.token) + + # Send update to the server. + response = self.send_request(url, data=data) + + if output.startswith("Updated") or "has not changed" in output: + return + + # Handle error codes. + if output == "ERROR: Unable to locate this record": + raise DDNSAuthenticationError + elif "is an invalid IP address" in output: + raise DDNSRequestError(_("Invalid IP address has been sent.")) + + class DDNSProviderLightningWireLabs(DDNSProvider): INFO = { "handle" : "dns.lightningwirelabs.com", @@ -367,13 +412,6 @@ class DDNSProviderLightningWireLabs(DDNSProvider): # https://dns.lightningwirelabs.com/knowledge-base/api/ddns url = "https://dns.lightningwirelabs.com/update" - @property - def token(self): - """ - Fast access to the token. - """ - return self.get("token") - def update(self): data = { "hostname" : self.hostname, @@ -470,3 +508,45 @@ class DDNSProviderSelfhost(DDNSProvider): match = re.search("status=20(0|4)", response.read()) if not match: raise DDNSUpdateError + + +class DDNSProviderSPDNS(DDNSProviderDynDNS): + INFO = { + "handle" : "spdns.org", + "name" : "SPDNS", + "website" : "http://spdns.org/", + "protocols" : ["ipv4",] + } + + # Detailed information about request and response codes are provided + # by the vendor. They are using almost the same mechanism and status + # codes as dyndns.org so we can inherit all those stuff. + # + # http://wiki.securepoint.de/index.php/SPDNS_FAQ + # http://wiki.securepoint.de/index.php/SPDNS_Update-Tokens + + url = "https://update.spdns.de/nic/update" + + +class DDNSProviderVariomedia(DDNSProviderDynDNS): + INFO = { + "handle" : "variomedia.de", + "name" : "Variomedia", + "website" : "http://www.variomedia.de/", + "protocols" : ["ipv6", "ipv4",] + } + + # Detailed information about the request can be found here + # https://dyndns.variomedia.de/ + + url = "https://dyndns.variomedia.de/nic/update" + + @property + def proto(self): + return self.get("proto") + + def _prepare_request_data(self): + data = { + "hostname" : self.hostname, + "myip" : self.get_address(self.proto) + } diff --git a/src/ddns/system.py b/src/ddns/system.py index 08df265..baa80a1 100644 --- a/src/ddns/system.py +++ b/src/ddns/system.py @@ -100,7 +100,10 @@ class DDNSSystem(object): query_args = self._format_query_args(data) data = None - url = "%s?%s" % (url, query_args) + if "?" in url: + url = "%s&%s" % (url, query_args) + else: + url = "%s?%s" % (url, query_args) logger.debug("Sending request (%s): %s" % (method, url)) if data: