From: Carl Mascott Date: Wed, 2 Dec 2020 10:39:20 +0000 (+0100) Subject: DuckDNS: Update to use new API. X-Git-Tag: 014~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ebdb37245e2033b065cce5a19597be4ef1c8875c;p=ddns.git DuckDNS: Update to use new API. The new API supports IPv6 and a token based auth. Reference #12415. Signed-off-by: Stefan Schantl --- diff --git a/src/ddns/providers.py b/src/ddns/providers.py index 46d8a67..a1ca3f3 100644 --- a/src/ddns/providers.py +++ b/src/ddns/providers.py @@ -802,16 +802,62 @@ class DDNSProviderDtDNS(DDNSProvider): raise DDNSUpdateError -class DDNSProviderDuckDNS(DDNSProtocolDynDNS2, DDNSProvider): +class DDNSProviderDuckDNS(DDNSProvider): handle = "duckdns.org" name = "Duck DNS" website = "http://www.duckdns.org/" - protocols = ("ipv4",) + protocols = ("ipv6", "ipv4",) # Information about the format of the request is to be found - # https://www.duckdns.org/install.jsp + # https://www.duckdns.org/spec.jsp + + url = "https://www.duckdns.org/update" + can_remove_records = False + + def update(self): + # Raise an error if no auth details are given. + if not self.token: + raise DDNSConfigurationError + + data = { + "domains" : self.hostname, + "token" : self.token, + } + + # Check if we update an IPv4 address. + address4 = self.get_address("ipv4") + if address4: + data["ip"] = address4 - url = "https://www.duckdns.org/nic/update" + # Check if we update an IPv6 address. + address6 = self.get_address("ipv6") + if address6: + data["ipv6"] = address6 + + # Raise an error if no address is given. + if "ip" not in data and "ipv6" not in data: + raise DDNSConfigurationError + + # Send update to the server. + response = self.send_request(self.url, data=data) + + # Get the full response message. + output = response.read().decode() + + # Remove all leading and trailing whitespace. + output = output.strip() + + # Handle success messages. + if output == "OK": + return + + # The provider does not give detailed information + # if the update fails. Only a "KO" will be sent back. + if output == "KO": + raise DDNSUpdateError + + # If we got here, some other update error happened. + raise DDNSUpdateError class DDNSProviderDyFi(DDNSProtocolDynDNS2, DDNSProvider):