29 lines
901 B
Python
29 lines
901 B
Python
import dns.rdatatype
|
|
import dns.resolver
|
|
|
|
|
|
def normalize_fqdn(dns_name: str) -> str:
|
|
if not dns_name:
|
|
return ''
|
|
|
|
return dns_name.lower().rstrip('.') + '.'
|
|
|
|
|
|
def get_soa(dns_name: str) -> str:
|
|
parts = dns_name.rstrip('.').split('.')
|
|
for i in range(len(parts)):
|
|
zone_name = normalize_fqdn('.'.join(parts[i:]))
|
|
|
|
try:
|
|
dns.resolver.query(zone_name, dns.rdatatype.SOA)
|
|
return zone_name
|
|
except dns.resolver.NoAnswer:
|
|
# The name exists, but has no SOA. Continue one level further up
|
|
continue
|
|
except dns.resolver.NXDOMAIN as e:
|
|
# Look for a SOA record in the authority section
|
|
for query, response in e.responses().items():
|
|
for rrset in response.authority:
|
|
if rrset.rdtype == dns.rdatatype.SOA:
|
|
return rrset.name.to_text()
|