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 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
|
use Win32::EventLog;
use Config::General qw(ParseConfig);
use Getopt::Long;
use Mail::Sender;
use Win32API::File;
use strict;
#Declaration des variables constantes
my ($EventLog,$number,$handle,$sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst,$server,$event,$logtype,$heuredeb,$heurefin,$datedeb,$datefin,$nb,$eventheure,$eventdate,$date);
my %event=(
'Length', " ",
'RecordNumber', " ",
'TimeGenerated', " ",
'TimeWritten', " ",
'EventID', " ",
'EventType', " ",
'Category', " ",
'ClosingRecordNumber', " ",
'User', " ",
'Source', " ",
'Computer', " ",
'Strings', " ",
'Data', " ");
my (@out_full,@out_err);
my @eventypenb;
my @eventype;
$eventype[1]="Error";
$eventype[2]="Warning";
$eventype[4]="Information";
$eventype[8]="Audit_Success";
$eventype[16]="Audit_Failure";
my @send_files;
my ($opt_conf,$opt_h);
my %config;
# Vérification des options passées en ligne de commande
GetOptions("c=s" => \$opt_conf,"conf=s" => \$opt_conf,
"h" => \$opt_h, "help" => \$opt_h);
if ($opt_h) { print_help();exit;}
elsif ($opt_conf)
{
%config = ParseConfig(-ConfigFile => $opt_conf);
# Vérification de l'existence du répertoire de log
if($config{'LOG_PATH'})
{ unless(-d $config{'LOG_PATH'}) { die "Le répertoire $config{'LOG_PATH'} n'existe pas"; } }
else { die "LOG_PATH est manquant dans le fichier de config!"; }
# Determination de la date du jour
$date = date(time());
# Ouverture du fichier de log
open (LOG, ">$config{'LOG_PATH'}eventlog-$date.log") or die $!;
check_config(%config);
}
else {print_help();exit;}
# Ouverture du fichier de listing des serveurs à traiter
open(SRV, "<$config{'SRVCONF_FILE'}") or logger("Fichier de listing des serveurs",$!);
while ($server = <SRV>)
{
# Supprime le saut de ligne lors de la récupération des noms de serveur dans le fichier de conf
chomp $server;
next if ($server =~ /^\s*$/);
# Ouverture du fichier de sortie
open(IMPR, ">$config{'SAVE_PATH'}$server-$date.txt") or logger("fichier de sortie $server",$!);
open(ERR, ">$config{'SAVE_PATH'}$server-Errwarn-$date.txt") or logger("fichier de sortie $server",$!);
push @send_files,"$config{'SAVE_PATH'}$server-Errwarn-$date.txt";
logger("Traitement de $server","en cours");
for $logtype ("Application", "System", "Security")
{
logger("\tTraitement du journal $logtype","en cours");
# Ouverture du journal d évènement $logtype pour le serveur $server
$EventLog = new Win32::EventLog($logtype, $server) || logger("journal $server-$logtype",$!);
# Determination du nombre d evenements a traiter
$EventLog->GetNumber($number);
# Initialisation du compteur d evenements par type ( erreur, warning, info, audit )
for $nb (1 .. 16)
{
$eventypenb[$nb]=0;
}
for ($handle=1;$handle<=$number;$handle++)
{
# lecture de l evenemenent en cours
$EventLog->Read((EVENTLOG_SEEK_READ|EVENTLOG_FORWARDS_READ),$handle,$event) or logger("Erreur lors de la lecture de l'evenement en cours",$!);
# Détermination de la date de l évènement
($eventheure,$eventdate) = date($event->{'TimeGenerated'});
# Determination du type d evenement
$event->{'EventID'} = $event->{'EventID'} & 0xffff;
# Comptage de l evenement selon son type
$eventypenb[$event->{'EventType'}]++;
# Enregistrement de l evenement pour ecriture ulterieure
push @out_full,"$event->{'RecordNumber'};$eventheure;$eventdate;$event->{'EventID'};$eventype[$event->{'EventType'}];$event->{'Category'};$event->{'User'};$event->{'Source'};$event->{'Computer'};$event->{'Strings'}\n";
if($event->{'EventType'}<=2)
{
push @out_err,"$event->{'RecordNumber'};$eventheure;$eventdate;$event->{'EventID'};$eventype[$event->{'EventType'}];$event->{'Category'};$event->{'User'};$event->{'Source'};$event->{'Computer'};$event->{'Strings'}\n";
}
}
# Récupere la date et l heure du plus vieil évènement
$EventLog->Read((EVENTLOG_SEEK_READ|EVENTLOG_FORWARDS_READ),"1",$event);
($heuredeb,$datedeb) = date($event->{'TimeGenerated'});
# Récupere la date et l heure du plus récent évènement
$EventLog->Read((EVENTLOG_SEEK_READ|EVENTLOG_FORWARDS_READ),$number,$event);
($heurefin,$datefin) = date($event->{'TimeGenerated'});
# Remplissage du fichier de sortie avec les intitulés
print IMPR "Serveur : $server; $logtype\n";
print IMPR "Nombre d'évènements : $number; Error : $eventypenb[1]; Warning : $eventypenb[2]; Information : $eventypenb[4]\n";
print IMPR "Date : Du $datedeb $heuredeb Au $datefin $heurefin\n";
print IMPR "RecordNumber;Heure;Date;EventID;EventType;Category;User;Source;Computer;Strings\n";
print ERR "\n\nServeur : $server; $logtype\n";
print ERR "Nombre d'évènements : $number; Error : $eventypenb[1]; Warning : $eventypenb[2]; Information : $eventypenb[4]\n";
print ERR "Date : Du $datedeb $heuredeb Au $datefin $heurefin\n";
print ERR "RecordNumber;Heure;Date;EventID;EventType;Category;User;Source;Computer;Strings\n";
# remplissage du fichier de sortie avec les évènements
while(@out_full) {print IMPR shift @out_full;}
while(@out_err) {print ERR shift @out_err;}
# Sauvegarde et vidage du journal d évènement $logtype sur $server
if ($EventLog->Clear("c:\\$logtype-$date.evt"))
{
# Deplacement du journal d'évènement $logtype depuis $server
if (Win32API::File::MoveFile("\\\\$server\\c\$\\$logtype-$date.evt","$config{'SAVE_PATH'}$server-$logtype-$date.evt"))
{
logger("Sauvegarde de $logtype pour $server","OK");
}
else { logger("Impossible de copier le journal d'evenement $logtype depuis $server",$!); }
}
else { logger("Impossible de sauvegarder le journal d'evenement $logtype sur $server",$!); }
# Fermeture du journal d évènement $logtype
$EventLog->Close();
logger("\tTraitement de $logtype","Fini");
}
close (IMPR);
close (ERR);
logger("Traitement de $server","Fini");
}
send_mail(\%config,\@send_files);
# Fermeture des fichiers de configuration
close (SRV);
close (LOG);
#################
# Sous-programme#
#################
# Détermination de la date
sub date
{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($_[0]);
$year += 1900;
$mon += 1;
my $date = $mday."-".$mon."-".$year;
if ($hour<10) { $hour = "0".$hour;}
if ($min<10) { $min = "0".$min;}
my $heure = $hour.":".$min;
return $heure,$date;
}
# Vérification de la présence des variables dans le fichier de configuration
sub check_config
{
my %ref = @_;
unless($ref{'MAIL_DEST'}) {die "mail_dest manquant";}
unless($ref{'MAIL_EXP'}) {die "mail_exp manquant";}
unless($ref{'SMTP'}) {die "smtp manquant";}
if($ref{'SAVE_PATH'})
{ unless(-d $ref{'SAVE_PATH'}) { logger("le répertoire de sauvegarde $ref{'SAVE_PATH'} n'existe pas !!",$!); } }
else { logger("SAVE_PATH est manquant dans le fichier de config!","Verifier le fichier de config"); }
if($ref{'SRVCONF_FILE'})
{ unless(-e $ref{'SRVCONF_FILE'}) { logger("le fichier de listing des serveurs $ref{'SRVCONF_FILE'} n'existe pas !!",$!); } }
else {logger("SRVCONF_FILE manquant dans le fichier de configuration","Verifier le fichier de config");}
}
# Affichage de l'aide du script
sub print_help
{
print "eventlog.pl v0.1\n";
print "Usage:\n";
print " -c (--conf) fichier de configuration ( Requis )\n";
print " -h (--help) affiche l'aide\n";
}
# renseigne le fichier de log du script
sub logger
{
my ($log_info,$log_error) = @_;
my ($log_heure,$log_date) = date(time());
print LOG "$log_date $log_heure\t$log_info : $log_error\n";
}
# Envoi le mail récapitulatif
sub send_mail
{
my $conf = shift;
my $files = shift;
my $sender = new Mail::Sender {smtp => $$conf{'SMTP'}, from => $$conf{'MAIL_EXP'},charset => 'ISO-8859-1',encoding => '8BIT',b_charset => 'ISO-8859-1',b_encoding => '8BIT'};
$sender->MailFile({to => $$conf{'MAIL_DEST'},
subject => "[Taureau] Résumé des eventlogs : Error et Warning",
msg => "Bonjour,\n\n\t vous trouverez ci-joint les erreurs et les warnings des eventlogs de Taureau.\n\nParser d'Eventlog",
file => $files});
if($sender->Close()<0) { logger("Mail non envoyé",Mail::Sender::Error); }
else
{
logger("Mail envoyé","OK");
# Suppression des fichiers temporaires de sortie contenant les erreurs et warning envoyé par
foreach my $fil (@$files)
{
Win32API::File::DeleteFile($fil) or logger ("Impossible de supprimer les fichiers temporaires de sortie contenant les erreurs et warning",$!);
}
}
} |
Partager