class LogEntries

Constants

REDIRECT_MAX

number of permissable redirects

REDIRECT_WINDOW

span of time to check redirects

Attributes

entries[R]

Public Class Methods

new(log_file, output_file) click to toggle source
# File lib/log_entries.rb, line 10
def initialize(log_file, output_file)
  @log_file, @output_file = log_file, output_file
  @entries = {}
end

Public Instance Methods

add(log_entry) click to toggle source
# File lib/log_entries.rb, line 15
def add(log_entry)
  @entries[log_entry.ip.to_s] ||= []
  @entries[log_entry.ip.to_s] << log_entry
end
create_blocklist() click to toggle source
# File lib/log_entries.rb, line 49
def create_blocklist
  new_blocks  = sketch_ips
  curr_blocks = []

  if(File.file?(@output_file))
    curr_blocks += File.read(@output_file).split("\n")
  end

  results = (curr_blocks + new_blocks).uniq.
              reject(&:empty?).
              sort_by { |ip| IP.new(ip).to_binary }
  File.write(@output_file, results.join("\n"))
end
exceeds_window(time_arr) click to toggle source
# File lib/log_entries.rb, line 43
def exceeds_window(time_arr)
  return false if time_arr.count < REDIRECT_MAX
  return true  if (time_arr[REDIRECT_MAX - 1] - time_arr.first) < REDIRECT_WINDOW
  exceeds_window(time_arr[1..-1])
end
sketch?(ip) click to toggle source
# File lib/log_entries.rb, line 20
def sketch?(ip)
  return false unless entries[ip.to_s]
  redirects = entries[ip.to_s].select{ |entry| entry.redirect? }

  ip.sketch? &&
    redirects.count > REDIRECT_MAX &&
    exceeds_window(redirects.map(&:time))
end
sketch_ips() click to toggle source
# File lib/log_entries.rb, line 29
def sketch_ips
  File.open(@log_file, 'r').each_line do |line|
    if(entry = LogEntry.parse(line))
      self.add(LogEntry.new(entry))
    end
  end

  sketchy = []
  self.entries.values.map(&:first).each do |entry|
    sketchy << entry.ip.to_s if self.sketch?(entry.ip)
  end
  sketchy
end