use authoritative server to perform dns checks

This commit is contained in:
Arthur Vuillard
2024-07-16 18:18:53 +02:00
parent 3702e7057a
commit cc67f56d66
+36 -2
View File
@@ -190,11 +190,45 @@ def get_dns_resolver():
return resolver
def get_authoritative_server(domain, resolver=None):
if not resolver:
resolver = get_dns_resolver()
dnsname = dns.name.from_text(domain)
while True:
try:
answers = dns.resolver.resolve(dnsname, 'NS')
return str(answers[0].target)
except dns.resolver.NoAnswer as e:
dnsname = dnsname.parent()
def get_authoritative_ip(domain, resolver=None):
dnsserver_name = get_authoritative_server(domain, resolver=resolver)
if not resolver:
resolver = get_dns_resolver()
answer = resolver.resolve(dnsserver_name)
if answer:
return answer[0].address
return None
def get_authoritative_resolver(domain, resolver=None):
dnsserver_ip = get_authoritative_ip(domain, resolver=resolver)
if dnsserver_ip:
resolver = dns.resolver.Resolver()
resolver.nameservers = [dnsserver_ip]
else:
resolver = get_dns_resolver()
return resolver
def get_dns_records(name, typ, resolver=None):
"""Retrieve DNS records for given name and type."""
logger = logging.getLogger("modoboa.admin")
if not resolver:
resolver = get_dns_resolver()
resolver = get_authoritative_resolver(name, resolver=resolver)
try:
dns_answers = resolver.resolve(name, typ, search=True)
except dns.resolver.NXDOMAIN as e: