#!/usr/bin/perl -w
use strict;
use Date::Calc qw( Date_to_Days );

####### DETECTION SYSTEME #####
my $screen_clear;
if ($^O =~ /MSWin32/) {
    $screen_clear = "cls";
}
else {
    $screen_clear = "clear";
}
###############################

########## VARIABLES ##########
my $APACHE = q{([\d.]+)[-\s]+\[(\w+)/(\w+)/(\d+)[\d:]+\s\+\d+\] "([A-Z]+) /(\S+) .*" (\d+) (\d+) "(.*)" "(.*)"};
my $IIS = q{(\d+)-(\d+)-(\d+) [\d:]+ ([\d.]+) - ([A-Z]+) /(.*) (\d+) (\d+) - (.*) ((?:http://)?www.*)/};
my ($choix, $sombyte);
my ($ip,$jour,$mois,$annee,$method,$page,$ret_code,$byte,$referer,$user_a);
my ($lower,$upper,$date);
my ($jourin,$jourout,$moisin,$moisout,$anneein,$anneeout);
my (%haship,%hashpage,%hashref,%hashua,%hashko);
###############################

#### TEST FICHIER ET DATE #####
if ($#ARGV != 2){
	print ("\nUtilisation : script.pl <fichier_log> <date_debut> <date_fin>\n");
	print ("Exemple : script.pl log.txt 20/01/2009 20/02/2009 \n");
	exit();
}

my $file = $ARGV[0];
my $datein = $ARGV[1];
my $dateout = $ARGV[2];

if (! -e $file){
	print $file," existe pas.\n";
	exit();
}

if ($datein =~ m{^(\d+)/(\d+)/(\d+)$}) {
	$jourin = $1;
	$moisin = $2;
	$anneein = $3;
}

else {
	print ("Erreur de saisie sur date_debut\n");
	exit();
}

if ($dateout =~ m{(\d+)/(\d+)/(\d+)}) {
	$jourout = $1;
	$moisout = $2;
	$anneeout = $3;
}

else {
	print ("Erreur de saisie sur date_fin\n");
	exit();
}
###############################

############ MAIN #############
open (Fichier, "< $file") or die "Ne peux pas ouvrir le fichier $ARGV[0]\n";

while (my $ligne = <Fichier>){
		if ($ligne =~ $APACHE){
			($ip,$jour,$mois,$annee,$method,$page,$ret_code,$byte,$referer,$user_a) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);
	}
		elsif ($ligne =~ $IIS){
			($annee,$mois,$jour,$ip,$method,$page,$ret_code,$byte,$user_a,$referer) = ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);
	}
		$mois = '01' if ($mois eq "Jan");
		$mois = '02' if ($mois eq "Feb");
		$mois = '03' if ($mois eq "Mar"); 
		$mois = '04' if ($mois eq "May");
		$mois = '05' if ($mois eq "Apr");
		$mois = '06' if ($mois eq "Jun");
		$mois = '07' if ($mois eq "Jul");
		$mois = '08' if ($mois eq "Aug");
		$mois = '09' if ($mois eq "Sep");
		$mois = '10' if ($mois eq "Oct");
		$mois = '11' if ($mois eq "Nov");
		$mois = '12' if ($mois eq "Dec");
		$lower = Date_to_Days($anneein,$moisin,$jourin);
		$upper = Date_to_Days($anneeout,$moisout,$jourout);
		$date = Date_to_Days($annee,$mois,$jour);
		if (($date >= $lower) && ($date <= $upper)) {
			$haship{$ip} += 1;
			$hashpage{$page} += 1;
			$hashref{$referer} += 1;
			$hashua{$user_a} += 1;
			$hashko{$ip} += $byte;
			$sombyte += $byte;
		}
}

&subaffich();
$choix = (<STDIN>);

if ($choix == 1) {
	&subnbip();
}

elsif ($choix == 2) {
	&subip();
}

elsif ($choix == 3) {
	&subpage();
}

elsif ($choix == 4) {
	&subref();
}

elsif ($choix == 5) {
	&subua();
}
elsif ($choix == 6) {
	&subko();
}
elsif ($choix == 7) {
	&subkoip();
}
elsif ($choix == 8) {
    print "** Au revoir **\n";
	exit();
}
else {
    print "\nVous avez saisie un mauvais choix\n\n";
    print "** Au revoir **\n";
    exit();
}
close(Fichier);
###############################

############# SUB #############
sub subaffich {
	system("$screen_clear");
	print " |      Bienvenu dans le programme d\'analyseur de log        |\n";
	print " |       Programmer par Nickname                              |\n";
	print " |-----------------------------------------------------------|\n\n";
	print " Veuillez entrer le numero correspondant a l\'action voulue :\n\n";
	print "    1.Nombre d'adresses IP differentes\n";
	print "    2.Hits des 10 adresses IP les plus presentes\n";
	print "    3.Hits des 10 pages les plus visitees\n";
	print "    4.Hits des 10 premieres sources - URLs precedentes\n";
	print "    5.Hits des user agent les plus presents\n";
	print "    6.Somme en ko pour toutes les IP\n";
	print "    7.Somme en ko par IP - 10 Resultats\n";
	print "    8.Quitter le programme\n";
}

sub subnbip {
	system("$screen_clear");
	open(SORTIE, ">>log-nbre-ip.txt");
	print SORTIE "\n*** Du $jourin/$moisin/$anneein au $jourout/$moisout/$anneeout ***\n\n";
	my $i = 0;
	foreach $ip ( sort { $haship{$b} <=> $haship{$a} } keys %haship) {
		$i++;
		}
	print "\nNombre d'adresses IP differentes dans le fichier $file : $i IP\n";
	print SORTIE "Nombre d'adresses IP differentes dans le fichier $file : $i IP\n";
	mess();
}

sub subip {
	system("$screen_clear");
	open(SORTIE, ">>log-ip.txt");
	print SORTIE "\n*** Du $jourin/$moisin/$anneein au $jourout/$moisout/$anneeout ***\n\n";
	my $i = 0;
	foreach $ip ( sort { $haship{$b} <=> $haship{$a} } keys %haship) {
		print "IP : $ip a ete rencontre $haship{$ip} fois\n";
		print SORTIE "IP : $ip a ete rencontre $haship{$ip} fois\n";
		$i++;
		last if ($i == 10);
		}
	print "\nEcriture dans le fichier log-ip.txt en cours...\n";
	mess();
}

sub subpage {
	system("$screen_clear");
	open(SORTIE, ">>log-page.txt");
	print SORTIE "\n*** Du $jourin/$moisin/$anneein au $jourout/$moisout/$anneeout ***\n\n";
	my $i = 0;
	foreach $page ( sort { $hashpage{$b} <=> $hashpage{$a} } keys %hashpage) {
		print "Page : $page a ete rencontre $hashpage{$page} fois\n";
		print SORTIE "Page : $page a ete rencontre $hashpage{$page} fois\n";
		$i++;
		last if ($i == 10);
		}
	print "\nEcriture dans le fichier log-page.txt en cours...\n";
	mess();
}

sub subref {
	system("$screen_clear");
	open(SORTIE, ">>log-referer.txt");
	print SORTIE "\n*** Du $jourin/$moisin/$anneein au $jourout/$moisout/$anneeout ***\n\n";
	my $i = 0;
	foreach $referer ( sort { $hashref{$b} <=> $hashref{$a} } keys %hashref) {
		print "Referer : $referer a ete rencontre $hashref{$referer} fois\n";
		print SORTIE "Referer : $referer a ete rencontre $hashref{$referer} fois\n";
		$i++;
		last if ($i == 10);
		}
	print "\nEcriture dans le fichier log-referer.txt en cours...\n";
	mess();
}

sub subua {
	system("$screen_clear");
	open(SORTIE, ">>log-user-agent.txt");
	print SORTIE "\n*** Du $jourin/$moisin/$anneein au $jourout/$moisout/$anneeout ***\n\n";
	foreach $user_a ( sort { $hashua{$b} <=> $hashua{$a} } keys %hashua) {
		print "User agent : $user_a a ete rencontre $hashua{$user_a} fois\n";
		print SORTIE "User agent : $user_a a ete rencontre $hashua{$user_a} fois\n";
		}
	print "\nEcriture dans le fichier log-user-agent.txt en cours...\n";
	mess();
}

sub subko {
	system("$screen_clear");
	open(SORTIE, ">>log-ko.txt");
	print SORTIE "\n*** Du $jourin/$moisin/$anneein au $jourout/$moisout/$anneeout ***\n\n";
	print "Somme des Kilo-octets du fichier log : $sombyte ko\n";
	print SORTIE "Somme Kilo-octets : $sombyte\n";
	print "\nEcriture dans le fichier log-ko.txt en cours...\n";
	mess();
}

sub subkoip {
	system("$screen_clear");
	open(SORTIE, ">>log-ko-ip.txt");
	print SORTIE "\n*** Du $jourin/$moisin/$anneein au $jourout/$moisout/$anneeout ***\n\n";
	my $i = 0;
	foreach $ip ( sort { $hashko{$b} <=> $hashko{$a} } keys %hashko) {
		print "IP : $ip a utiliser $hashko{$ip} ko\n";
		print SORTIE "IP :$ip a utilise $hashko{$ip} ko\n";
		$i++;
		last if ($i == 10);
		}	
	print "\nEcriture dans le fichier log-ko-ip.txt en cours...\n";
	mess();
}

sub mess {
	sleep(1);
	print "\nEcriture reussie\n";
	print "\n ** A Bientot **\n";
	exit;
}
#############################
