lib/ohai/plugins/network.rb in ohai-6.24.2 vs lib/ohai/plugins/network.rb in ohai-7.0.0.rc.0
- old
+ new
@@ -15,161 +15,162 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'ipaddress'
+require 'ohai/mixin/network_constants'
-provides "network", "counters/network"
+Ohai.plugin(:NetworkAddresses) do
+ include Ohai::Mixin::NetworkConstants
-network Mash.new unless network
-network[:interfaces] = Mash.new unless network[:interfaces]
-counters Mash.new unless counters
-counters[:network] = Mash.new unless counters[:network]
+ provides "ipaddress", "ip6address", "macaddress"
-require_plugin "hostname"
-require_plugin "#{os}::network"
+ depends "network/interfaces"
-FAMILIES = {
- "inet" => "default",
- "inet6" => "default_inet6"
-}
+ def sorted_ips(family = "inet")
+ raise "bad family #{family}" unless [ "inet", "inet6" ].include? family
-def sorted_ips(family = "inet")
- raise "bad family #{family}" unless [ "inet", "inet6" ].include? family
+ # going to use that later to sort by scope
+ scope_prio = [ "global", "site", "link", "host", "node", nil ]
- # going to use that later to sort by scope
- scope_prio = [ "global", "site", "link", "host", "node", nil ]
+ ipaddresses = []
+ # ipaddresses going to hold #{family} ipaddresses and their scope
+ Mash[network['interfaces']].each do |iface, iface_v|
+ next if iface_v.nil? or not iface_v.has_key? 'addresses'
+ iface_v['addresses'].each do |addr, addr_v|
+ next if addr_v.nil? or not addr_v.has_key? "family" or addr_v['family'] != family
+ ipaddresses << {
+ :ipaddress => addr_v["prefixlen"] ? IPAddress("#{addr}/#{addr_v["prefixlen"]}") : IPAddress("#{addr}/#{addr_v["netmask"]}"),
+ :scope => addr_v["scope"].nil? ? nil : addr_v["scope"].downcase,
+ :iface => iface
+ }
+ end
+ end
- ipaddresses = []
- # ipaddresses going to hold #{family} ipaddresses and their scope
- Mash[network['interfaces']].each do |iface, iface_v|
- iface_v['addresses'].each do |addr, addr_v|
- next if addr_v.nil? or not addr_v.has_key? "family" or addr_v['family'] != family
- ipaddresses << {
- :ipaddress => addr_v["prefixlen"] ? IPAddress("#{addr}/#{addr_v["prefixlen"]}") : IPAddress("#{addr}/#{addr_v["netmask"]}"),
- :scope => addr_v["scope"].nil? ? nil : addr_v["scope"].downcase,
- :iface => iface
- }
+ # sort ip addresses by scope, by prefixlen and then by ip address
+ # 128 - prefixlen: longest prefixes first
+ ipaddresses.sort_by do |v|
+ [ ( scope_prio.index(v[:scope]) or 999999 ),
+ 128 - v[:ipaddress].prefix.to_i,
+ ( family == "inet" ? v[:ipaddress].to_u32 : v[:ipaddress].to_u128 )
+ ]
end
end
- # sort ip addresses by scope, by prefixlen and then by ip address
- # 128 - prefixlen: longest prefixes first
- ipaddresses.sort_by do |v|
- [ ( scope_prio.index(v[:scope]) or 999999 ),
- 128 - v[:ipaddress].prefix.to_i,
- ( family == "inet" ? v[:ipaddress].to_u32 : v[:ipaddress].to_u128 )
- ]
- end
-end
+ def find_ip(family = "inet")
+ ips=sorted_ips(family)
-def find_ip(family = "inet")
- ips=sorted_ips(family)
+ # return if there isn't any #{family} address !
+ return [ nil, nil ] if ips.empty?
- # return if there isn't any #{family} address !
- return [ nil, nil ] if ips.empty?
+ # shortcuts to access default #{family} interface and gateway
+ int_attr = Ohai::Mixin::NetworkConstants::FAMILIES[family] +"_interface"
+ gw_attr = Ohai::Mixin::NetworkConstants::FAMILIES[family] + "_gateway"
- # shortcuts to access default #{family} interface and gateway
- int_attr = FAMILIES[family] +"_interface"
- gw_attr = FAMILIES[family] + "_gateway"
+ # If we have a default interface that has addresses,
+ # populate the short-cut attributes ipaddress, ip6address and macaddress
+ if network[int_attr]
- # If we have a default interface that has addresses,
- # populate the short-cut attributes ipaddress, ip6address and macaddress
- if network[int_attr]
-
- # working with the address(es) of the default network interface
- gw_if_ips = ips.select do |v|
- v[:iface] == network[int_attr]
- end
- if gw_if_ips.empty?
- Ohai::Log.warn("[#{family}] no ip address on #{network[int_attr]}")
- elsif network[gw_attr] and
- network["interfaces"][network[int_attr]] and
- network["interfaces"][network[int_attr]]["addresses"]
- if [ "0.0.0.0", "::" ].include? network[gw_attr]
- # link level default route
- Ohai::Log.debug("link level default #{family} route, picking ip from #{network[gw_attr]}")
- r = gw_if_ips.first
- else
- # checking network masks
- r = gw_if_ips.select do |v|
- network_contains_address(network[gw_attr], v[:ipaddress], v[:iface])
- end.first
- if r.nil?
+ # working with the address(es) of the default network interface
+ gw_if_ips = ips.select do |v|
+ v[:iface] == network[int_attr]
+ end
+ if gw_if_ips.empty?
+ Ohai::Log.warn("[#{family}] no ip address on #{network[int_attr]}")
+ elsif network[gw_attr] and
+ network["interfaces"][network[int_attr]] and
+ network["interfaces"][network[int_attr]]["addresses"]
+ if [ "0.0.0.0", "::" ].include? network[gw_attr]
+ # link level default route
+ Ohai::Log.debug("link level default #{family} route, picking ip from #{network[gw_attr]}")
r = gw_if_ips.first
- Ohai::Log.warn("[#{family}] no ipaddress/mask on #{network[int_attr]} matching the gateway #{network[gw_attr]}, picking one anyway")
else
- Ohai::Log.debug("[#{family}] Using default interface #{network[int_attr]} and default gateway #{network[gw_attr]} to set the default ip to #{r[:ipaddress]}")
+ # checking network masks
+ r = gw_if_ips.select do |v|
+ network_contains_address(network[gw_attr], v[:ipaddress], v[:iface])
+ end.first
+ if r.nil?
+ r = gw_if_ips.first
+ Ohai::Log.warn("[#{family}] no ipaddress/mask on #{network[int_attr]} matching the gateway #{network[gw_attr]}, picking one anyway")
+ else
+ Ohai::Log.debug("[#{family}] Using default interface #{network[int_attr]} and default gateway #{network[gw_attr]} to set the default ip to #{r[:ipaddress]}")
+ end
end
+ else
+ # return the first ip address on network[int_attr]
+ r = gw_if_ips.first
end
else
- # return the first ip address on network[int_attr]
- r = gw_if_ips.first
+ r = ips.first
+ Ohai::Log.debug("[#{family}] no default interface, picking the first ipaddress")
end
- else
- r = ips.first
- Ohai::Log.debug("[#{family}] no default interface, picking the first ipaddress")
- end
- return [ nil, nil ] if r.nil? or r.empty?
+ return [ nil, nil ] if r.nil? or r.empty?
- [ r[:ipaddress].to_s, r[:iface] ]
-end
+ [ r[:ipaddress].to_s, r[:iface] ]
+ end
-def find_mac_from_iface(iface)
- r = network["interfaces"][iface]["addresses"].select{|k,v| v["family"]=="lladdr"}
- r.nil? or r.first.nil? ? nil : r.first.first
-end
+ def find_mac_from_iface(iface)
+ r = network["interfaces"][iface]["addresses"].select{|k,v| v["family"]=="lladdr"}
+ r.nil? or r.first.nil? ? nil : r.first.first
+ end
-def network_contains_address(address_to_match, ipaddress, iface)
- # address_to_match: String
- # ipaddress: IPAddress
- # iface: String
- if peer = network["interfaces"][iface]["addresses"][ipaddress.to_s][:peer]
- IPAddress(peer) == IPAddress(address_to_match)
- else
- ipaddress.include? IPAddress(address_to_match)
+ def network_contains_address(address_to_match, ipaddress, iface)
+ # address_to_match: String
+ # ipaddress: IPAddress
+ # iface: String
+ if peer = network["interfaces"][iface]["addresses"][ipaddress.to_s][:peer]
+ IPAddress(peer) == IPAddress(address_to_match)
+ else
+ ipaddress.include? IPAddress(address_to_match)
+ end
end
-end
-# ipaddress, ip6address and macaddress can be set by the #{os}::network plugin
-# atm it is expected macaddress is set at the same time than ipaddress
-# if ipaddress is set and macaddress is nil, that means the interface
-# ipaddress is bound to has the NOARP flag
+ # ipaddress, ip6address and macaddress can be set by the #{os}::network plugin
+ # atm it is expected macaddress is set at the same time than ipaddress
+ # if ipaddress is set and macaddress is nil, that means the interface
+ # ipaddress is bound to has the NOARP flag
+ collect_data do
+ results = {}
-results = {}
+ network Mash.new unless network
+ network[:interfaces] = Mash.new unless network[:interfaces]
+ counters Mash.new unless counters
+ counters[:network] = Mash.new unless counters[:network]
-# inet family is treated before inet6
-FAMILIES.keys.sort.each do |family|
- r = {}
- ( r["ip"], r["iface"] ) = find_ip(family)
- r["mac"] = find_mac_from_iface(r["iface"]) unless r["iface"].nil?
- # don't overwrite attributes if they've already been set by the "#{os}::network" plugin
- if family == "inet" and ipaddress.nil?
- if r["ip"].nil?
- Ohai::Log.warn("unable to detect ipaddress")
- # i don't issue this warning if r["ip"] exists and r["mac"].nil?
- # as it could be a valid setup with a NOARP default_interface
- Ohai::Log.warn("unable to detect macaddress")
- else
- ipaddress r["ip"]
- macaddress r["mac"]
- end
- elsif family == "inet6" and ip6address.nil?
- if r["ip"].nil?
- Ohai::Log.warn("unable to detect ip6address")
- else
- ip6address r["ip"]
- if r["mac"] and macaddress.nil? and ipaddress.nil?
- Ohai::Log.debug("macaddress set to #{r["mac"]} from the ipv6 setup")
- macaddress r["mac"]
+ # inet family is treated before inet6
+ Ohai::Mixin::NetworkConstants::FAMILIES.keys.sort.each do |family|
+ r = {}
+ ( r["ip"], r["iface"] ) = find_ip(family)
+ r["mac"] = find_mac_from_iface(r["iface"]) unless r["iface"].nil?
+ # don't overwrite attributes if they've already been set by the "#{os}::network" plugin
+ if family == "inet" and ipaddress.nil?
+ if r["ip"].nil?
+ Ohai::Log.warn("unable to detect ipaddress")
+ # i don't issue this warning if r["ip"] exists and r["mac"].nil?
+ # as it could be a valid setup with a NOARP default_interface
+ Ohai::Log.warn("unable to detect macaddress")
+ else
+ ipaddress r["ip"]
+ macaddress r["mac"]
+ end
+ elsif family == "inet6" and ip6address.nil?
+ if r["ip"].nil?
+ Ohai::Log.warn("unable to detect ip6address")
+ else
+ ip6address r["ip"]
+ if r["mac"] and macaddress.nil? and ipaddress.nil?
+ Ohai::Log.debug("macaddress set to #{r["mac"]} from the ipv6 setup")
+ macaddress r["mac"]
+ end
+ end
end
+ results[family] = r
end
- end
- results[family] = r
-end
-if results["inet"]["iface"] and results["inet6"]["iface"] and
- results["inet"]["iface"] != results["inet6"]["iface"]
- Ohai::Log.debug("ipaddress and ip6address are set from different interfaces (#{results["inet"]["iface"]} & #{results["inet6"]["iface"]}), macaddress has been set using the ipaddress interface")
+ if results["inet"]["iface"] and results["inet6"]["iface"] and
+ results["inet"]["iface"] != results["inet6"]["iface"]
+ Ohai::Log.debug("ipaddress and ip6address are set from different interfaces (#{results["inet"]["iface"]} & #{results["inet6"]["iface"]}), macaddress has been set using the ipaddress interface")
+ end
+ end
end