mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2026-11-02 20:30:26 -06:00
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:
1 parent
ec49130b94
commit
dc405005f5
3 files changed
+76
-25
No files matched your search
@@ -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):
|
||||
|
||||
Reference in new issue
Block a user