class SnsUtils::AddressExtractor

Constants

IP_REGEX

Attributes

file[RW]
ip_addrs[RW]
ip_addrs_log[RW]
mac_addrs[RW]
mac_addrs_log[RW]
options[RW]

Public Class Methods

new(argv) click to toggle source
# File lib/sns_utils/address_extractor.rb, line 16
def initialize(argv)
  @file, @options = parse_options(argv)
  self.ip_addrs = {}
  self.mac_addrs = {}
end

Public Instance Methods

run() click to toggle source
# File lib/sns_utils/address_extractor.rb, line 22
def run
  extract_addresses
  log_ip_addrs
  log_mac_addrs
  self
end

Private Instance Methods

extract_addresses() click to toggle source
# File lib/sns_utils/address_extractor.rb, line 31
def extract_addresses
  File.open(file, 'r').each do |line|
    line.scan(IP_REGEX).each do |md|
      log_addr(md[0].to_s.strip)
    end
  end
end
log_addr(ip) click to toggle source
# File lib/sns_utils/address_extractor.rb, line 60
def log_addr(ip)
  key = IPAddr.new(ip).to_string
  ip_addrs[key] ||= 0
  ip_addrs[key] += 1
rescue IPAddr::InvalidAddressError => e
  mac_addrs[ip] ||= 0
  mac_addrs[ip] += 1
rescue IPAddr::AddressFamilyError => e
  $stderr.puts(e.message)
end
log_ip_addrs() click to toggle source
# File lib/sns_utils/address_extractor.rb, line 39
def log_ip_addrs
  self.ip_addrs_log = ip_addrs.select { |_, count| count >= options.ip_threshold }.keys
  write_file(::SnsUtils.ip_out_file, ip_addrs_log)
end
log_mac_addrs() click to toggle source
# File lib/sns_utils/address_extractor.rb, line 44
def log_mac_addrs
  self.mac_addrs_log = mac_addrs.select { |_, count| count >= options.mac_threshold }.keys
  write_file(::SnsUtils.mac_out_file, mac_addrs_log)
end
output_dir(dir, file) click to toggle source
# File lib/sns_utils/address_extractor.rb, line 56
def output_dir(dir, file)
  dir ? File.expand_path(File.join(dir, file)) : file
end
parse_options(argv) click to toggle source
# File lib/sns_utils/address_extractor.rb, line 71
def parse_options(argv)
  options = OpenStruct.new
  options.mac_threshold = 8
  options.ip_threshold = 10
  options.output_dir = nil

  parser = OptionParser.new do |opts|
    opts.on("-m N", Integer, "MAC address threshold, logs entries with N <= occurrences") do |n|
      options.mac_threshold = Integer(n).abs
    end

    opts.on("-i N", Integer, "IP address threshold, logs entries with N =< occurrences") do |n|
      options.ip_threshold = Integer(n).abs
    end

    opts.on("-d OUTPUT_DIR", String, "Dir used to write output files") do |dir|
      options.output_dir = dir
    end
  end

  parser.parse(argv)

  file = argv[0] || raise(OptionParser::InvalidOption.new)
  [file, options]
end
write_file(file, entries) click to toggle source
# File lib/sns_utils/address_extractor.rb, line 49
def write_file(file, entries)
  file_path = output_dir(options.output_dir, file)
  File.open(file_path, "w+") do |f|
    entries.each { |e| f.puts(e) }
  end
end