37 lines
1.2 KiB
Python
37 lines
1.2 KiB
Python
|
import requests
|
||
|
from dns import resolver, rdatatype
|
||
|
|
||
|
__API_KEY = 'YXJkQU1VVkRoSGZyV0FP' # fill in your actual api key
|
||
|
__API_URL = 'https://dns.it53.nl:8443/api/v1/servers/localhost/zones'
|
||
|
__MASTER_DNS = 'ns1.it53.nl' # fill in your actual master DNS
|
||
|
|
||
|
headers = {
|
||
|
'X-API-Key': __API_KEY,
|
||
|
}
|
||
|
|
||
|
response = requests.get(__API_URL, headers=headers)
|
||
|
|
||
|
data = response.json()
|
||
|
|
||
|
for zone in data:
|
||
|
zone_name = zone['name'].rstrip('.')
|
||
|
|
||
|
try:
|
||
|
answers = resolver.resolve(zone_name, 'NS')
|
||
|
ns_records = [rdata.to_text().rstrip('.') for rdata in answers] # strip ending '.'
|
||
|
if __MASTER_DNS not in ns_records:
|
||
|
print(f'🚨 {zone_name} does not point to master DNS: {__MASTER_DNS}')
|
||
|
continue
|
||
|
except Exception as e:
|
||
|
print(f'🚨 Error resolving NS for {zone_name}: {e}')
|
||
|
continue
|
||
|
|
||
|
try:
|
||
|
soa_answer = resolver.resolve(zone_name, 'SOA')
|
||
|
if __MASTER_DNS not in soa_answer.rrset.to_text():
|
||
|
print(f'🚨 SOA record of {zone_name} is inconsistent with master DNS: {__MASTER_DNS}')
|
||
|
else:
|
||
|
print(f'✅ DNS consistency check passed for {zone_name}.')
|
||
|
except Exception as e:
|
||
|
print(f'🚨 Error resolving SOA for {zone_name}: {e}')
|