#!/usr/bin/env python3 import dns.resolver import whois #python-whois import socket import sys import pprint class Prefs: """Configuration Preferences""" TIMEOUT = 3 # Timeout for each SOA query RETRIES = 3 # Max #SOA queries to try per server ALLOWED_DRIFT = 0 # Allowed difference in serial numbers USE_TCP = False # Use TCP (-c to set to True) WANT_DNSSEC = False # Use -z to make this True NO_NSSET = False # Query official NS set (-n to negate) MASTER = None # Master server name MASTER_IP = None # Master server IP address MASTER_SERIAL = None ADDITIONAL = [] # additional NS names to check AF = socket.AF_UNSPEC # v4=AF_INET, v6=AF_INET6 def get_nsnames(zone): """Get list of nameservers names to query""" if Prefs.NO_NSSET: if not Prefs.ADDITIONAL: print("ERROR: -n requires specifying -a") usage() return Prefs.ADDITIONAL answers = dns.resolver.resolve(zone, 'NS', 'IN') return Prefs.ADDITIONAL + sorted([str(x.target) for x in answers.rrset]) def get_whois_nsname(zone): records = whois.whois(zone) ns_server = [] for record in records["name_servers"]: if not record.endswith('.'): ns_server.append(f"{record.lower()}.") else: ns_server.append(f"{record.lower()}") return list(dict.fromkeys(ns_server)) if __name__ == '__main__': ZONE = sys.argv[1] NSNAME_LIST = get_nsnames(ZONE) WHOIS_NS_LIST = get_whois_nsname(ZONE) print(sorted(NSNAME_LIST)) print(sorted(WHOIS_NS_LIST)) if len(NSNAME_LIST) == len(WHOIS_NS_LIST): if sorted(NSNAME_LIST) == sorted(WHOIS_NS_LIST): print("Whois and NS record are equal") sys.exit(0) else: print("Whois and NS record are not equal") sys.exit(1) else: print("Whois and NS record are not equal") sys.exit(2)