Move IP address resolution from ipaserver.install.installutils to ipapython.dnsutil

This is to make it reusable from other modules and to avoid future code
duplication.

https://fedorahosted.org/freeipa/ticket/5710

Reviewed-By: Martin Basti <mbasti@redhat.com>
This commit is contained in:
Petr Spacek authored and Martin Basti committed 2016-05-30 20:14:32 +02:00
1 parent ec49130b94
commit dc405005f5
3 files changed
+76 -25

No files matched your search

+59
View File
@@ -24,6 +24,9 @@ import copy
import six
from ipapython.ipautil import CheckedIPAddress
from ipapython.ipa_log_manager import root_logger
if six.PY3:
unicode = str
@@ -231,6 +234,62 @@ def inside_auto_empty_zone(name):
return False
def resolve_rrsets(fqdn, rdtypes):
"""
Get Resource Record sets for given FQDN.
CNAME chain is followed during resolution
but CNAMEs are not returned in the resulting rrset.
:returns:
set of dns.rrset.RRset objects, can be empty
if the FQDN does not exist or if none of rrtypes exist
"""
# empty set of rdtypes would always return empty set of rrsets
assert rdtypes, "rdtypes must not be empty"
if not isinstance(fqdn, DNSName):
fqdn = DNSName(fqdn)
fqdn = fqdn.make_absolute()
rrsets = set()
for rdtype in rdtypes:
try:
answer = dns.resolver.query(fqdn, rdtype)
root_logger.debug('found %d %s records for %s: %s',
len(answer), rdtype, fqdn, ' '.join(
str(rr) for rr in answer))
rrsets.add(answer.rrset)
except dns.resolver.NXDOMAIN as ex:
root_logger.debug(ex)
break # no such FQDN, do not iterate
except dns.resolver.NoAnswer as ex:
root_logger.debug(ex) # record type does not exist for given FQDN
except dns.exception.DNSException as ex:
root_logger.error('DNS query for %s %s failed: %s',
fqdn, rdtype, ex)
raise
return rrsets
def resolve_ip_addresses(fqdn):
"""Get IP addresses from DNS A/AAAA records for given host.
:returns:
list of IP addresses as CheckedIPAddress objects
"""
rrsets = resolve_rrsets(fqdn, ['A', 'AAAA'])
ip_addresses = set()
for rrset in rrsets:
ip_addresses.update({CheckedIPAddress(ip, # accept whatever is in DNS
parse_netmask=False,
allow_network=True,
allow_loopback=True,
allow_broadcast=True,
allow_multicast=True)
for ip in rrset})
return ip_addresses
def check_zone_overlap(zone, raise_on_error=True):
root_logger.info("Checking DNS domain %s, please wait ..." % zone)
if not isinstance(zone, DNSName):