]> git.ipfire.org Git - oddments/ddns.git/commitdiff
Merge remote-tracking branch 'stevee/nsupdate.info'
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 9 Jul 2014 18:58:15 +0000 (18:58 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 9 Jul 2014 18:58:15 +0000 (18:58 +0000)
1  2 
README
ddns.conf.sample
src/ddns/providers.py

diff --combined README
index 6179325736daf0a40105a8589f98eeaf55e1db21,c071b791f69708aa61b75263f8e09be4c3d2e1f8..6002c1912ea25a2acfb3a0b15407e3a1bf6096b4
--- 1/README
--- 2/README
+++ b/README
@@@ -56,10 -56,10 +56,11 @@@ SUPPORTED PROVIDERS
        dyndns.org
        dynu.com
        easydns.com
 +      enom.com
        freedns.afraid.org
        namecheap.com
        no-ip.com
+       nsupdate.info
        ovh.com
        regfish.com
        selfhost.de
diff --combined ddns.conf.sample
index 88cfaedfa6daf9e5f07e522339cfa3284c65da64,ecd4eae21331f18be4cca21a9c19af6212ff3d3b..cc7f25b5fb168f6a65b08d47eae426cb0a8d5115
  # username = user
  # password = pass
  
 +# [test.enom.com]
 +# provider = enom.com
 +# username = user
 +# password = pass
 +
  # [test.freedns.afraid.org]
  # provider = freedns.afraid.org
  # token = token
  # username = user
  # password = pass
  
+ # [test.nsupdate.info]
+ # provider = nsupdate.info
+ # secret = secret
+ # proto = ipv4 OR ipv6
  # [test.ovh.com]
  # provider = ovh.com
  # username = user
diff --combined src/ddns/providers.py
index 4467651fbbed3511a6e7f4cf186e5b00a4400d0b,0c735fc6a41c18fe49f487a0e394c87f31c277b1..c37e62510b74180f5bbeba8794e7c32fec0f9187
@@@ -225,35 -225,6 +225,35 @@@ class DDNSProtocolDynDNS2(object)
                raise DDNSUpdateError(_("Server response: %s") % output)
  
  
 +class DDNSResponseParserXML(object):
 +      """
 +              This class provides a parser for XML responses which
 +              will be sent by various providers. This class uses the python
 +              shipped XML minidom module to walk through the XML tree and return
 +              a requested element.
 +        """
 +
 +      def get_xml_tag_value(self, document, content):
 +              # Send input to the parser.
 +              xmldoc = xml.dom.minidom.parseString(document)
 +
 +              # Get XML elements by the given content.
 +              element = xmldoc.getElementsByTagName(content)
 +
 +              # If no element has been found, we directly can return None.
 +              if not element:
 +                      return None
 +
 +              # Only get the first child from an element, even there are more than one.
 +              firstchild = element[0].firstChild
 +
 +              # Get the value of the child.
 +              value = firstchild.nodeValue
 +
 +              # Return the value.
 +              return value
 +
 +
  class DDNSProviderAllInkl(DDNSProvider):
        handle    = "all-inkl.com"
        name      = "All-inkl.com"
@@@ -532,48 -503,6 +532,48 @@@ class DDNSProviderEasyDNS(DDNSProtocolD
        url = "http://api.cp.easydns.com/dyn/tomato.php"
  
  
 +class DDNSProviderEnomCom(DDNSResponseParserXML, DDNSProvider):
 +      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.
 +      # http://www.enom.com/APICommandCatalog/
 +
 +      url = "https://dynamic.name-services.com/interface.asp"
 +
 +      def update(self):
 +              data = {
 +                      "command"        : "setdnshost",
 +                      "responsetype"   : "xml",
 +                      "address"        : self.get_address("ipv4"),
 +                      "domainpassword" : self.password,
 +                      "zone"           : self.hostname
 +              }
 +
 +              # Send update to the server.
 +              response = self.send_request(self.url, data=data)
 +
 +              # Get the full response message.
 +              output = response.read()
 +
 +              # Handle success messages.
 +              if self.get_xml_tag_value(output, "ErrCount") == "0":
 +                      return
 +
 +              # Handle error codes.
 +              errorcode = self.get_xml_tag_value(output, "ResponseNumber")
 +
 +              if errorcode == "304155":
 +                      raise DDNSAuthenticationError
 +              elif errorcode == "304153":
 +                      raise DDNSRequestError(_("Domain not found."))
 +
 +              # If we got here, some other update error happened.
 +              raise DDNSUpdateError
 +
 +
  class DDNSProviderFreeDNSAfraidOrg(DDNSProvider):
        handle    = "freedns.afraid.org"
        name      = "freedns.afraid.org"
@@@ -656,7 -585,7 +656,7 @@@ class DDNSProviderLightningWireLabs(DDN
                raise DDNSUpdateError
  
  
 -class DDNSProviderNamecheap(DDNSProvider):
 +class DDNSProviderNamecheap(DDNSResponseParserXML, DDNSProvider):
        handle    = "namecheap.com"
        name      = "Namecheap"
        website   = "http://namecheap.com"
  
        url = "https://dynamicdns.park-your-domain.com/update"
  
 -      def parse_xml(self, document, content):
 -              # Send input to the parser.
 -              xmldoc = xml.dom.minidom.parseString(document)
 -
 -              # Get XML elements by the given content.
 -              element = xmldoc.getElementsByTagName(content)
 -
 -              # If no element has been found, we directly can return None.
 -              if not element:
 -                      return None
 -
 -              # Only get the first child from an element, even there are more than one.
 -              firstchild = element[0].firstChild
 -
 -              # Get the value of the child.
 -              value = firstchild.nodeValue
 -
 -              # Return the value.
 -              return value
 -              
        def update(self):
                # Namecheap requires the hostname splitted into a host and domain part.
                host, domain = self.hostname.split(".", 1)
                output = response.read()
  
                # Handle success messages.
 -              if self.parse_xml(output, "IP") == self.get_address("ipv4"):
 +              if self.get_xml_tag_value(output, "IP") == self.get_address("ipv4"):
                        return
  
                # Handle error codes.
 -              errorcode = self.parse_xml(output, "ResponseNumber")
 +              errorcode = self.get_xml_tag_value(output, "ResponseNumber")
  
                if errorcode == "304156":
                        raise DDNSAuthenticationError
@@@ -726,6 -675,48 +726,48 @@@ class DDNSProviderNOIP(DDNSProtocolDynD
                return data
  
  
+ class DDNSProviderNsupdateINFO(DDNSProtocolDynDNS2, DDNSProvider):
+       handle    = "nsupdate.info"
+       name      = "nsupdate.info"
+       website   = "http://www.nsupdate.info/"
+       protocols = ("ipv6", "ipv4",)
+       # Information about the format of the HTTP request can be found
+       # after login on the provider user intrface and here:
+       # http://nsupdateinfo.readthedocs.org/en/latest/user.html
+       # Nsupdate.info uses the hostname as user part for the HTTP basic auth,
+       # and for the password a so called secret.
+       @property
+       def username(self):
+               return self.get("hostname")
+       @property
+       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.
+               if self.proto == "ipv4":
+                       return "https://ipv4.nsupdate.info/nic/update"
+               elif self.proto == "ipv6":
+                       return "https://ipv6.nsupdate.info/nic/update"
+               else:
+                       raise DDNSUpdateError(_("Invalid protocol has been given"))
+       def _prepare_request_data(self):
+               data = {
+                       "myip" : self.get_address(self.proto),
+               }
+               return data
  class DDNSProviderOVH(DDNSProtocolDynDNS2, DDNSProvider):
        handle    = "ovh.com"
        name      = "OVH"