module Pingfacts

Constants

VERSION

Public Class Methods

scan(network_args, method=Net::Ping::External) click to toggle source
# File lib/pingfacts.rb, line 114
def self.scan(network_args, method=Net::Ping::External)
  network_list = []
  pingers = []
  onlines = []

  if network_args.class == Array
    network_list += network_args
  else
    network_list << network_args
  end

  network_list.each do |network|
    begin
      ip_range = IPAddr.new(network).to_range

      ip_range.each do |ip|
        pingers << Thread.new do
          pinger = Net::Ping::External.new(ip.to_s)
          if pinger.ping?
            onlines << ip.to_s
          end
        end
      end
    rescue IPAddr::InvalidAddressError
      pingers << Thread.new do
        pinger = Net::Ping::External.new(network)
        if pinger.ping?
          onlines << network
        end
      end
    end
  end

  pingers.each do |t|
    t.join
  end

  mac_addresses = {}
  begin
    `ip neigh`.lines.each do |line|
      r = line.split(/\s+/)
      if r[3] == "lladdr"
        mac_addresses[r[0].strip] = r[4].strip
      end
    end
  rescue
    nil
  end

  result = []

  onlines.each do |ip|
    ipresult = PingerResult.new
    ipresult.ip = ip
    if mac_addresses.key?(ip)
      ipresult.mac = mac_addresses[ip]
    end
    begin
      ipresult.dnsname = Resolv.getname(ip)
    rescue Resolv::ResolvError
      ipresult.ip = Resolv.getaddress(ip)
      ipresult.dnsname = ip
    rescue
      nil
    end

    result << ipresult
  end

  result
end