#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $avgBytes;
my $bytesUrl;
my $bytesNum;
my $bytesDate;
my @reqLines;
my @cleanReqLines;
my %hits;
my %bytes;
#function to strip whitespace, which seperate fields, and replace it with commas. After substr the trailing comma
#the result is a comma seperated list
sub stripWS
{
my $line=shift;
$line =~ s/\s+/,/g;
return $line;
}
#returns a url version of the file name. substr off the .txt
sub getUrl
{
my $file=shift;
$file =~ s/^.*?-//;
if($file !~ /2001/)
{
$file =~ s/-/\//g;
}
else
{
substr($file, index($file, '-'), 1)='/';
}
$file=substr($file, 0, -4);
return $file
}
sub formatDate
{
my @months=qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
my $full = shift;
my @pieces=split("/", $full);
my $month=$pieces[0];
my $mindex = int($month) - 1;
my $day=$pieces[1];
my $year=$pieces[2];
my $monthAbr=$months[$mindex];
my $pretty=$day."/".$monthAbr."/20".$year;
return $pretty;
}
sub getBytes
{
my $bytesDir='Bytes/';
opendir(my $bytesDirH, $bytesDir) or die $!;
while(my $file=readdir($bytesDirH))
{
if($file eq ".DS_Store" || $file eq "." || $file eq "..")
{
next;
}
my $bytesUrl=&getUrl($file);
# print "$bytesDir$file\n";
open(my $bytesFh, "<", "$bytesDir/$file") or die $!;
chomp(my @byteLines=<$bytesFh>);
my $year=3;
foreach my $byteLine(@byteLines)
{
if($byteLine =~ /#/)
{
next;
}
if(length($byteLine) == 0)
{
next;
}
if(!defined($byteLine))
{
next;
}
if ($byteLine !~ /\d/)
{
next;
}
$byteLine=&stripWS($byteLine);
my @byteParts=split(',',$byteLine);
if($byteParts[1] eq "01/01")
{
$year++;
}
$byteLine = join(",",@byteParts);
(substr($byteLine, index($byteLine, '/') + 3,0)) = "/0$year";
@byteParts=split(',',$byteLine);
if(length($byteParts[1]) == 0)
{
next;
}
my $cleanBytesDate=&formatDate($byteParts[1]);
push(@{$bytes{$bytesUrl}}, $cleanBytesDate . "," . $byteParts[2]);
}
}
close $bytesDirH;
}
sub formatRow
{
my $data=shift;
my @pieces=split(",",$data);
my $formatedRow="127.0.0.1 - - [$pieces[0]:12:00:00 -0400] \"GET /$pieces[2] HTTP/1.1\" 200 $pieces[3] \"http://www.gulfofmaine.org/wgb.php\" \"Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8\"";
return $formatedRow;
}
sub printLines
{
my %hash = @_;
my @keys = sort(keys(%hash));
foreach my $key(@keys)
{
foreach my $array($hash{$key})
{
foreach my $item(@{$array})
{
print "$item\n\n";
}
}
}
}
sub round
{
my($number) = shift;
return int($number + .5);
}
&getBytes;
my $dir='RequestedPages/';
opendir(my $required, $dir) or die $!;
while(my $file=readdir($required))
{
next unless (-f "$dir/$file");
my $url = &getUrl($file);
open(my $reqfile, "<", "$dir/$file") or die $!;
chomp(@reqLines=<$reqfile>);
my $year=3;
foreach my $tmpLine(@reqLines)
{
if($tmpLine =~ /#/)
{
next;
}
if(length($tmpLine) == 0)
{
next;
}
if(!defined($tmpLine))
{
next;
}
$tmpLine=&stripWS($tmpLine);
$tmpLine.=",$url";
my @parts=split(',',$tmpLine);
if($parts[1] eq "01/01")
{
$year++;
}
$tmpLine = join(",",@parts);
(substr($tmpLine, index($tmpLine, '/') + 3,0)) = "/0$year";
@parts=split(',',$tmpLine);
if(length($parts[1]) == 0)
{
next;
}
my $cleanDate=&formatDate($parts[1]);
delete $parts[0];
my $cleanLine=$cleanDate . "," . $parts[2] . "," . $parts[3] . ",";
foreach my $byteRow(@{$bytes{$url}})
{
my @bytesTmp=split(',',$byteRow);
if($bytesTmp[0] eq $cleanDate)
{
$avgBytes=0;
#If number of hits does not equal zero, then do division
if($parts[2] != 0)
{
$avgBytes=$bytesTmp[1]/$parts[2];
$avgBytes=round($avgBytes);
}
#otherwise, 0hits=0bytes
else
{
$avgBytes=0;
}
$cleanLine.=$avgBytes;
my $row=&formatRow($cleanLine);
for(my $i=0; $i<$parts[2]; $i++)
{
push(@{$hits{$cleanDate}}, $row);
}
}
}
}
}
#print Dumper(%hits);
&printLines(%hits);