Class: Facter::Util::IP::Windows

Inherits:
Object
  • Object
show all
Defined in:
lib/facter/util/ip/windows.rb

Defined Under Namespace

Classes: Bindings4, Bindings6

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

Returns:

  • (String)
'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

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.

Returns:

  • (Boolean)

    false by default



33
34
35
# File 'lib/facter/util/ip/windows.rb', line 33

def self.convert_netmask_from_hex?
  false
end

.get_preferred_ipv4_adaptersArray<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.

Returns:



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_adaptersArray<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.

Returns:



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.

Returns:

See Also:



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

.interfacesArray<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.

Returns:



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_configurationsArray<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.

Returns:

  • (Array<WIN32OLE>)

    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_sObject



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.

Parameters:

  • ip_address (String)

    the IPv4 address to validate

Returns:

  • (Boolean)


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.

Parameters:

  • ip_address (String)

    the IPv6 address to validate

Returns:

  • (Boolean)


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.

Parameters:

  • interface (String)

    the name of the interface returned by the #interfaces method.

  • label (String)

    the type of value to return, e.g. ipaddress

Returns:

  • (String)

    the value, or nil if not defined



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