def _format(key, value) rv = [] value = nil if value =~ /Not received/i begin case key when :autoneg v0, v1 = value.split('/') rv << [:autoneg_supported, (v0 == 'supported')] rv << [:autoneg_enabled, (v1 == 'enabled')] when :mgmt_ip rv << [:management_ip, value] when :mau_oper_type rv << [:mau_type, value] when :port_id value = value.split(' ') value = value.select{|i| i =~ /..:..:..:..:..:../ }.first rv << [:port_mac, value.upcase] when :chassis_id value = value.split(' ') value = value.select{|i| i =~ /..:..:..:..:..:../ }.first rv << [:chassis_mac, value.upcase] when :port_descr port = value.split(/[^0-9]([0-9])/, 2) port.shift port = port.join('') rv << [:port_name, value] rv << [:port, port] when :mfs rv << [:mfs, (value.split(' ').first.to_i rescue nil)] when :sys_name rv << [:switch, value] when :lldp_med_device_type, :lldp_med_capabilities, :caps, :sys_descr return [] else rv << [key, value] end rescue nil end return rv end # Typefix for interfaces fact Facter.add('network_interfaces') do setcode do Facter.value("interfaces").split(',') end end default_if = Facter::Util::Resolution.exec('ip route | grep "^default" | tr -s " " | cut -d " " -f5') # attempt to use 'route -n' if 'ip route' failed somehow if default_if.nil? or not Facter.value('interfaces').to_s.split(',').include?(default_if) STDERR.puts("Falling back to 'route -n' for default interface detection") default_if = Facter::Util::Resolution.exec('route -n | grep "^0.0.0.0" | tr -s " " | cut -d " " -f8') end Facter.add('default_gateway') do setcode do default_gw = Facter::Util::Resolution.exec('ip route | grep "^default" | tr -s " " | cut -d " " -f3') # 'ip route' default gateway looks like an IP address, cool! if default_gw.to_s =~ /[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ default_gw else STDERR.puts("Falling back to 'route -n' for default gateway detection") Facter::Util::Resolution.exec('route -n | grep "UG" | tr -s " " | cut -d" " -f2') end end end if default_if begin default_if.strip! default_if.chomp! Facter.add('default_interface') do setcode { default_if } end Facter.add('default_macaddress') do setcode { Facter.value("macaddress_#{default_if}") } end Facter.add('default_ipaddress') do setcode { Facter.value("ipaddress_#{default_if}") } end rescue nil end else # no default interface could be determined, fallback to sane defaults #- Facter.add('default_macaddress') do setcode { Facter.value("macaddress") } end Facter.add('default_ipaddress') do setcode { Facter.value("ipaddress") } end end # LLDP begin require 'xmlsimple' current_iface = nil network_lldp = {} output = Facter::Util::Resolution.exec('lldpctl -f xml') if not output.nil? # XML formatting worked, parse as such if output[0..1] == ' e STDERR.puts "#{e.name}: #{e.message}" e.backtrace.each do |b| STDERR.puts b end end