Module Facter::Util::IP
In: lib/facter/util/ip.rb

A base module for collecting IP-related information from all kinds of platforms.

Methods

Constants

REGEX_MAP = { :linux => { :ipaddress => /inet addr:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/, :macaddress => /(?:ether|HWaddr)\s+(\w{1,2}:\w{1,2}:\w{1,2}:\w{1,2}:\w{1,2}:\w{1,2})/, :netmask => /Mask:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/   A map of all the different regexes that work for a given platform or set of platforms.

Public Class methods

Convert an interface name into purely alpha characters.

[Source]

    # File lib/facter/util/ip.rb, line 26
26:     def self.alphafy(interface)
27:         interface.gsub(/[:.]/, '_')
28:     end

[Source]

    # File lib/facter/util/ip.rb, line 30
30:     def self.convert_from_hex?(kernel)
31:         kernels_to_convert = [:sunos, :openbsd, :netbsd, :freebsd, :darwin]
32:         kernels_to_convert.include?(kernel)
33:     end

[Source]

    # File lib/facter/util/ip.rb, line 61
61:     def self.get_all_interface_output
62:         case Facter.value(:kernel)
63:         when 'Linux', 'OpenBSD', 'NetBSD', 'FreeBSD', 'Darwin'
64:             output = %x{/sbin/ifconfig -a}
65:         when 'SunOS'
66:             output = %x{/usr/sbin/ifconfig -a}
67:         end
68:         output
69:     end

[Source]

    # File lib/facter/util/ip.rb, line 82
82:     def self.get_bonding_master(interface)
83:         if Facter.value(:kernel) != 'Linux'
84:             return nil
85:         end
86:         # We need ip instead of ifconfig because it will show us
87:         # the bonding master device.
88:         if not FileTest.executable?("/sbin/ip")
89:             return nil
90:         end
91:         regex = /SLAVE[,>].* (bond[0-9]+)/
92:             ethbond = regex.match(%x{/sbin/ip link show #{interface}})
93:         if ethbond
94:             device = ethbond[1]
95:         else
96:             device = nil
97:         end
98:         device
99:     end

[Source]

     # File lib/facter/util/ip.rb, line 102
102:     def self.get_interface_value(interface, label)
103:         tmp1 = []
104: 
105:         kernel = Facter.value(:kernel).downcase.to_sym
106: 
107:         # If it's not directly in the map or aliased in the map, then we don't know how to deal with it.
108:         unless map = REGEX_MAP[kernel] || REGEX_MAP.values.find { |tmp| tmp[:aliases] and tmp[:aliases].include?(kernel) }
109:             return []
110:         end
111: 
112:         # Pull the correct regex out of the map.
113:         regex = map[label.to_sym]
114: 
115:         # Linux changes the MAC address reported via ifconfig when an ethernet interface
116:         # becomes a slave of a bonding device to the master MAC address.
117:         # We have to dig a bit to get the original/real MAC address of the interface.
118:         bonddev = get_bonding_master(interface)
119:         if label == 'macaddress' and bonddev
120:             bondinfo = IO.readlines("/proc/net/bonding/#{bonddev}")
121:             hwaddrre = /^Slave Interface: #{interface}\n[^\n].+?\nPermanent HW addr: (([0-9a-fA-F]{2}:?)*)$/m
122:             value = hwaddrre.match(bondinfo.to_s)[1].upcase
123:         else
124:             output_int = get_single_interface_output(interface)
125: 
126:             if interface != /^lo[0:]?\d?/
127:                 output_int.each do |s|
128:                     if s =~ regex
129:                         value = $1
130:                         if label == 'netmask' && convert_from_hex?(kernel)
131:                             value = value.scan(/../).collect do |byte| byte.to_i(16) end.join('.')
132:                         end
133:                         tmp1.push(value)
134:                     end
135:                 end
136:             end
137: 
138:             if tmp1
139:                 value = tmp1.shift
140:             end
141:         end
142:     end

[Source]

    # File lib/facter/util/ip.rb, line 47
47:     def self.get_interfaces
48:         int = nil
49: 
50:         output =  Facter::Util::IP.get_all_interface_output()
51: 
52:         # We get lots of warnings on platforms that don't get an output
53:         # made.
54:         if output
55:             int = output.scan(/^\w+[.:]?\d+/)
56:         else
57:             []
58:         end
59:     end

[Source]

     # File lib/facter/util/ip.rb, line 144
144:     def self.get_network_value(interface)
145:         require 'ipaddr'
146: 
147:         ipaddress = get_interface_value(interface, "ipaddress")
148:         netmask = get_interface_value(interface, "netmask")
149:         
150:         if ipaddress && netmask
151:             ip = IPAddr.new(ipaddress, Socket::AF_INET)
152:             subnet = IPAddr.new(netmask, Socket::AF_INET)
153:             network = ip.mask(subnet.to_s).to_s
154:         end
155:     end

[Source]

    # File lib/facter/util/ip.rb, line 71
71:     def self.get_single_interface_output(interface)
72:         output = ""
73:         case Facter.value(:kernel)
74:         when 'Linux', 'OpenBSD', 'NetBSD', 'FreeBSD', 'Darwin'
75:             output = %x{/sbin/ifconfig #{interface}}
76:         when 'SunOS'
77:             output = %x{/usr/sbin/ifconfig #{interface}}
78:         end
79:         output
80:     end

[Source]

    # File lib/facter/util/ip.rb, line 35
35:     def self.supported_platforms
36:         REGEX_MAP.inject([]) do |result, tmp|
37:             key, map = tmp
38:             if map[:aliases]
39:                 result += map[:aliases]
40:             else
41:                 result << key
42:             end
43:             result
44:         end
45:     end

[Validate]