Module: Ohai::Mixin::NetworkHelper

Defined in:
lib/ohai/mixin/network_helper.rb

Constant Summary collapse

FAMILIES =
{
  "inet" => "default",
  "inet6" => "default_inet6",
}.freeze

Instance Method Summary collapse

Instance Method Details

#canonicalize_hostname(hostname) ⇒ Object

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.



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# 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) ⇒ Object



80
81
82
83
84
85
86
87
88
89
# 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) ⇒ Object



34
35
36
37
38
39
# 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) ⇒ Boolean

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

Returns:

  • (Boolean)


43
44
45
# File 'lib/ohai/mixin/network_helper.rb', line 43

def ip?(hostname)
  Resolv::IPv4::Regex.match?(hostname) || Resolv::IPv6::Regex.match?(hostname)
end