Skip to content

Instantly share code, notes, and snippets.

@davehughes
Created February 27, 2025 23:50
Show Gist options
  • Save davehughes/27d4c30b95ea61a90f4d902aa7b510e2 to your computer and use it in GitHub Desktop.
Save davehughes/27d4c30b95ea61a90f4d902aa7b510e2 to your computer and use it in GitHub Desktop.
import re
import socket
from dns.resolver import NoAnswer, Resolver
def make_resolver(ip_or_domain):
if re.match(r"\d+\.\d+\.\d+\.\d+", ip_or_domain):
ns_ip = ip_or_domain
else:
ns_ip = socket.gethostbyname(ip_or_domain)
resolver = Resolver(configure=False)
resolver.nameservers = [ns_ip]
return resolver
class RecordComparator:
def __init__(self, nsdomain1, nsdomain2):
self.nsdomain1 = nsdomain1
self.nsdomain2 = nsdomain2
self.resolver1 = make_resolver(nsdomain1)
self.resolver2 = make_resolver(nsdomain2)
def compare_all_records(self, records):
matches = 0
mismatches = 0
for record in records:
match = self.compare_records(*record)
if match:
matches += 1
else:
mismatches += 1
print(f"Matches: {matches}, Mismatches: {mismatches}")
return mismatches == 0
def compare_records(self, record, type_):
answers1 = self.resolve(self.resolver1, record, type_)
answers2 = self.resolve(self.resolver2, record, type_)
match = answers1 == answers2
green_check = "\033[32m\u2713\033[0m"
red_cross = "\033[31m\u2717\033[0m"
print(f"Comparing records {record}({type_}): {green_check if match else red_cross}")
print(f"\t1: {answers1}")
print(f"\t2: {answers2}")
return match
def resolve(self, resolver, record, type_):
try:
answers = resolver.resolve(record, type_)
except NoAnswer:
answers = []
return sorted([(d.rdtype, d.to_text()) for d in answers])
def compare():
comparator = RecordComparator("1.1.1.1", "8.8.8.8")
comparator.compare_all_records(
[
("example.com", "A"),
("www.example.com", "CNAME"),
("www.microsoft.com", "A"),
("reddit.com", "A"),
("derp.reddit.com", "CNAME"),
]
)
if __name__ == "__main__":
compare()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment