class Inspec::Resources::LinuxInterface

Public Instance Methods

interface_info(iface) click to toggle source
# File lib/inspec/resources/interface.rb, line 157
def interface_info(iface)
  # will return "[mtu]\n1500\n[type]\n1"
  cmd = inspec.command("find /sys/class/net/#{iface}/ -maxdepth 1 -type f -exec sh -c 'echo \"[$(basename {})]\"; cat {} || echo -n' \\;")
  return nil if cmd.exit_status.to_i != 0

  # parse values, we only recieve values, therefore we threat them as keys
  params = SimpleConfig.new(cmd.stdout.chomp).params

  # abort if we got an empty result-set
  return nil if params.empty?

  # parse state
  state = false
  if params.key?("operstate")
    operstate, _value = params["operstate"].first
    state = operstate == "up"
  end

  # parse speed
  speed = nil
  if params.key?("speed")
    speed, _value = params["speed"].first
    speed = convert_to_i(speed)
  end

  family_addresses = addresses(iface)
  {
    name: iface,
    up: state,
    speed: speed,
    ipv4_addresses: family_addresses["inet"],
    ipv6_addresses: family_addresses["inet6"],
  }
end

Private Instance Methods

addresses(iface) click to toggle source
# File lib/inspec/resources/interface.rb, line 194
def addresses(iface)
  addrs_by_family = { "inet6" => [], "inet" => [] }
  [4, 6].each do |v|
    cmd = inspec.command("/sbin/ip -br -#{v} address show dev #{iface}")
    next unless cmd.exit_status.to_i == 0

    family = v == 6 ? "inet6" : "inet"

    cmd.stdout.each_line do |line|
      _dev, _state, *addrs = line.split(/\s+/)
      addrs_by_family[family] = addrs
    end
  end
  addrs_by_family
end