Configuring this by the user does not make much sense
and makes configuration more complicated.
The update() method now will call update_protocol()
for IPv6 and IPv4 (if both are supported) and execute
an update for each protocol individually.
# [test.freedns.afraid.org]
# provider = freedns.afraid.org
# token = token
# [test.freedns.afraid.org]
# provider = freedns.afraid.org
# token = token
# [test.namecheap.com]
# provider = namecheap.com
# [test.namecheap.com]
# provider = namecheap.com
# [test.nsupdate.info]
# provider = nsupdate.info
# secret = secret
# [test.nsupdate.info]
# provider = nsupdate.info
# secret = secret
# [test.opendns.com]
# handle = opendns.com
# username = user
# password = pass
# [test.opendns.com]
# handle = opendns.com
# username = user
# password = pass
# [test.ovh.com]
# provider = ovh.com
# [test.ovh.com]
# provider = ovh.com
# provider = variomedia.de
# username = user
# password = pass
# provider = variomedia.de
# username = user
# password = pass
# [test.zoneedit.com]
# provider = zoneedit.com
# username = user
# password = pass
# [test.zoneedit.com]
# provider = zoneedit.com
# username = user
# password = pass
# [test.zzzz.io]
# provider = zzzz.io
# [test.zzzz.io]
# provider = zzzz.io
{ "hostname" : self.hostname, "provider" : self.name })
def update(self):
{ "hostname" : self.hostname, "provider" : self.name })
def update(self):
+ for protocol in self.protocols:
+ if self.have_address(protocol):
+ self.update_protocol(protocol)
+ else:
+ self.remove_protocol(protocol)
+
+ def update_protocol(self, proto):
raise NotImplementedError
raise NotImplementedError
+ def remove_protocol(self, proto):
+ logger.warning(_("%(hostname)s current resolves to an IP address"
+ " of the %(proto)s protocol which could not be removed by ddns") % \
+ { "hostname" : self.hostname, "proto" : proto })
+
+ # Maybe this will raise NotImplementedError at some time
+ #raise NotImplementedError
+
def is_uptodate(self, protos):
"""
Returns True if this host is already up to date
def is_uptodate(self, protos):
"""
Returns True if this host is already up to date
"""
return self.core.system.get_address(proto) or default
"""
return self.core.system.get_address(proto) or default
+ def have_address(self, proto):
+ """
+ Returns True if an IP address for the given protocol
+ is known and usable.
+ """
+ address = self.get_address(proto)
+
+ if address:
+ return True
+
+ return False
+
class DDNSProtocolDynDNS2(object):
"""
class DDNSProtocolDynDNS2(object):
"""
# http://dyn.com/support/developers/api/perform-update/
# http://dyn.com/support/developers/api/return-codes/
# http://dyn.com/support/developers/api/perform-update/
# http://dyn.com/support/developers/api/return-codes/
- def _prepare_request_data(self):
+ def prepare_request_data(self, proto):
data = {
"hostname" : self.hostname,
data = {
"hostname" : self.hostname,
- "myip" : self.get_address("ipv4"),
+ "myip" : self.get_address(proto),
- def update(self):
- data = self._prepare_request_data()
+ def update_protocol(self, proto):
+ data = self.prepare_request_data(proto)
+
+ return self.send_request(data)
+ def send_request(self, data):
# Send update to the server.
# Send update to the server.
- response = self.send_request(self.url, data=data,
+ response = DDNSProvider.send_request(self, self.url, data=data,
username=self.username, password=self.password)
# Get the full response message.
username=self.username, password=self.password)
# Get the full response message.
url = "http://members.dhs.org/nic/hosts"
url = "http://members.dhs.org/nic/hosts"
+ def update_protocol(self, proto):
data = {
"domain" : self.hostname,
data = {
"domain" : self.hostname,
- "ip" : self.get_address("ipv4"),
+ "ip" : self.get_address(proto),
"hostcmd" : "edit",
"hostcmdstage" : "2",
"type" : "4",
"hostcmd" : "edit",
"hostcmdstage" : "2",
"type" : "4",
url = "https://control.dnspark.com/api/dynamic/update.php"
url = "https://control.dnspark.com/api/dynamic/update.php"
+ def update_protocol(self, proto):
data = {
"domain" : self.hostname,
data = {
"domain" : self.hostname,
- "ip" : self.get_address("ipv4"),
+ "ip" : self.get_address(proto),
}
# Send update to the server.
}
# Send update to the server.
url = "https://www.dtdns.com/api/autodns.cfm"
url = "https://www.dtdns.com/api/autodns.cfm"
+ def update_protocol(self, proto):
- "ip" : self.get_address("ipv4"),
+ "ip" : self.get_address(proto),
"id" : self.hostname,
"pw" : self.password
}
"id" : self.hostname,
"pw" : self.password
}
url = "https://api.dynu.com/nic/update"
url = "https://api.dynu.com/nic/update"
- def _prepare_request_data(self):
- data = DDNSProtocolDynDNS2._prepare_request_data(self)
+ # DynU 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")
# This one supports IPv6
myipv6 = self.get_address("ipv6")
if myipv6:
data["myipv6"] = myipv6
if myipv6:
data["myipv6"] = myipv6
+ self._send_request(data)
class DDNSProviderEasyDNS(DDNSProtocolDynDNS2, DDNSProvider):
class DDNSProviderEasyDNS(DDNSProtocolDynDNS2, DDNSProvider):
url = "http://www.dyns.net/postscript011.php"
url = "http://www.dyns.net/postscript011.php"
+ def update_protocol(self, proto):
- "ip" : self.get_address("ipv4"),
+ "ip" : self.get_address(proto),
"host" : self.hostname,
"username" : self.username,
"password" : self.password,
"host" : self.hostname,
"username" : self.username,
"password" : self.password,
handle = "enom.com"
name = "eNom Inc."
website = "http://www.enom.com/"
handle = "enom.com"
name = "eNom Inc."
website = "http://www.enom.com/"
# There are very detailed information about how to send an update request and
# the respone codes.
# There are very detailed information about how to send an update request and
# the respone codes.
url = "https://dynamic.name-services.com/interface.asp"
url = "https://dynamic.name-services.com/interface.asp"
+ def update_protocol(self, proto):
data = {
"command" : "setdnshost",
"responsetype" : "xml",
data = {
"command" : "setdnshost",
"responsetype" : "xml",
- "address" : self.get_address("ipv4"),
+ "address" : self.get_address(proto),
"domainpassword" : self.password,
"zone" : self.hostname
}
"domainpassword" : self.password,
"zone" : self.hostname
}
# here: https://entrydns.net/help
url = "https://entrydns.net/records/modify"
# here: https://entrydns.net/help
url = "https://entrydns.net/records/modify"
+ def update_protocol(self, proto):
- "ip" : self.get_address("ipv4")
+ "ip" : self.get_address(proto),
}
# Add auth token to the update url.
}
# Add auth token to the update url.
# page. All used values have been collected by testing.
url = "https://freedns.afraid.org/dynamic/update.php"
# 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)
-
+ def update_protocol(self, proto):
+ "address" : self.get_address(proto),
}
# Add auth token to the update url.
}
# Add auth token to the update url.
url = "https://dynamicdns.park-your-domain.com/update"
url = "https://dynamicdns.park-your-domain.com/update"
+ def update_protocol(self, proto):
# Namecheap requires the hostname splitted into a host and domain part.
host, domain = self.hostname.split(".", 1)
data = {
# Namecheap requires the hostname splitted into a host and domain part.
host, domain = self.hostname.split(".", 1)
data = {
- "ip" : self.get_address("ipv4"),
+ "ip" : self.get_address(proto),
"password" : self.password,
"host" : host,
"domain" : domain
"password" : self.password,
"host" : host,
"domain" : domain
output = response.read()
# Handle success messages.
output = response.read()
# Handle success messages.
- if self.get_xml_tag_value(output, "IP") == self.get_address("ipv4"):
+ if self.get_xml_tag_value(output, "IP") == address:
return
# Handle error codes.
return
# Handle error codes.
url = "http://dynupdate.no-ip.com/nic/update"
url = "http://dynupdate.no-ip.com/nic/update"
- def _prepare_request_data(self):
+ def prepare_request_data(self, proto):
+ assert proto == "ipv4"
+
data = {
"hostname" : self.hostname,
data = {
"hostname" : self.hostname,
- "address" : self.get_address("ipv4"),
+ "address" : self.get_address(proto),
def password(self):
return self.get("secret")
def password(self):
return self.get("secret")
- @property
- def proto(self):
- return self.get("proto")
-
@property
def url(self):
# The update URL is different by the used protocol.
@property
def url(self):
# The update URL is different by the used protocol.
else:
raise DDNSUpdateError(_("Invalid protocol has been given"))
else:
raise DDNSUpdateError(_("Invalid protocol has been given"))
- def _prepare_request_data(self):
+ def prepare_request_data(self, proto):
- "myip" : self.get_address(self.proto),
+ "myip" : self.get_address(proto),
url = "https://updates.opendns.com/nic/update"
url = "https://updates.opendns.com/nic/update"
- @property
- def proto(self):
- return self.get("proto")
-
- def _prepare_request_data(self):
+ def prepare_request_data(self, proto):
data = {
"hostname" : self.hostname,
data = {
"hostname" : self.hostname,
- "myip" : self.get_address(self.proto)
+ "myip" : self.get_address(proto),
url = "https://www.ovh.com/nic/update"
url = "https://www.ovh.com/nic/update"
- def _prepare_request_data(self):
- data = DDNSProtocolDynDNS2._prepare_request_data(self)
+ def prepare_request_data(self, proto):
+ data = DDNSProtocolDynDNS2.prepare_request_data(self, proto)
data.update({
"system" : "dyndns",
})
data.update({
"system" : "dyndns",
})
url = "https://carol.selfhost.de/nic/update"
url = "https://carol.selfhost.de/nic/update"
- def _prepare_request_data(self):
- data = DDNSProtocolDynDNS2._prepare_request_data(self)
+ def prepare_request_data(self, proto):
+ data = DDNSProtocolDynDNS2.prepare_request_data(self, proto)
data.update({
"hostname" : "1",
})
data.update({
"hostname" : "1",
})
url = "https://update.twodns.de/update"
url = "https://update.twodns.de/update"
- def _prepare_request_data(self):
+ def prepare_request_data(self, proto):
+ assert proto == "ipv4"
+
- "ip" : self.get_address("ipv4"),
+ "ip" : self.get_address(proto),
"hostname" : self.hostname
}
"hostname" : self.hostname
}
url = "https://dyndns.variomedia.de/nic/update"
url = "https://dyndns.variomedia.de/nic/update"
- @property
- def proto(self):
- return self.get("proto")
-
- def _prepare_request_data(self):
+ def prepare_request_data(self, proto):
data = {
"hostname" : self.hostname,
data = {
"hostname" : self.hostname,
- "myip" : self.get_address(self.proto)
+ "myip" : self.get_address(proto),
url = "https://dynamic.zoneedit.com/auth/dynamic.html"
url = "https://dynamic.zoneedit.com/auth/dynamic.html"
- @property
- def proto(self):
- return self.get("proto")
-
- def update(self):
+ def update_protocol(self, proto):
- "dnsto" : self.get_address(self.proto),
+ "dnsto" : self.get_address(proto),
url = "https://zzzz.io/api/v1/update"
url = "https://zzzz.io/api/v1/update"
- def update(self):
- for protocol in self.protocols:
- address = self.get_address(protocol)
-
- if address:
- self.update_for_protocol(protocol, address)
-
- def update_for_protocol(self, proto, address):
+ def update_protocol(self, proto):
+ "ip" : self.get_address(proto),