#!/usr/bin/env ruby
# Copyright 2010 Thomas Stromberg - All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
#
# lasthit, part of iExploder
# 
# Shows statistics about recent agents that have tested with iExploder. 
# It takes all or part of an apache logfile via stdin, and outputs a list
# of all the agents who tested within that section, what their last test
# was, and how many tests they have done.

# The usefulness is finding out where a browser crashed.

require 'cgi'

hostHash = Hash.new

if (ARGV[0])
	file = File.open(ARGV[0])
else
  puts "No filename specified, waiting for data via stdin..."
	file = $stdin
end

last_index = nil
file.readlines.each_with_index { |line, index|
  # filter out mime hits as they produce a lot of odd user agents
  next if line =~ /&m=/
	if (line =~ /([\w\.]+) - - .*iexploder.cgi\?(.*?)&b=([\w\%-\.+]+)/)
		host = $1
		test_url = $2
		agent = $3
		if (! hostHash[host])
			hostHash[host] = Hash.new
		end
		if (! hostHash[host][agent])
			hostHash[host][agent] = Hash.new
			hostHash[host][agent]['total'] = 0
		end
		hostHash[host][agent]['last'] = test_url
		hostHash[host][agent]['total'] = hostHash[host][agent]['total'] + 1
		hostHash[host][agent]['last_line'] = index
	end
  last_index = index
}

printf("%-14.14s | %-25.25s | %6.6s | %7.7s | %s\n",
	 "Host", "Test URL", "Total", "LineAgo", "Agent")
puts "-" * 78
hostHash.each_key { |host|
	hostHash[host].each_key { |agent|
    next if agent.length < 8
    display_agent = CGI::unescape(agent).sub('U; ', '')
		printf("%-14.14s | %-25.25s | %6.6s | %7.7s | %s\n",
			host, hostHash[host][agent]['last'],
      hostHash[host][agent]['total'],
      hostHash[host][agent]['last_line'] - last_index,
      display_agent);
	}
}

