pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
authorTero Marttila <terom@paivola.fi>
Tue, 17 Dec 2013 00:56:42 +0200
changeset 295 8c6d4565576f
parent 294 29720bbc5379
child 296 9dad6914cfe7
pvl.dns.zone: fix fqdn(); implement ipv6 reverse_label
pvl/dns/zone.py
--- a/pvl/dns/zone.py	Tue Dec 17 00:42:31 2013 +0200
+++ b/pvl/dns/zone.py	Tue Dec 17 00:56:42 2013 +0200
@@ -588,7 +588,7 @@
         Return an FQND from parts, ending in .
     """
 
-    fqdn = join(parts)
+    fqdn = join(*parts)
 
     # we may be given an fqdn in parts
     if not fqdn.endswith('.') :
@@ -608,10 +608,26 @@
     hostbits = prefix.max_prefixlen - prefix.prefixlen
 
     if prefix.version == 4 :
-        labelbytes = int(math.ceil(hostbits / 8.0))
-        labelraw = address.packed[-labelbytes:]
+        # pack into octets
+        octets = [ord(x) for x in address.packed]
 
-        return '.'.join(reversed([str(ord(x)) for x in labelraw]))
+        # take the suffix
+        octets = octets[-int(math.ceil(hostbits / 8.0)):]
+        
+        # reverse in decimal
+        return '.'.join(reversed(["{0:d}".format() for x in octets]))
+
+    elif prefix.version == 6 :
+        # pack into nibbles
+        nibbles = [((ord(x) >> 4) & 0xf, ord(x) & 0xf) for x in address.packed]
+        nibbles = [nibble for nibblepair in nibbles for nibble in nibblepair]
+
+        # take the suffix
+        nibbles = nibbles[:-(hostbits / 4)]
+        
+        # reverse in hex
+        return '.'.join(reversed(["{0:x}".format(x) for x in nibbles]))
+
     else :
         raise ValueError("unsupported address version: %s" % (prefix, ))