mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2026-09-03 20:52:56 -05:00
Removed duplicate domain name validating function
Reviewed-By: Martin Basti <mbasti@redhat.com>
This commit is contained in:
committed by
Martin Basti
parent
bbbe411f35
commit
498471e4ae
@@ -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
@@ -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}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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
@@ -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):
|
||||||
|
|||||||
@@ -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):
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user