pvl.hosts.zone: fix reverse= to be IPv4-only
authorTero Marttila <tero.marttila@aalto.fi>
Wed, 25 Feb 2015 14:52:53 +0200
changeset 464 f1d3dbf04ca3
parent 463 2cbdb2435487
child 465 133f14810eb5
pvl.hosts.zone: fix reverse= to be IPv4-only
pvl/hosts/host.py
pvl/hosts/tests.py
pvl/hosts/zone.py
--- a/pvl/hosts/host.py	Wed Feb 25 14:41:51 2015 +0200
+++ b/pvl/hosts/host.py	Wed Feb 25 14:52:53 2015 +0200
@@ -151,9 +151,13 @@
             location    - location (name, domain) or None
             alias4      - list (CNAME -> A)
             alias6      - list (CNAME -> AAAA)
-            forward     - generate forward records, or CNAME into given zone
-            reverse     - generate reverse records, or CNAME into given zone
-            down        - not online
+            forward     - None: generate forward zone A/AAAA records per ip/ip6
+                          False: omit A/AAAA records
+                          str: generate forward zone CNAME to given fqdn
+            reverse     - None: generate reverse zone PTR records per ip/ip6
+                          False: omit PTR records for ip/ip6
+                          str: generate IPv4 reverse zone CNAME to given fqdn, and omit IPv6 PTR
+            down        - mark as offline for polling
         """
 
         self.name = name
--- a/pvl/hosts/tests.py	Wed Feb 25 14:41:51 2015 +0200
+++ b/pvl/hosts/tests.py	Wed Feb 25 14:52:53 2015 +0200
@@ -122,7 +122,7 @@
 
         self.assertZoneEquals(zone.host_forward(h, 'test'), { })
 
-    def testHostForwardIP(self):
+    def testHostIP(self):
         h = host.Host.build('host', 'domain',
                 ip  = '192.0.2.1',
                 ip6 = '2001:db8::192.0.2.1',
@@ -133,6 +133,14 @@
             ('host', 'AAAA'): ['2001:db8::c000:201'],
         })
 
+        self.assertZoneEquals((rr for ip, rr in zone.host_reverse(h, ipaddr.IPNetwork('192.0.2.1/24'))), {
+            ('1', 'PTR'): ['host.domain.'],
+        })
+
+        self.assertZoneEquals((rr for ip, rr in zone.host_reverse(h, ipaddr.IPNetwork('2001:db8::/64'))), {
+            ('1.0.2.0.0.0.0.c.0.0.0.0.0.0.0.0', 'PTR'): ['host.domain.'],
+        })
+
     def testHostDelegate(self):
         h = host.Host.build('host', 'example.com',
                 ip      = '192.0.2.1',
@@ -148,6 +156,10 @@
         self.assertZoneEquals((rr for ip, rr in zone.host_reverse(h, ipaddr.IPNetwork('192.0.2.1/24'))), {
             ('1', 'CNAME'): ['1.0/28.2.0.192.in-addr.arpa.'],
         })
+        
+        self.assertZoneEquals((rr for ip, rr in zone.host_reverse(h, ipaddr.IPNetwork('2001:db8::/64'))), {
+
+        })
 
 if __name__ == '__main__':
     unittest.main()
--- a/pvl/hosts/zone.py	Wed Feb 25 14:41:51 2015 +0200
+++ b/pvl/hosts/zone.py	Wed Feb 25 14:52:53 2015 +0200
@@ -86,13 +86,21 @@
 
 def host_reverse (host, prefix) :
     """
-        Yield (ip, fqnd) for host within given prefix.
+        Yield (ipaddr.IPAddress, ZoneRecord) tuples for host within given prefix's reverse-dns zone.
     """
 
     if prefix.version == 4 :
         ip = host.ip
+        
+        # reverse= is IPv4-only
+        reverse = host.reverse
+
     elif prefix.version == 6 :
         ip = host.ip6
+        
+        # if reverse= is set, always omit, for lack of reverse6=
+        reverse = None if host.reverse is None else False
+
     else :
         raise ValueError("%s: unknown ip version: %s" % (prefix, prefix.version))
 
@@ -107,21 +115,21 @@
     # relative label
     label = pvl.dns.reverse_label(prefix, ip)
    
-    if host.reverse :
-        alias = pvl.dns.fqdn(host.reverse)
+    if reverse:
+        alias = pvl.dns.fqdn(reverse)
         
         log.info("%s %s[%s]: CNAME %s", host, prefix, ip, alias)
 
         yield ip, pvl.dns.zone.ZoneRecord.CNAME(label, alias)
 
-    elif host.reverse is None :
+    elif reverse is None :
         fqdn = host.fqdn()
 
         log.info("%s %s[%s]: PTR %s", host, prefix, ip, fqdn)
 
         yield ip, pvl.dns.zone.ZoneRecord.PTR(label, fqdn)
 
-    else :
+    else:
         log.info("%s %s[%s]: omit", host, prefix, ip)
  
 def apply_hosts_forward (options, hosts, origin) :