check_ns_whois/check_ns_whois.py

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)