elif output == "abuse":
raise DDNSAbuseError
elif output == "notfqdn":
- raise DDNSRequestError(_("No valid FQDN was given."))
+ raise DDNSRequestError(_("No valid FQDN was given"))
elif output == "nohost":
- raise DDNSRequestError(_("Specified host does not exist."))
+ raise DDNSRequestError(_("Specified host does not exist"))
elif output == "911":
raise DDNSInternalServerError
elif output == "dnserr":
- raise DDNSInternalServerError(_("DNS error encountered."))
+ raise DDNSInternalServerError(_("DNS error encountered"))
elif output == "badagent":
raise DDNSBlockedError
raise DDNSUpdateError(_("Server response: %s") % output)
+class DDNSProviderDesecIO(DDNSProtocolDynDNS2, DDNSProvider):
+ handle = "desec.io"
+ name = "desec.io"
+ website = "https://www.desec.io"
+ protocols = ("ipv6", "ipv4",)
+
+ # ipv4 / ipv6 records are automatically removed when the update
+ # request originates from the respectively other protocol and no
+ # address is explicitly provided for the unused protocol.
+
+ url = "https://update.dedyn.io"
+
+ # desec.io sends the IPv6 and IPv4 address in one request
+
+ def update(self):
+ data = DDNSProtocolDynDNS2.prepare_request_data(self, "ipv4")
+
+ # This one supports IPv6
+ myipv6 = self.get_address("ipv6")
+
+ # Add update information if we have an IPv6 address.
+ if myipv6:
+ data["myipv6"] = myipv6
+
+ self.send_request(data)
+
+
class DDNSProviderDDNSS(DDNSProvider):
handle = "ddnss.de"
name = "DDNSS"
if output == "badauth":
raise DDNSAuthenticationError
elif output == "notfqdn":
- raise DDNSRequestError(_("No valid FQDN was given."))
+ raise DDNSRequestError(_("No valid FQDN was given"))
elif output == "nohost":
- raise DDNSRequestError(_("Specified host does not exist."))
+ raise DDNSRequestError(_("Specified host does not exist"))
elif output == "911":
raise DDNSInternalServerError
elif output == "dnserr":
- raise DDNSInternalServerError(_("DNS error encountered."))
+ raise DDNSInternalServerError(_("DNS error encountered"))
elif output == "disabled":
- raise DDNSRequestError(_("Account disabled or locked."))
+ raise DDNSRequestError(_("Account disabled or locked"))
# If we got here, some other update error happened.
raise DDNSUpdateError
elif output == "blocked":
raise DDNSBlockedError
elif output == "nofqdn":
- raise DDNSRequestError(_("No valid FQDN was given."))
+ raise DDNSRequestError(_("No valid FQDN was given"))
elif output == "nohost":
- raise DDNSRequestError(_("Invalid hostname specified."))
+ raise DDNSRequestError(_("Invalid hostname specified"))
elif output == "notdyn":
- raise DDNSRequestError(_("Hostname not marked as a dynamic host."))
+ raise DDNSRequestError(_("Hostname not marked as a dynamic host"))
elif output == "invalid":
- raise DDNSRequestError(_("Invalid IP address has been sent."))
+ raise DDNSRequestError(_("Invalid IP address has been sent"))
# If we got here, some other update error happened.
raise DDNSUpdateError
# Handle error codes.
if output == "No hostname to update was supplied.":
- raise DDNSRequestError(_("No hostname specified."))
+ raise DDNSRequestError(_("No hostname specified"))
elif output == "The hostname you supplied is not valid.":
- raise DDNSRequestError(_("Invalid hostname specified."))
+ raise DDNSRequestError(_("Invalid hostname specified"))
elif output == "The password you supplied is not valid.":
raise DDNSAuthenticationError
elif output == "Administration has disabled this account.":
- raise DDNSRequestError(_("Account has been disabled."))
+ raise DDNSRequestError(_("Account has been disabled"))
elif output == "Illegal character in IP.":
- raise DDNSRequestError(_("Invalid IP address has been sent."))
+ raise DDNSRequestError(_("Invalid IP address has been sent"))
elif output == "Too many failed requests.":
- raise DDNSRequestError(_("Too many failed requests."))
+ raise DDNSRequestError(_("Too many failed requests"))
# If we got here, some other update error happened.
raise DDNSUpdateError
+class DDNSProviderDuckDNS(DDNSProtocolDynDNS2, DDNSProvider):
+ handle = "duckdns.org"
+ name = "Duck DNS"
+ website = "http://www.duckdns.org/"
+ protocols = ("ipv4",)
+
+ # Information about the format of the request is to be found
+ # https://www.duckdns.org/install.jsp
+
+ url = "https://www.duckdns.org/nic/update"
+
+
class DDNSProviderDynDNS(DDNSProtocolDynDNS2, DDNSProvider):
handle = "dyndns.org"
name = "Dyn"
raise DDNSAuthenticationError
elif output.startswith("NOSERVICE"):
- raise DDNSRequestError(_("Dynamic DNS is not turned on for this domain."))
+ raise DDNSRequestError(_("Dynamic DNS is not turned on for this domain"))
elif output.startswith("ILLEGAL INPUT"):
- raise DDNSRequestError(_("Invalid data has been sent."))
+ raise DDNSRequestError(_("Invalid data has been sent"))
elif output.startswith("TOOSOON"):
- raise DDNSRequestError(_("Too frequent update requests have been sent."))
+ raise DDNSRequestError(_("Too frequent update requests have been sent"))
# If we got here, some other update error happened.
raise DDNSUpdateError
# Handle error codes.
if output.startswith("400"):
- raise DDNSRequestError(_("Malformed request has been sent."))
+ raise DDNSRequestError(_("Malformed request has been sent"))
elif output.startswith("401"):
raise DDNSAuthenticationError
elif output.startswith("402"):
- raise DDNSRequestError(_("Too frequent update requests have been sent."))
+ raise DDNSRequestError(_("Too frequent update requests have been sent"))
elif output.startswith("403"):
raise DDNSInternalServerError
if errorcode == "304155":
raise DDNSAuthenticationError
elif errorcode == "304153":
- raise DDNSRequestError(_("Domain not found."))
+ raise DDNSRequestError(_("Domain not found"))
# If we got here, some other update error happened.
raise DDNSUpdateError
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."))
+ raise DDNSRequestError(_("Invalid IP address has been sent"))
# If we got here, some other update error happened.
raise DDNSUpdateError
if errorcode == "304156":
raise DDNSAuthenticationError
elif errorcode == "316153":
- raise DDNSRequestError(_("Domain not found."))
+ raise DDNSRequestError(_("Domain not found"))
elif errorcode == "316154":
- raise DDNSRequestError(_("Domain not active."))
+ raise DDNSRequestError(_("Domain not active"))
elif errorcode in ("380098", "380099"):
raise DDNSInternalServerError
# Raise an error if no token and no useranem and password
# are given.
elif not self.username and not self.password:
- raise DDNSConfigurationError(_("No Auth details specified."))
+ raise DDNSConfigurationError(_("No Auth details specified"))
# HTTP Basic Auth is only allowed if no token is used.
if self.token:
if "401" or "402" in output:
raise DDNSAuthenticationError
elif "408" in output:
- raise DDNSRequestError(_("Invalid IPv4 address has been sent."))
+ raise DDNSRequestError(_("Invalid IPv4 address has been sent"))
elif "409" in output:
- raise DDNSRequestError(_("Invalid IPv6 address has been sent."))
+ raise DDNSRequestError(_("Invalid IPv6 address has been sent"))
elif "412" in output:
- raise DDNSRequestError(_("No valid FQDN was given."))
+ raise DDNSRequestError(_("No valid FQDN was given"))
elif "414" in output:
raise DDNSInternalServerError
class DDNSProviderSPDNS(DDNSProtocolDynDNS2, DDNSProvider):
handle = "spdns.org"
- name = "SPDNS"
- website = "http://spdns.org/"
+ name = "SPDYN"
+ website = "https://www.spdyn.de/"
# Detailed information about request and response codes are provided
# by the vendor. They are using almost the same mechanism and status
# http://wiki.securepoint.de/index.php/SPDNS_FAQ
# http://wiki.securepoint.de/index.php/SPDNS_Update-Tokens
- url = "https://update.spdns.de/nic/update"
+ url = "https://update.spdyn.de/nic/update"
@property
def username(self):
if output.startswith("invalid login"):
raise DDNSAuthenticationError
elif output.startswith("<ERROR CODE=\"704\""):
- raise DDNSRequestError(_("No valid FQDN was given."))
+ raise DDNSRequestError(_("No valid FQDN was given"))
elif output.startswith("<ERROR CODE=\"702\""):
- raise DDNSInternalServerError
+ raise DDNSRequestError(_("Too frequent update requests have been sent"))
# If we got here, some other update error happened.
raise DDNSUpdateError
# Handle error codes.
if output.startswith("error-auth-suspend"):
- raise DDNSRequestError(_("Account has been suspended."))
+ raise DDNSRequestError(_("Account has been suspended"))
elif output.startswith("error-auth-voided"):
- raise DDNSRequestError(_("Account has been revoked."))
+ raise DDNSRequestError(_("Account has been revoked"))
elif output.startswith("error-record-invalid"):
- raise DDNSRequestError(_("Specified host does not exist."))
+ raise DDNSRequestError(_("Specified host does not exist"))
elif output.startswith("error-auth"):
raise DDNSAuthenticationError