Removed duplicate domain name validating function

Reviewed-By: Martin Basti <mbasti@redhat.com>
This commit is contained in:
Stanislav Laznicka
2015-12-02 17:26:56 +01:00
committed by Martin Basti
parent bbbe411f35
commit 498471e4ae
6 changed files with 39 additions and 43 deletions
+6 -3
View File
@@ -54,6 +54,7 @@ try:
from ipapython.config import IPAOptionParser from ipapython.config import IPAOptionParser
from ipalib import api, errors from ipalib import api, errors
from ipalib import x509, certstore from ipalib import x509, certstore
from ipalib.util import verify_host_resolvable
from ipalib.constants import CACERT from ipalib.constants import CACERT
from ipapython.dn import DN from ipapython.dn import DN
from ipapython.ssh import SSHPublicKey from ipapython.ssh import SSHPublicKey
@@ -1761,11 +1762,13 @@ def get_server_connection_interface(server):
def client_dns(server, hostname, options): def client_dns(server, hostname, options):
dns_ok = ipautil.is_host_resolvable(hostname) try:
verify_host_resolvable(hostname, root_logger)
if not dns_ok: dns_ok = True
except errors.DNSNotARecordError:
root_logger.warning("Hostname (%s) does not have A/AAAA record.", root_logger.warning("Hostname (%s) does not have A/AAAA record.",
hostname) hostname)
dns_ok = False
if (options.dns_updates or options.all_ip_addresses or options.ip_addresses if (options.dns_updates or options.all_ip_addresses or options.ip_addresses
or not dns_ok): or not dns_ok):
+14 -8
View File
@@ -51,9 +51,10 @@ from ipalib.util import (normalize_zonemgr,
DNSSECSignatureMissingError, UnresolvableRecordError, DNSSECSignatureMissingError, UnresolvableRecordError,
EDNS0UnsupportedError, DNSSECValidationError, EDNS0UnsupportedError, DNSSECValidationError,
validate_dnssec_zone_forwarder_step1, validate_dnssec_zone_forwarder_step1,
validate_dnssec_zone_forwarder_step2) validate_dnssec_zone_forwarder_step2,
verify_host_resolvable)
from ipapython.ipautil import CheckedIPAddress, is_host_resolvable from ipapython.ipautil import CheckedIPAddress
from ipapython.dnsutil import DNSName from ipapython.dnsutil import DNSName
if six.PY3: if six.PY3:
@@ -1554,7 +1555,7 @@ _dns_record_options = tuple(__dns_record_options_iter())
_dns_supported_record_types = tuple(record.rrtype for record in _dns_records \ _dns_supported_record_types = tuple(record.rrtype for record in _dns_records \
if record.supported) if record.supported)
def check_ns_rec_resolvable(zone, name): def check_ns_rec_resolvable(zone, name, log):
assert isinstance(zone, DNSName) assert isinstance(zone, DNSName)
assert isinstance(name, DNSName) assert isinstance(name, DNSName)
@@ -1563,7 +1564,9 @@ def check_ns_rec_resolvable(zone, name):
elif not name.is_absolute(): elif not name.is_absolute():
# this is a DNS name relative to the zone # this is a DNS name relative to the zone
name = name.derelativize(zone.make_absolute()) name = name.derelativize(zone.make_absolute())
if not is_host_resolvable(name): try:
verify_host_resolvable(name, log)
except errors.DNSNotARecordError:
raise errors.NotFound( raise errors.NotFound(
reason=_('Nameserver \'%(host)s\' does not have a corresponding ' reason=_('Nameserver \'%(host)s\' does not have a corresponding '
'A/AAAA record') % {'host': name} 'A/AAAA record') % {'host': name}
@@ -2734,7 +2737,8 @@ class dnszone_add(DNSZoneBase_add):
# verify if user specified server is resolvable # verify if user specified server is resolvable
if not options['force']: if not options['force']:
check_ns_rec_resolvable(keys[0], entry_attrs['idnssoamname']) check_ns_rec_resolvable(keys[0], entry_attrs['idnssoamname'],
self.log)
# show warning about --name-server option # show warning about --name-server option
context.show_warning_nameserver_option = True context.show_warning_nameserver_option = True
else: else:
@@ -2833,7 +2837,7 @@ class dnszone_mod(DNSZoneBase_mod):
nameserver = entry_attrs['idnssoamname'] nameserver = entry_attrs['idnssoamname']
if nameserver: if nameserver:
if not nameserver.is_empty() and not options['force']: if not nameserver.is_empty() and not options['force']:
check_ns_rec_resolvable(keys[0], nameserver) check_ns_rec_resolvable(keys[0], nameserver, self.log)
context.show_warning_nameserver_option = True context.show_warning_nameserver_option = True
else: else:
# empty value, this option is required by ldap # empty value, this option is required by ldap
@@ -3004,7 +3008,7 @@ class dnsrecord(LDAPObject):
if options.get('force', False) or nsrecords is None: if options.get('force', False) or nsrecords is None:
return return
for nsrecord in nsrecords: for nsrecord in nsrecords:
check_ns_rec_resolvable(keys[0], DNSName(nsrecord)) check_ns_rec_resolvable(keys[0], DNSName(nsrecord), self.log)
def _idnsname_pre_callback(self, ldap, dn, entry_attrs, *keys, **options): def _idnsname_pre_callback(self, ldap, dn, entry_attrs, *keys, **options):
assert isinstance(dn, DN) assert isinstance(dn, DN)
@@ -4196,7 +4200,9 @@ class dns_resolve(Command):
def execute(self, *args, **options): def execute(self, *args, **options):
query=args[0] query=args[0]
if not is_host_resolvable(query): try:
verify_host_resolvable(query, self.log)
except errors.DNSNotARecordError:
raise errors.NotFound( raise errors.NotFound(
reason=_('Host \'%(host)s\' not found') % {'host': query} reason=_('Host \'%(host)s\' not found') % {'host': query}
) )
+1 -1
View File
@@ -625,7 +625,7 @@ class host_add(LDAPCreate):
check_forward=True, check_forward=True,
check_reverse=check_reverse) check_reverse=check_reverse)
if not options.get('force', False) and not 'ip_address' in options: if not options.get('force', False) and not 'ip_address' in options:
util.validate_host_dns(self.log, keys[-1]) util.verify_host_resolvable(keys[-1], self.log)
if 'locality' in entry_attrs: if 'locality' in entry_attrs:
entry_attrs['l'] = entry_attrs['locality'] entry_attrs['l'] = entry_attrs['locality']
entry_attrs['cn'] = keys[-1] entry_attrs['cn'] = keys[-1]
+1 -1
View File
@@ -554,7 +554,7 @@ class service_add(LDAPCreate):
# We know the host exists if we've gotten this far but we # We know the host exists if we've gotten this far but we
# really want to discourage creating services for hosts that # really want to discourage creating services for hosts that
# don't exist in DNS. # don't exist in DNS.
util.validate_host_dns(self.log, hostname) util.verify_host_resolvable(hostname, self.log)
if not 'managedby' in entry_attrs: if not 'managedby' in entry_attrs:
entry_attrs['managedby'] = hostresult['dn'] entry_attrs['managedby'] = hostresult['dn']
+17 -18
View File
@@ -66,32 +66,31 @@ def json_serialize(obj):
return '' return ''
return json_serialize(obj.__json__()) return json_serialize(obj.__json__())
def validate_host_dns(log, fqdn): def verify_host_resolvable(fqdn, log):
""" """
See if the hostname has a DNS A/AAAA record. See if the hostname has a DNS A/AAAA record.
""" """
try: if not isinstance(fqdn, DNSName):
answers = resolver.query(fqdn, rdatatype.A) fqdn = DNSName(fqdn)
log.debug(
'IPA: found %d A records for %s: %s' % (len(answers), fqdn, fqdn = fqdn.make_absolute()
' '.join(str(answer) for answer in answers)) for rdtype in ('A', 'AAAA'):
)
except DNSException as e:
log.debug(
'IPA: DNS A record lookup failed for %s' % fqdn
)
# A record not found, try to find AAAA record
try: try:
answers = resolver.query(fqdn, rdatatype.AAAA) answers = resolver.query(fqdn, rdtype)
log.debug( log.debug(
'IPA: found %d AAAA records for %s: %s' % (len(answers), fqdn, 'IPA: found %d %s records for %s: %s' % (len(answers),
' '.join(str(answer) for answer in answers)) rdtype, fqdn, ' '.join(str(answer) for answer in answers))
) )
except DNSException as e: except DNSException:
log.debug( log.debug(
'IPA: DNS AAAA record lookup failed for %s' % fqdn 'IPA: DNS %s record lookup failed for %s' %
(rdtype, fqdn)
) )
raise errors.DNSNotARecordError() continue
else:
return
# dns lookup failed in both tries
raise errors.DNSNotARecordError()
def has_soa_or_ns_record(domain): def has_soa_or_ns_record(domain):
-12
View File
@@ -911,18 +911,6 @@ def bind_port_responder(port, socket_type=socket.SOCK_STREAM, socket_timeout=Non
if s is None and last_socket_error is not None: if s is None and last_socket_error is not None:
raise last_socket_error # pylint: disable=E0702 raise last_socket_error # pylint: disable=E0702
def is_host_resolvable(fqdn):
if not isinstance(fqdn, DNSName):
fqdn = DNSName(fqdn)
for rdtype in (rdatatype.A, rdatatype.AAAA):
try:
resolver.query(fqdn.make_absolute(), rdtype)
except DNSException:
continue
else:
return True
return False
def host_exists(host): def host_exists(host):
""" """