samba-tool:dns: Add support for reverse names (PTR records)
authorAmitay Isaacs <amitay@gmail.com>
Wed, 14 Dec 2011 04:54:31 +0000 (15:54 +1100)
committerAmitay Isaacs <amitay@gmail.com>
Fri, 23 Dec 2011 05:17:09 +0000 (16:17 +1100)
source4/scripting/python/samba/netcmd/dns.py

index 3c1bb98160141da5864bba3aaf20f72ef865de32..40c88f3470da65370065a2ab8c3d62ac7319402d 100644 (file)
@@ -139,6 +139,8 @@ def dns_type_flag(rec_type):
         record_type = dnsp.DNS_TYPE_A
     elif rtype == 'AAAA':
         record_type = dnsp.DNS_TYPE_AAAA
+    elif rtype == 'PTR':
+        record_type = dnsp.DNS_TYPE_PTR
     elif rtype == 'NS':
         record_type = dnsp.DNS_TYPE_NS
     elif rtype == 'CNAME':
@@ -326,6 +328,10 @@ def print_dns_record(outf, rec):
     mesg = 'Unknown: '
     if rec.wType == dnsp.DNS_TYPE_A:
         mesg = 'A: %s' % (rec.data)
+    elif rec.wType == dnsp.DNS_TYPE_AAAA:
+        mesg = 'AAAA: %s' % (rec.data)
+    elif rec.wType == dnsp.DNS_TYPE_PTR:
+        mesg = 'PTR: %s' % (rec.data.str)
     elif rec.wType == dnsp.DNS_TYPE_NS:
         mesg = 'NS: %s' % (rec.data.str)
     elif rec.wType == dnsp.DNS_TYPE_CNAME:
@@ -376,6 +382,19 @@ class AAAARecord(dnsserver.DNS_RPC_RECORD):
         self.dwTtlSeconds = ttl
         self.data = ip6_addr
 
+class PTRRecord(dnsserver.DNS_RPC_RECORD):
+    def __init__(self, ptr, serial=1, ttl=900, rank=dnsp.DNS_RANK_ZONE,
+                 node_flag=0):
+        super(PTRRecord, self).__init__()
+        self.wType = dnsp.DNS_TYPE_PTR
+        self.dwFlags = rank | node_flag
+        self.dwSerial = serial
+        self.dwTtleSeconds = ttl
+        ptr_name = dnsserver.DNS_RPC_NAME()
+        ptr_name.str = ptr
+        ptr_name.len = len(ptr)
+        self.data = ptr_name
+
 class CNameRecord(dnsserver.DNS_RPC_RECORD):
     def __init__(self, cname, serial=1, ttl=900, rank=dnsp.DNS_RANK_ZONE,
                     node_flag=0):
@@ -471,11 +490,14 @@ def dns_record_match(dns_conn, server, zone, name, record_type, data):
         elif record_type == dnsp.DNS_TYPE_AAAA:
             if rec_match.data == data:
                 found = True
+        elif record_type == dnsp.DNS_TYPE_PTR:
+            if rec_match.data.str.rstrip('.') == data.rstrip('.'):
+                found = True
         elif record_type == dnsp.DNS_TYPE_CNAME:
-            if rec_match.data == data:
+            if rec_match.data.str.rstrip('.') == data.rstrip('.'):
                 found = True
         elif record_type == dnsp.DNS_TYPE_NS:
-            if rec_match.data == data:
+            if rec_match.data.str.rstrip('.') == data.rstrip('.'):
                 found = True
 
         if found:
@@ -717,7 +739,7 @@ class cmd_roothints(Command):
 class cmd_add_record(Command):
     """Add a DNS record"""
 
-    synopsis = '%prog <server> <zone> <name> <A|AAAA|CNAME|NS> <data>'
+    synopsis = '%prog <server> <zone> <name> <A|AAAA|PTR|CNAME|NS> <data>'
 
     takes_args = [ 'server', 'zone', 'name', 'rtype', 'data' ]
 
@@ -729,6 +751,8 @@ class cmd_add_record(Command):
             rec = ARecord(data)
         elif record_type == dnsp.DNS_TYPE_AAAA:
             rec = AAAARecord(data)
+        elif record_type == dnsp.DNS_TYPE_PTR:
+            rec = PTRRecord(data)
         elif record_type == dnsp.DNS_TYPE_CNAME:
             rec = CNameRecord(data)
         elif record_type == dnsp.DNS_TYPE_NS:
@@ -760,7 +784,7 @@ class cmd_add_record(Command):
 class cmd_update_record(Command):
     """Update a DNS record"""
 
-    synopsis = '%prog <server> <zone> <name> <A|AAAA|CNAME|NS> <olddata> <newdata>'
+    synopsis = '%prog <server> <zone> <name> <A|AAAA|PTR|CNAME|NS> <olddata> <newdata>'
 
     takes_args = [ 'server', 'zone', 'name', 'rtype', 'olddata', 'newdata' ]
 
@@ -772,6 +796,8 @@ class cmd_update_record(Command):
             rec = ARecord(newdata)
         elif record_type == dnsp.DNS_TYPE_AAAA:
             rec = AAAARecord(newdata)
+        elif record_type == dnsp.DNS_TYPE_PTR:
+            rec = PTRRecord(newdata)
         elif record_type == dnsp.DNS_TYPE_CNAME:
             rec = CNameRecord(newdata)
         elif record_type == dnsp.DNS_TYPE_NS:
@@ -812,7 +838,7 @@ class cmd_update_record(Command):
 class cmd_delete_record(Command):
     """Delete a DNS record"""
 
-    synopsis = '%prog <server> <zone> <name> <A|AAAA|CNAME|NS> <data>'
+    synopsis = '%prog <server> <zone> <name> <A|AAAA|PTR|CNAME|NS> <data>'
 
     takes_args = [ 'server', 'zone', 'name', 'rtype', 'data' ]
 
@@ -824,6 +850,8 @@ class cmd_delete_record(Command):
             rec = ARecord(data)
         elif record_type == dnsp.DNS_TYPE_AAAA:
             rec = AAAARecord(data)
+        elif record_type == dnsp.DNS_TYPE_PTR:
+            rec = PTRRecord(data)
         elif record_type == dnsp.DNS_TYPE_CNAME:
             rec = CNameRecord(data)
         elif record_type == dnsp.DNS_TYPE_NS: