Class: Facter::Util::IP::Windows
- Inherits:
-
Object
- Object
- Facter::Util::IP::Windows
- Defined in:
- lib/facter/util/ip/windows.rb
Defined Under Namespace
Constant Summary collapse
- WMI_IP_INFO_QUERY =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The WMI query used to return ip information
'SELECT Description, ServiceName, IPAddress, IPConnectionMetric, InterfaceIndex, Index, IPSubnet, MACAddress, MTU, SettingID FROM Win32_NetworkAdapterConfiguration WHERE IPConnectionMetric IS NOT NULL AND IPEnabled = TRUE'
- WINDOWS_LABEL_WMI_MAP =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Mapping fact names to WMI properties of the Win32_NetworkAdapterConfiguration
{ :ipaddress => 'IPAddress', :ipaddress6 => 'IPAddress', :macaddress => 'MACAddress', :netmask => 'IPSubnet' }
Class Method Summary collapse
-
.convert_netmask_from_hex? ⇒ Boolean
private
Windows doesn’t display netmask in hex.
-
.get_preferred_ipv4_adapters ⇒ Array<WIN32OLE>
private
Gets a list of active IPv4 network adapter configurations sorted by the lowest IP connection metric.
-
.get_preferred_ipv6_adapters ⇒ Array<WIN32OLE>
private
Gets a list of active IPv6 network adapter configurations sorted by the lowest IP connection metric.
-
.get_preferred_network_adapters(bindings) ⇒ Array<WIN32OLE>
private
Gets a list of active network adapter configurations sorted by the lowest IP connection metric.
-
.interfaces ⇒ Array<String>
private
Retrieves a list of unique interfaces names.
-
.network_adapter_configurations ⇒ Array<WIN32OLE>
private
Returns an array of partial Win32_NetworkAdapterConfiguration objects.
- .to_s ⇒ Object
-
.valid_ipv4_address?(ip_address) ⇒ Boolean
private
Determines if the value passed in is a valid ipv4 address.
-
.valid_ipv6_address?(ip_address) ⇒ Boolean
private
Determines if the value passed in is a valid ipv6 address.
-
.value_for_interface_and_label(interface, label) ⇒ String
private
Get the value of an interface and label.
Class Method Details
.convert_netmask_from_hex? ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Windows doesn’t display netmask in hex.
33 34 35 |
# File 'lib/facter/util/ip/windows.rb', line 33 def self.convert_netmask_from_hex? false end |
.get_preferred_ipv4_adapters ⇒ Array<WIN32OLE>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Gets a list of active IPv4 network adapter configurations sorted by the lowest IP connection metric. If two configurations have the same metric, then the IPv4 specific binding order as specified in the registry will be used.
114 115 116 |
# File 'lib/facter/util/ip/windows.rb', line 114 def self.get_preferred_ipv4_adapters get_preferred_network_adapters(Bindings4.new) end |
.get_preferred_ipv6_adapters ⇒ Array<WIN32OLE>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Gets a list of active IPv6 network adapter configurations sorted by the lowest IP connection metric. If two configurations have the same metric, then the IPv6 specific binding order as specified in the registry will be used.
126 127 128 |
# File 'lib/facter/util/ip/windows.rb', line 126 def self.get_preferred_ipv6_adapters get_preferred_network_adapters(Bindings6.new) end |
.get_preferred_network_adapters(bindings) ⇒ Array<WIN32OLE>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Gets a list of active network adapter configurations sorted by the lowest IP connection metric. If two configurations have the same metric, then the adapter binding order as specified in the registry will be used. Note the order may different for IPv4 vs IPv6 addresses.
139 140 141 142 143 144 145 146 147 148 149 150 |
# File 'lib/facter/util/ip/windows.rb', line 139 def self.get_preferred_network_adapters(bindings) network_adapter_configurations.select do |nic| bindings.bindings.include?(nic.SettingID) end.sort do |nic_left,nic_right| cmp = nic_left.IPConnectionMetric <=> nic_right.IPConnectionMetric if cmp == 0 bindings.bindings[nic_left.SettingID] <=> bindings.bindings[nic_right.SettingID] else cmp end end end |
.interfaces ⇒ Array<String>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Retrieves a list of unique interfaces names.
42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/facter/util/ip/windows.rb', line 42 def self.interfaces interface_names = [] network_adapter_configurations.map do |nic| Facter::Util::WMI.execquery("SELECT * FROM Win32_NetworkAdapter WHERE Index = #{nic.Index} AND NetEnabled = TRUE").each do |nic| interface_names << nic.NetConnectionId unless nic.NetConnectionId.nil? or nic.NetConnectionId.empty? end end interface_names.uniq end |
.network_adapter_configurations ⇒ Array<WIN32OLE>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns an array of partial Win32_NetworkAdapterConfiguration objects.
97 98 99 100 101 102 103 104 |
# File 'lib/facter/util/ip/windows.rb', line 97 def self.network_adapter_configurations nics = [] # WIN32OLE doesn't implement Enumerable Facter::Util::WMI.execquery(WMI_IP_INFO_QUERY).each do |nic| nics << nic end nics end |
.to_s ⇒ Object
24 25 26 |
# File 'lib/facter/util/ip/windows.rb', line 24 def self.to_s 'windows' end |
.valid_ipv4_address?(ip_address) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Determines if the value passed in is a valid ipv4 address.
186 187 188 189 190 191 192 193 194 195 196 197 |
# File 'lib/facter/util/ip/windows.rb', line 186 def self.valid_ipv4_address?(ip_address) String(ip_address).scan(/(?:[0-9]{1,3}\.){3}[0-9]{1,3}/).each do |match| # excluding 169.254.x.x in Windows - this is the DHCP APIPA # meaning that if the node cannot get an ip address from the dhcp server, # it auto-assigns a private ip address unless match == "127.0.0.1" or match =~ /^169.254.*/ return !!match end end false end |
.valid_ipv6_address?(ip_address) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Determines if the value passed in is a valid ipv6 address.
205 206 207 208 209 210 211 212 213 |
# File 'lib/facter/util/ip/windows.rb', line 205 def self.valid_ipv6_address?(ip_address) String(ip_address).scan(/(?>[0-9,a-f,A-F]*\:{1,2})+[0-9,a-f,A-F]{0,4}/).each do |match| unless match =~ /fe80.*/ or match == "::1" return !!match end end false end |
.value_for_interface_and_label(interface, label) ⇒ String
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Get the value of an interface and label. For example, you may want to find the MTU for eth0.
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/facter/util/ip/windows.rb', line 62 def self.value_for_interface_and_label(interface, label) wmi_value = WINDOWS_LABEL_WMI_MAP[label.downcase.to_sym] label_value = nil Facter::Util::WMI.execquery("SELECT Index FROM Win32_NetworkAdapter WHERE NetConnectionID = '#{interface}'").each do |nic| Facter::Util::WMI.execquery("SELECT #{wmi_value} FROM Win32_NetworkAdapterConfiguration WHERE Index = #{nic.Index}").each do |nic_config| case label.downcase.to_sym when :ipaddress nic_config.IPAddress.any? do |addr| label_value = addr if valid_ipv4_address?(addr) label_value end when :ipaddress6 nic_config.IPAddress.any? do |addr| label_value = addr if Facter::Util::IP::Windows.valid_ipv6_address?(addr) label_value end when :netmask nic_config.IPSubnet.any? do |addr| label_value = addr if Facter::Util::IP::Windows.valid_ipv4_address?(addr) label_value end when :macaddress label_value = nic_config.MACAddress end end end label_value end |