###############################################################################
# #
# ddns - A dynamic DNS client for IPFire #
-# Copyright (C) 2012 IPFire development team #
+# Copyright (C) 2012-2017 IPFire development team #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
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
+ elif output == "badip":
+ raise DDNSBlockedError
# If we got here, some other update error happened.
raise DDNSUpdateError(_("Server response: %s") % output)
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 DDNSProviderDyFi(DDNSProtocolDynDNS2, DDNSProvider):
+ handle = "dy.fi"
+ name = "dy.fi"
+ website = "https://www.dy.fi/"
+ protocols = ("ipv4",)
+
+ # Information about the format of the request is to be found
+ # https://www.dy.fi/page/clients?lang=en
+ # https://www.dy.fi/page/specification?lang=en
+
+ url = "http://www.dy.fi/nic/update"
+
+ # Please only send automatic updates when your IP address changes,
+ # or once per 5 to 6 days to refresh the address mapping (they will
+ # expire if not refreshed within 7 days).
+ holdoff_days = 6
+
+
class DDNSProviderDynDNS(DDNSProtocolDynDNS2, DDNSProvider):
handle = "dyndns.org"
name = "Dyn"
url = "https://members.dyndns.org/nic/update"
+class DDNSProviderDomainOffensive(DDNSProtocolDynDNS2, DDNSProvider):
+ handle = "do.de"
+ name = "Domain-Offensive"
+ website = "https://www.do.de/"
+ protocols = ("ipv6", "ipv4")
+
+ # Detailed information about the request and response codes
+ # are available on the providers webpage.
+ # https://www.do.de/wiki/FlexDNS_-_Entwickler
+
+ url = "https://ddns.do.de/"
+
+
class DDNSProviderDynU(DDNSProtocolDynDNS2, DDNSProvider):
handle = "dynu.com"
name = "Dynu"
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
+class DDNSProviderItsdns(DDNSProtocolDynDNS2, DDNSProvider):
+ handle = "itsdns.de"
+ name = "it's DNS"
+ website = "http://www.itsdns.de/"
+ protocols = ("ipv6", "ipv4")
+
+ # Information about the format of the HTTP request is to be found
+ # here: https://www.itsdns.de/dynupdatehelp.htm
+
+ url = "https://www.itsdns.de/update.php"
+
+
class DDNSProviderJoker(DDNSProtocolDynDNS2, DDNSProvider):
handle = "joker.com"
name = "Joker.com Dynamic DNS"
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
return data
+class DDNSProviderNowDNS(DDNSProtocolDynDNS2, DDNSProvider):
+ handle = "now-dns.com"
+ name = "NOW-DNS"
+ website = "http://now-dns.com/"
+ protocols = ("ipv6", "ipv4")
+
+ # Information about the format of the request is to be found
+ # but only can be accessed by register an account and login
+ # https://now-dns.com/?m=api
+
+ url = "https://now-dns.com/update"
+
+
class DDNSProviderNsupdateINFO(DDNSProtocolDynDNS2, DDNSProvider):
handle = "nsupdate.info"
name = "nsupdate.info"
# 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
raise DDNSUpdateError
+class DDNSProviderSchokokeksDNS(DDNSProtocolDynDNS2, DDNSProvider):
+ handle = "schokokeks.org"
+ name = "Schokokeks"
+ website = "http://www.schokokeks.org/"
+ protocols = ("ipv4",)
+
+ # Information about the format of the request is to be found
+ # https://wiki.schokokeks.org/DynDNS
+ url = "https://dyndns.schokokeks.org/nic/update"
+
+
class DDNSProviderSelfhost(DDNSProtocolDynDNS2, DDNSProvider):
handle = "selfhost.de"
name = "Selfhost.de"
return data
+class DDNSProviderServercow(DDNSProvider):
+ handle = "servercow.de"
+ name = "servercow.de"
+ website = "https://servercow.de/"
+ protocols = ("ipv4", "ipv6")
+
+ url = "https://www.servercow.de/dnsupdate/update.php"
+ can_remove_records = False
+
+ def update_protocol(self, proto):
+ data = {
+ "ipaddr" : self.get_address(proto),
+ "hostname" : self.hostname,
+ "username" : self.username,
+ "pass" : self.password,
+ }
+
+ # Send request to provider
+ response = self.send_request(self.url, data=data)
+
+ # Read response
+ output = response.read()
+
+ # Server responds with OK if update was successful
+ if output.startswith("OK"):
+ return
+
+ # Catch any errors
+ elif output.startswith("FAILED - Authentication failed"):
+ raise DDNSAuthenticationError
+
+ # If we got here, some other update error happened
+ raise DDNSUpdateError(output)
+
+
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