mirror of
https://github.com/mail-in-a-box/mailinabox.git
synced 2024-11-23 02:27:05 +00:00
add dns query handling changes
This commit is contained in:
parent
286a4bd9e7
commit
6336dbbff7
@ -983,6 +983,7 @@ def set_custom_dns_record(qname, rtype, value, action, env):
|
|||||||
def get_secondary_dns(custom_dns, mode=None):
|
def get_secondary_dns(custom_dns, mode=None):
|
||||||
resolver = dns.resolver.get_default_resolver()
|
resolver = dns.resolver.get_default_resolver()
|
||||||
resolver.timeout = 10
|
resolver.timeout = 10
|
||||||
|
resolver.lifetime = 10
|
||||||
|
|
||||||
values = []
|
values = []
|
||||||
for qname, rtype, value in custom_dns:
|
for qname, rtype, value in custom_dns:
|
||||||
@ -1000,10 +1001,17 @@ def get_secondary_dns(custom_dns, mode=None):
|
|||||||
# doesn't.
|
# doesn't.
|
||||||
if not hostname.startswith("xfr:"):
|
if not hostname.startswith("xfr:"):
|
||||||
if mode == "xfr":
|
if mode == "xfr":
|
||||||
response = dns.resolver.resolve(hostname+'.', "A", raise_on_no_answer=False)
|
try:
|
||||||
values.extend(map(str, response))
|
response = resolver.resolve(hostname+'.', "A", raise_on_no_answer=False)
|
||||||
response = dns.resolver.resolve(hostname+'.', "AAAA", raise_on_no_answer=False)
|
values.extend(map(str, response))
|
||||||
values.extend(map(str, response))
|
except dns.exception.DNSException:
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = resolver.resolve(hostname+'.', "AAAA", raise_on_no_answer=False)
|
||||||
|
values.extend(map(str, response))
|
||||||
|
except dns.exception.DNSException:
|
||||||
|
pass
|
||||||
continue
|
continue
|
||||||
values.append(hostname)
|
values.append(hostname)
|
||||||
|
|
||||||
@ -1021,6 +1029,8 @@ def set_secondary_dns(hostnames, env):
|
|||||||
# Validate that all hostnames are valid and that all zone-xfer IP addresses are valid.
|
# Validate that all hostnames are valid and that all zone-xfer IP addresses are valid.
|
||||||
resolver = dns.resolver.get_default_resolver()
|
resolver = dns.resolver.get_default_resolver()
|
||||||
resolver.timeout = 5
|
resolver.timeout = 5
|
||||||
|
resolver.lifetime = 5
|
||||||
|
|
||||||
for item in hostnames:
|
for item in hostnames:
|
||||||
if not item.startswith("xfr:"):
|
if not item.startswith("xfr:"):
|
||||||
# Resolve hostname.
|
# Resolve hostname.
|
||||||
@ -1030,7 +1040,11 @@ def set_secondary_dns(hostnames, env):
|
|||||||
try:
|
try:
|
||||||
response = resolver.resolve(item, "AAAA")
|
response = resolver.resolve(item, "AAAA")
|
||||||
except (dns.resolver.NoNameservers, dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
|
except (dns.resolver.NoNameservers, dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
|
||||||
raise ValueError("Could not resolve the IP address of %s." % item)
|
pass
|
||||||
|
except (dns.resolver.Timeout):
|
||||||
|
raise ValueError("Could not resolve the IP address of %s due to timeout." % item)
|
||||||
|
except (dns.resolver.Timeout):
|
||||||
|
raise ValueError("Could not resolve the IP address of %s due to timeout." % item)
|
||||||
else:
|
else:
|
||||||
# Validate IP address.
|
# Validate IP address.
|
||||||
try:
|
try:
|
||||||
@ -1062,7 +1076,7 @@ def get_custom_dns_records(custom_dns, qname, rtype):
|
|||||||
def build_recommended_dns(env):
|
def build_recommended_dns(env):
|
||||||
ret = []
|
ret = []
|
||||||
for (domain, zonefile, records) in build_zones(env):
|
for (domain, zonefile, records) in build_zones(env):
|
||||||
# remove records that we don't dislay
|
# remove records that we don't display
|
||||||
records = [r for r in records if r[3] is not False]
|
records = [r for r in records if r[3] is not False]
|
||||||
|
|
||||||
# put Required at the top, then Recommended, then everythiing else
|
# put Required at the top, then Recommended, then everythiing else
|
||||||
|
@ -541,7 +541,7 @@ def check_dns_zone(domain, env, output, dns_zonefiles):
|
|||||||
for ns in custom_secondary_ns:
|
for ns in custom_secondary_ns:
|
||||||
# We must first resolve the nameserver to an IP address so we can query it.
|
# We must first resolve the nameserver to an IP address so we can query it.
|
||||||
ns_ips = query_dns(ns, "A")
|
ns_ips = query_dns(ns, "A")
|
||||||
if not ns_ips:
|
if not ns_ips or ns_ips in {'[Not Set]', '[timeout]'}:
|
||||||
output.print_error("Secondary nameserver %s is not valid (it doesn't resolve to an IP address)." % ns)
|
output.print_error("Secondary nameserver %s is not valid (it doesn't resolve to an IP address)." % ns)
|
||||||
continue
|
continue
|
||||||
# Choose the first IP if nameserver returns multiple
|
# Choose the first IP if nameserver returns multiple
|
||||||
@ -788,12 +788,17 @@ def query_dns(qname, rtype, nxdomain='[Not Set]', at=None, as_list=False):
|
|||||||
# running bind server), or if the 'at' argument is specified, use that host
|
# running bind server), or if the 'at' argument is specified, use that host
|
||||||
# as the nameserver.
|
# as the nameserver.
|
||||||
resolver = dns.resolver.get_default_resolver()
|
resolver = dns.resolver.get_default_resolver()
|
||||||
if at:
|
|
||||||
|
# Make sure at is not a string that cannot be used as a nameserver
|
||||||
|
if at and at not in {'[Not set]', '[timeout]'}:
|
||||||
resolver = dns.resolver.Resolver()
|
resolver = dns.resolver.Resolver()
|
||||||
resolver.nameservers = [at]
|
resolver.nameservers = [at]
|
||||||
|
|
||||||
# Set a timeout so that a non-responsive server doesn't hold us back.
|
# Set a timeout so that a non-responsive server doesn't hold us back.
|
||||||
resolver.timeout = 5
|
resolver.timeout = 5
|
||||||
|
# The number of seconds to spend trying to get an answer to the question. If the
|
||||||
|
# lifetime expires a dns.exception.Timeout exception will be raised.
|
||||||
|
resolver.lifetime = 5
|
||||||
|
|
||||||
# Do the query.
|
# Do the query.
|
||||||
try:
|
try:
|
||||||
|
Loading…
Reference in New Issue
Block a user