class Inspec::Resources::WindowsInterface

Public Instance Methods

interface_info(iface) click to toggle source
# File lib/inspec/resources/interface.rb, line 212
def interface_info(iface)
  # gather all network interfaces
  cmd = inspec.command("Get-NetAdapter | Select-Object -Property Name, InterfaceDescription, Status, State, " \
                       "MacAddress, LinkSpeed, ReceiveLinkSpeed, TransmitLinkSpeed, Virtual | ConvertTo-Json")

  addr_cmd = inspec.command("Get-NetIPAddress | Select-Object -Property IPv6Address, IPv4Address, InterfaceAlias," \
                            " PrefixLength | ConvertTo-Json")

  # filter network interface
  begin
    net_adapter = JSON.parse(cmd.stdout)
    addresses = JSON.parse(addr_cmd.stdout)
  rescue JSON::ParserError => _e
    return nil
  end

  # ensure we have an array of groups
  net_adapter = [net_adapter] unless net_adapter.is_a?(Array)
  addresses = [addresses] unless addresses.is_a?(Array)

  # select the requested interface
  adapters = net_adapter.each_with_object([]) do |adapter, adapter_collection|
    # map object
    info = {
      name: adapter["Name"],
      up: adapter["State"] == 2,
      speed: adapter["ReceiveLinkSpeed"] / 1000,
      ipv4_addresses: addresses_for_proto(addresses, adapter["Name"], "IPv4"),
      ipv6_addresses: addresses_for_proto(addresses, adapter["Name"], "IPv6"),
    }
    adapter_collection.push(info) if info[:name].casecmp(iface) == 0
  end

  return nil if adapters.empty?

  warn "[Possible Error] detected multiple network interfaces with the name #{iface}" if adapters.size > 1
  adapters[0]
end

Private Instance Methods

addresses_for_proto(all_addresses, iface, proto) click to toggle source
# File lib/inspec/resources/interface.rb, line 253
def addresses_for_proto(all_addresses, iface, proto)
  all_addresses.select { |i| i["InterfaceAlias"] == iface }
    .map { |i| "#{i["#{proto}Address"]}/#{i["PrefixLength"]}" unless i["#{proto}Address"].nil? }
    .compact
end