def resolve_ip_addresses_nss(fqdn): """Get list of IP addresses for given host (using NSS/getaddrinfo). :returns: list of IP addresses as UnsafeIPAddress objects """ # it would be good disable search list processing from resolv.conf # to avoid cases where we get IP address for an totally different name # but there is no way to do this using getaddrinfo parameters try: addrinfos = socket.getaddrinfo(fqdn, None, socket.AF_UNSPEC, socket.SOCK_STREAM) except socket.error as ex: if ex.errno == socket.EAI_NODATA or ex.errno == socket.EAI_NONAME: logger.debug('Name %s does not have any address: %s', fqdn, ex) return set() else: raise # accept whatever we got from NSS ip_addresses = set() for ai in addrinfos: try: ip = ipautil.UnsafeIPAddress(ai[4][0]) except ValueError as ex: # getaddinfo may return link-local address other similar oddities # which are not accepted by CheckedIPAddress - skip these logger.warning('Name %s resolved to an unacceptable IP ' 'address %s: %s', fqdn, ai[4][0], ex) else: ip_addresses.add(ip) logger.debug('Name %s resolved to %s', fqdn, ip_addresses) return ip_addresses
def get_server_ip_address(host_name, unattended, setup_dns, ip_addresses): hostaddr = resolve_ip_addresses_nss(host_name) if hostaddr.intersection( {ipautil.UnsafeIPAddress(ip) for ip in ['127.0.0.1', '::1']}): print("The hostname resolves to the localhost address (127.0.0.1/::1)", file=sys.stderr) print("Please change your /etc/hosts file so that the hostname", file=sys.stderr) print("resolves to the ip address of your network interface.", file=sys.stderr) print("The KDC service does not listen on localhost", file=sys.stderr) print("", file=sys.stderr) print("Please fix your /etc/hosts file and restart the setup program", file=sys.stderr) raise ScriptError() ips = [] if len(hostaddr): for ha in hostaddr: try: ips.append(ipautil.CheckedIPAddress(ha)) except ValueError as e: logger.warning("Invalid IP address %s for %s: %s", ha, host_name, unicode(e)) if not ips and not ip_addresses: if not unattended: ip_addresses = read_ip_addresses() if ip_addresses: if setup_dns: ips = ip_addresses else: # all specified addresses was resolved for this host if set(ip_addresses) <= set(ips): ips = ip_addresses else: print("Error: the hostname resolves to IP address(es) that are different", file=sys.stderr) print("from those provided on the command line. Please fix your DNS", file=sys.stderr) print("or /etc/hosts file and restart the installation.", file=sys.stderr) print("Provided but not resolved address(es): %s" % \ ", ".join(str(ip) for ip in (set(ip_addresses) - set(ips))), file=sys.stderr) raise ScriptError() if not ips: print("No usable IP address provided nor resolved.", file=sys.stderr) raise ScriptError() for ip_address in ips: # check /etc/hosts sanity hosts_record = record_in_hosts(str(ip_address)) if hosts_record is not None: primary_host = hosts_record[1][0] if primary_host != host_name: print("Error: there is already a record in /etc/hosts for IP address %s:" \ % ip_address, file=sys.stderr) print(hosts_record[0], " ".join(hosts_record[1]), file=sys.stderr) print("Chosen hostname %s does not match configured canonical hostname %s" \ % (host_name, primary_host), file=sys.stderr) print("Please fix your /etc/hosts file and restart the installation.", file=sys.stderr) raise ScriptError() return ips
def resolve_ip_addresses_nss(fqdn): """Get list of IP addresses for given host (using NSS/getaddrinfo). :returns: list of IP addresses as UnsafeIPAddress objects """ # make sure the name is fully qualified # so search path from resolv.conf does not apply fqdn = str(dnsutil.DNSName(fqdn).make_absolute()) try: addrinfos = socket.getaddrinfo(fqdn, None, socket.AF_UNSPEC, socket.SOCK_STREAM) except socket.error as ex: if ex.errno == socket.EAI_NODATA or ex.errno == socket.EAI_NONAME: root_logger.debug('Name %s does not have any address: %s', fqdn, ex) return set() else: raise # accept whatever we got from NSS ip_addresses = set() for ai in addrinfos: try: ip = ipautil.UnsafeIPAddress(ai[4][0]) except ValueError as ex: # getaddinfo may return link-local address other similar oddities # which are not accepted by CheckedIPAddress - skip these root_logger.warning('Name %s resolved to an unacceptable IP ' 'address %s: %s', fqdn, ai[4][0], ex) else: ip_addresses.add(ip) root_logger.debug('Name %s resolved to %s', fqdn, ip_addresses) return ip_addresses