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