###############################################################################
# #
# 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 #
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)
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 DDNSProviderDynUp(DDNSProvider):
+ handle = "dynup.de"
+ name = "DynUp.DE"
+ website = "http://dynup.de/"
+ protocols = ("ipv4",)
+
+ # Information about the format of the HTTPS request is to be found
+ # https://dyndnsfree.de/user/hilfe.php
+
+ url = "https://dynup.de/dyn.php"
+ can_remove_records = False
+
+ def update_protocol(self, proto):
+ data = {
+ "username" : self.username,
+ "password" : self.password,
+ "hostname" : self.hostname,
+ "print" : '1',
+ }
+
+ # Send update to the server.
+ response = self.send_request(self.url, data=data)
+
+ # Get the full response message.
+ output = response.read()
+
+ # Remove all leading and trailing whitespace.
+ output = output.strip()
+
+ # Handle success messages.
+ if output.startswith("I:OK") :
+ return
+
+ # If we got here, some other update error happened.
+ raise DDNSUpdateError
+
+
+
class DDNSProviderDynU(DDNSProtocolDynDNS2, DDNSProvider):
handle = "dynu.com"
name = "Dynu"
raise DDNSInternalServerError
# If we got here, some other update error happened.
- raise DDNSUpdateError(_("Server response: %s") % output)
+ raise DDNSUpdateError(_("Server response: %s") % output)
class DDNSProviderEnomCom(DDNSResponseParserXML, DDNSProvider):
raise DDNSUpdateError
+class DDNSProviderItsdns(DDNSProtocolDynDNS2, DDNSProvider):
+ handle = "inwx.com"
+ name = "INWX"
+ website = "https://www.inwx.com"
+ protocols = ("ipv6", "ipv4")
+
+ # Information about the format of the HTTP request is to be found
+ # here: https://www.inwx.com/en/nameserver2/dyndns (requires login)
+ # Notice: The URL is the same for: inwx.com|de|at|ch|es
+
+ url = "https://dyndns.inwx.com/nic/update"
+
+
+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"
class DDNSProviderNOIP(DDNSProtocolDynDNS2, DDNSProvider):
- handle = "no-ip.com"
- name = "No-IP"
- website = "http://www.no-ip.com/"
+ handle = "noip.com"
+ name = "NoIP"
+ website = "http://www.noip.com/"
protocols = ("ipv4",)
# Information about the format of the HTTP request is to be found
- # here: http://www.no-ip.com/integrate/request and
- # here: http://www.no-ip.com/integrate/response
+ # here: http://www.noip.com/integrate/request and
+ # here: http://www.noip.com/integrate/response
- url = "http://dynupdate.no-ip.com/nic/update"
+ url = "http://dynupdate.noip.com/nic/update"
def prepare_request_data(self, proto):
assert proto == "ipv4"
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 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):