| #!/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); |
| } |
| } |
| |