]> git.ipfire.org Git - ddns.git/commitdiff
Merge remote-tracking branch 'stevee/fixes'
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 9 Jul 2014 19:03:06 +0000 (19:03 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 9 Jul 2014 19:03:06 +0000 (19:03 +0000)
1  2 
src/ddns/providers.py

diff --combined src/ddns/providers.py
index c37e62510b74180f5bbeba8794e7c32fec0f9187,278d18af39d5b691a5d8146de54a228fb4501e48..512d663480361c58c05fe45f72957e26213c7c18
@@@ -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"
                # Send update to the server.
                response = self.send_request(url, data=data)
  
+               # Get the full response message.
+               output = response.read()
+               # Handle success messages.
                if output.startswith("Updated") or "has not changed" in output:
                        return
  
@@@ -656,7 -589,7 +660,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,48 -679,6 +730,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"