samba-tool: dns: Convert dns data into a dns record for comparison
authorAmitay Isaacs <amitay@gmail.com>
Tue, 14 Feb 2012 02:32:57 +0000 (13:32 +1100)
committerAmitay Isaacs <amitay@gmail.com>
Tue, 21 Feb 2012 07:24:30 +0000 (18:24 +1100)
and compare two dns records directly. Refactor dns name comparision
as dns_name_equal().

source4/scripting/python/samba/netcmd/dns.py

index b566a34159f1f11477a567fe162048c0c9e52340..f1adc06faa6eaa43067a7260dbb5797d39f3e348 100644 (file)
@@ -519,8 +519,15 @@ def data_to_dns_record(record_type, data):
     return rec
 
 
+# Match dns name (of type DNS_RPC_NAME)
+def dns_name_equal(n1, n2):
+    return n1.str.rstrip('.').lower() == n2.str.rstrip('.').lower()
+
+
 # Match a dns record with specified data
 def dns_record_match(dns_conn, server, zone, name, record_type, data):
+    urec = data_to_dns_record(record_type, data)
+
     select_flags = dnsserver.DNS_RPC_VIEW_AUTHORITY_DATA
 
     try:
@@ -547,19 +554,40 @@ def dns_record_match(dns_conn, server, zone, name, record_type, data):
 
         found = False
         if record_type == dnsp.DNS_TYPE_A:
-            if rec.data == data:
+            if rec.data == urec.data:
                 found = True
         elif record_type == dnsp.DNS_TYPE_AAAA:
-            if rec.data == data:
+            if rec.data == urec.data:
                 found = True
         elif record_type == dnsp.DNS_TYPE_PTR:
-            if rec.data.str.rstrip('.').lower() == data.rstrip('.').lower():
+            if dns_name_equal(rec.data, urec.data):
                 found = True
         elif record_type == dnsp.DNS_TYPE_CNAME:
-            if rec.data.str.rstrip('.').lower() == data.rstrip('.').lower():
+            if dns_name_equal(rec.data, urec.data):
                 found = True
         elif record_type == dnsp.DNS_TYPE_NS:
-            if rec.data.str.rstrip('.').lower() == data.rstrip('.').lower():
+            if dns_name_equal(rec.data, urec.data):
+                found = True
+        elif record_type == dnsp.DNS_TYPE_MX:
+            if dns_name_equal(rec.data.nameExchange, urec.data.nameExchange) and \
+               rec.data.wPreference == urec.data.wPreference:
+                found = True
+        elif record_type == dnsp.DNS_TYPE_SRV:
+            if rec.data.wPriority == urec.data.wPriority and \
+               rec.data.wWeight == urec.data.wWeight and \
+               rec.data.wPort == urec.data.wPort and \
+               dns_name_equal(rec.data.nameTarget, urec.data.nameTarget):
+                found = True
+        elif record_type == dnsp.DNS_TYPE_SOA:
+            if rec.data.dwSerialNo == urec.data.dwSerialNo and \
+               rec.data.dwRefresh == urec.data.dwRefresh and \
+               rec.data.dwRetry == urec.data.dwRetry and \
+               rec.data.dwExpire == urec.data.dwExpire and \
+               rec.data.dwMinimumTtl == urec.data.dwMinimumTtl and \
+               dns_name_equal(rec.data.NamePrimaryServer,
+                              urec.data.NamePrimaryServer) and \
+               dns_name_equal(rec.data.ZoneAdministratorEmail,
+                              urec.data.ZoneAdministratorEmail):
                 found = True
         if found:
             rec_match = rec