class Inspec::Resources::NetworkInterface

def exists?

def exists?
  !!(interface_info && interface_info[:name])
end

def initialize(iface)

def initialize(iface)
  @iface = iface
end

def interface_info

def interface_info
  @cache ||= begin
               provider = LinuxInterface.new(inspec) if inspec.os.linux?
               provider = WindowsInterface.new(inspec) if inspec.os.windows?
               provider = BsdInterface.new(inspec) if inspec.os.bsd? # includes macOS
               Hash(provider && provider.interface_info(@iface))
             end
end

def ipv4_address

def ipv4_address
  ipv4_addresses.first
end

def ipv4_address?

def ipv4_address?
  ipv4_addresses && !ipv4_addresses.empty?
end

def ipv4_addresses

def ipv4_addresses
  ipv4_cidrs.map { |i| i.split("/")[0] }
end

def ipv4_addresses_netmask

def ipv4_addresses_netmask
  ipv4_cidrs.map { |i| i.split("/") }.map do |addr, netlen|
    binmask = "#{"1" * netlen.to_i}#{"0" * (32 - netlen.to_i)}".to_i(2)
    netmask = []
    (1..4).each do |_byte|
      netmask.unshift(binmask & 255)
      binmask = binmask >> 8
    end
    "#{addr}/#{netmask.join(".")}"
  end
end

def ipv4_cidrs

def ipv4_cidrs
  interface_info && Array(interface_info[:ipv4_addresses])
end

def ipv6_address

def ipv6_address
  ipv6_addresses.first
end

def ipv6_address?

def ipv6_address?
  ipv6_addresses && !ipv6_addresses.empty?
end

def ipv6_addresses

def ipv6_addresses
  ipv6_cidrs.map { |i| i.split("/")[0] }
end

def ipv6_cidrs

def ipv6_cidrs
  interface_info && Array(interface_info[:ipv6_addresses])
end

def name

def name
  interface_info[:name]
end

def resource_id

def resource_id
  @iface || "Interface"
end

def speed

returns link speed in Mbits/sec
def speed
  interface_info && interface_info[:speed]
end

def to_s

def to_s
  "Interface #{@iface}"
end

def up?

def up?
  !!(interface_info && interface_info[:up])
end