module Ohai::Mixin::NetworkHelper

Constants

FAMILIES

Public Instance Methods

canonicalize_hostname(hostname) click to toggle source

This does a forward and reverse lookup on the hostname to return what should be the FQDN for the host determined by name lookup (generally DNS). If the forward lookup fails this will throw. If the reverse lookup fails this will return the hostname back. The behavior on failure of the reverse lookup is both vitally important to this API, and completely untested, so changes to this method (not recommended) need to be manually validated by hand by setting up a DNS server with a broken A record to an IP without a PTR record (e.g. any RFC1918 space not served by the configured DNS server), and the method should return the hostname and not the IP address.

# File lib/ohai/mixin/network_helper.rb, line 56
def canonicalize_hostname(hostname)
  ai = Addrinfo
    .getaddrinfo(hostname, nil, nil, nil, nil, Socket::AI_CANONNAME)
    .first

  canonname = ai&.canonname
  # use canonname if it's an FQDN
  # This API is preferred as it never gives us an IP address for broken DNS
  # (see https://github.com/chef/ohai/pull/1705)
  # However, we have found that Windows hosts that are not joined to a domain
  # can return a non-qualified hostname).
  # Use a '.' in the canonname as indicator of FQDN
  return canonname if canonname.include?(".")

  # If we got a non-qualified name, then we do a standard reverse resolve
  # which, assuming DNS is working, will work around that windows bug
  # (and maybe others)
  canonname = ai&.getnameinfo&.first
  return canonname unless ip?(canonname)

  # if all else fails, return the name we were given as a safety
  hostname
end
canonicalize_hostname_with_retries(hostname) click to toggle source
# File lib/ohai/mixin/network_helper.rb, line 80
def canonicalize_hostname_with_retries(hostname)
  retries = 3
  begin
    canonicalize_hostname(hostname)
  rescue
    retries -= 1
    retry if retries > 0
    nil
  end
end
hex_to_dec_netmask(netmask) click to toggle source
# File lib/ohai/mixin/network_helper.rb, line 34
def hex_to_dec_netmask(netmask)
  # example 'ffff0000' -> '255.255.0.0'
  dec = netmask[0..1].to_i(16).to_s(10)
  [2, 4, 6].each { |n| dec = dec + "." + netmask[n..n + 1].to_i(16).to_s(10) }
  dec
end
ip?(hostname) click to toggle source

Addrinfo#ip*? methods return true on AI_CANONNAME Addrinfo records that match the ipv* scheme and ip? always returns true unless a non tcp Addrinfo

# File lib/ohai/mixin/network_helper.rb, line 43
def ip?(hostname)
  Resolv::IPv4::Regex.match?(hostname) || Resolv::IPv6::Regex.match?(hostname)
end