1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
#!/usr/bin/perl
use strict;
use warnings;
#use Benchmark;
use Time::HiRes;
my $g__LogSource = $ARGV[0];
my $g__LogDest = $ARGV[1];
#**************************************************************************************
#* Procdure: CheckVersion($)
#* Objectif: Permet de vrifier si le fichier d'entre est de version
#* 4, 5 ou de format non conforme
#* Valeur de Retour: 0 si le fichier est de format invalide
#* 1 sinon
#* Fonction appele par: Main EXECUTION
#* Fonction fait appels :
#**************************************************************************************
sub CheckVersion($)
{
my $cmd = `head -1 $g__LogSource`;
if (($cmd !~ "#Software: SGOS 4") and ($cmd !~ "#Software: SGOS 5"))
{
return(0);
}
else
{
if ($cmd =~ "#Software: SGOS 4")
{
return(1);
}
elsif ($cmd =~ "#Software: SGOS 5")
{
return (2);
}
}
}
#*************************************************************************************
#* Procdure: CloseFiles()
#* Objectif: Montre comment utiliser le script avec
#* les bons argumentsrameters et quitte le script
#* Valeur de Retour:
#* Fonction appele par: Main EXECUTION
#* Fonction fait appels :
#*************************************************************************************
sub CloseFiles()
{
close FICHIER_INPUT;
close FICHIER_OUTPUT;
}
#**************************************************************************************
# MAIN EXECUTION
#**************************************************************************************
if(scalar(@ARGV) != 2){
print "Verifier l'existence de deux parametres\n";
print " <LOGFile_Entree> \t chemin complet du log brut\n ";
print " <LOGFile_Sortie> \t chemin complet du fichier de sortie (prefiltre)\n ";
print "Exemple : perl onf.pl Entree.log Sortie.log\n";
exit(1);
}
else{
if (!CheckVersion($g__LogSource)){
print "Le Fichier $g__LogSource n'est pas conforme au format attendu, le prefiltrage a t stopp !\n";
exit 1;
}
else{
my $g__Ligne = "";
my @g__ListResult = ();
open(FICHIER_INPUT, "< $g__LogSource") || die ("probleme d'ouverture du fichier en entr\211e (log brut
ONF)\n");
open(FICHIER_OUTPUT, "> $g__LogDest") || die ("probleme d'ouverture du fichier en sortie CSV ONF)\n");
print FICHIER_OUTPUT "Date Heure time-taken cs-uri-sheme cs-host cs-uri-path msisdn c-ip\n";
my $td = Time::HiRes::time;
my $version=CheckVersion($g__LogSource);
while (defined ($g__Ligne = <FICHIER_INPUT>)){
next if ($g__Ligne =~ /^[#]/);
my $l__TempLigne = $g__Ligne;
@g__ListResult = ();
my $g__StrBeforeQuotes = undef;
my $g__StrQuoted = undef;
my $g__StrAfterQuotes = undef;
#my $start = new Benchmark;
#my $t1 = Time::HiRes::time;
#print "$t1\n";
while (defined($l__TempLigne)){
if ($l__TempLigne =~ /([^"]*)"([^"]*)"(.*)/){
($g__StrBeforeQuotes,$g__StrQuoted,$g__StrAfterQuotes) = $l__TempLigne =~ /([^"]*)"([^"]*)"(.*)/;
if (defined($g__StrBeforeQuotes)){
#~ $g__StrBeforeQuotes contient un ou pls champs spars par espace
@g__ListResult = (@g__ListResult, split (" ", $g__StrBeforeQuotes));
}
#~ La ligne de log commence par un champ avec guillemets
if (defined($g__StrQuoted)){
push (@g__ListResult, "\"$g__StrQuoted\"");
}
if (defined($g__StrAfterQuotes)){
$l__TempLigne = $g__StrAfterQuotes;
next;
}
else{
last;
}
}
else{
@g__ListResult = (@g__ListResult, split (" ", $l__TempLigne));
last;
}
}
#my $end = new Benchmark;
#my $t2= Time::HiRes::time;
#my $diff = $t2 - $t1;
#print "$t2\n";
#print "DIFF : ";
#printf("%f", $diff) ;
#print "\n";
##############################################################################################################
## Format de $g__Ligne :
## ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
## | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | [26] | [27] |
## --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
## | date | time | time-taken | c-ip | sc-status | s-action | sc-bytes | cs-bytes | cs-method | cs-uri-scheme | cs-host | cs-uri-port | cs-uri-path | cs-uri-query | cs-username | cs-auth-group | rs(Content-Type) | cs(User-Agent) | sc-filter-result | cs-category | s-ip | c-connect-type | s-computername | connect-time | dnslookup-time | cs-categories | [MVNO] | [STATUT] |
## -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
##
## Format du Ouput
##
## -----------------------------------------------------------------------------------
## | 0 | 1 | 9 | 10 | 12 | 14 | 3 |
## ----------------------------------------------------------------------------------
## | date | time | cs-uri-scheme | cs-host |cs-uri-path | cs-username | c-ip |
## ----------------------------------------------------------------------------------
##
if (((scalar(@g__ListResult) == 28) && ($version==2)) or ((scalar(@g__ListResult) == 26) && ($version==1))){
print FICHIER_OUTPUT "$g__ListResult[0] $g__ListResult[1] $g__ListResult[9] $g__ListResult[10] $g__ListResult[12] $g__ListResult[14] $g__ListResult[3]\n";
}
else{
print "onf.pl => $g__LogSource : une ligne ne correspond pas au format attendu\n";
}
}
my $tf = Time::HiRes::time;
my $di = $tf - $td;
#print "$t2\n";
print "DIFF FINAL : ";
printf("%f", $di) ;
print "\n";
CloseFiles();
}
} |
Partager