Merge remote-tracking branch 'stevee/freedns.afraid.org'
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 16 Jun 2014 09:47:33 +0000 (11:47 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 16 Jun 2014 09:47:33 +0000 (11:47 +0200)
Conflicts:
ddns.conf.sample
src/ddns/__init__.py
src/ddns/providers.py

1  2 
ddns.conf.sample
src/ddns/__init__.py
src/ddns/providers.py

  # provider = dtdns.org
  # password = pass
  
 +# [test.dyndns.org]
 +# provider = dnydns.org
 +# username = user
 +# password = pass
 +
+ # [test.freedns.afraid.org]
+ # provider = freedns.afraid.org
+ # token = token
+ # proto = ipv4 OR ipv6
  # [test.no-ip.org]
  # provider = no-ip.com
  # username = user
@@@ -94,7 -94,7 +94,8 @@@ class DDNSCore(object)
                        DDNSProviderDHS,
                        DDNSProviderDNSpark,
                        DDNSProviderDtDNS,
 +                      DDNSProviderDynDNS,
+                       DDNSProviderFreeDNSAfraidOrg,
                        DDNSProviderNOIP,
                        DDNSProviderLightningWireLabs,
                        DDNSProviderSelfhost,
@@@ -258,7 -275,7 +265,6 @@@ class DDNSProviderDtDNS(DDNSProvider)
        # http://www.dtdns.com/dtsite/updatespec
        url = "https://www.dtdns.com/api/autodns.cfm"
  
--
        def update(self):
                data = {
                        "ip" : self.get_address("ipv4"),
                raise DDNSUpdateError
  
  
 -              # Get the full response message.
 -              output = response.read()
 -
 -              # Handle success messages.
 +class DDNSProviderDynDNS(DDNSProvider):
 +      INFO = {
 +              "handle"    : "dyndns.org",
 +              "name"      : "Dyn",
 +              "website"   : "http://dyn.com/dns/",
 +              "protocols" : ["ipv4",]
 +      }
 +
 +      # Information about the format of the request is to be found
 +      # http://http://dyn.com/support/developers/api/perform-update/
 +      # http://dyn.com/support/developers/api/return-codes/
 +      url = "https://members.dyndns.org/nic/update"
 +
 +      def update(self):
 +              data = {
 +                      "hostname" : self.hostname,
 +                      "myip"     : self.get_address("ipv4"),
 +              }
 +
 +              # Send update to the server.
 +              response = self.send_request(self.url, username=self.username, password=self.password,
 +                      data=data)
 +
 +              # Get the full response message.
 +              output = response.read()
 +
 +              # Handle success messages.
 +              if output.startswith("good") or output.startswith("nochg"):
 +                      return
 +
 +              # Handle error codes.
 +              if output == "badauth":
 +                      raise DDNSAuthenticationError
 +              elif output == "aduse":
 +                      raise DDNSAbuseError
 +              elif output == "notfqdn":
 +                      raise DDNSRequestError(_("No valid FQDN was given."))
 +              elif output == "nohost":
 +                      raise DDNSRequestError(_("Specified host does not exist."))
 +              elif output == "911":
 +                      raise DDNSInternalServerError
 +              elif output == "dnserr":
 +                      raise DDNSInternalServerError(_("DNS error encountered."))
 +
 +              # If we got here, some other update error happened.
 +              raise DDNSUpdateError
 +
 +
+ class DDNSProviderFreeDNSAfraidOrg(DDNSProvider):
+       INFO = {
+               "handle"    : "freedns.afraid.org",
+               "name"      : "freedns.afraid.org",
+               "website"   : "http://freedns.afraid.org/",
+               "protocols" : ["ipv6", "ipv4",]
+               }
+       # No information about the request or response could be found on the vendor
+       # 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)
+               data = {
+                       "address" : address,
+               }
+               # Add auth token to the update url.
+               url = "%s?%s" % (self.url, self.token)
+               # Send update to the server.
+               response = self.send_request(url, data=data)
 -              # If we got here, some other update error happened.
 -              raise DDNSUpdateError
 -
+               if output.startswith("Updated") or "has not changed" in output:
+                       return
+               # Handle error codes.
+               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."))
  class DDNSProviderLightningWireLabs(DDNSProvider):
        INFO = {
                "handle"    : "dns.lightningwirelabs.com",