64 lines
2.1 KiB
Python
Executable File
64 lines
2.1 KiB
Python
Executable File
#!/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)
|