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
-
#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).
- #canonicalize_hostname_with_retries(hostname) ⇒ Object
- #hex_to_dec_netmask(netmask) ⇒ Object
-
#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.
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
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 |