#! /usr/bin/perl

#########################################################################################################################
#															#
#					SCRIPT PRINCIPAL DU LOGICIEL TBvirus-1.0					#
#					J. VEHENT - juillet 2006 - finale 1.0						#
#															#
#-----------------------------------------------------------------------------------------------------------------------#
#															#
# Ce logiciel fournit une surcouche pour l'exploitation des logs des systèmes antiviraux. Il appelle les différents 	#
# scripts (qui effectuent l'exploitation) et remonte les résultats.							#
#															#
# Il permet également d'exporter ces résultats dans un fichier excel.							#
#															#
# Ce script fournit l'interface graphique du logiciel. Il utilise gtk2 pour créer cette interface. des tutoriaux assez  #
# complets sur les interfaces Gtk2 sont disponibles aux adresses : 							#
#		* http://articles.mongueurs.net/magazines/linuxmag63.html						#
#		* http://articles.mongueurs.net/magazines/linuxmag64.html						#
#		* http://perso.orange.fr/gtk2-perl/Gtk2perl_tutoriel.html						#
#															#
#########################################################################################################################

# include pour l'interface
use Gtk2 -init;
use Gtk2::SimpleMenu;
use Gtk2::SimpleList;
# include pour l'export excel
#use Win32::OLE qw(in with valof OVERLOAD);
#use Win32::OLE::Const 'Microsoft Excel';
# include pour la connection a SAV REPORTER
use LWP::UserAgent;
use HTML::Form;
use HTML::Parser;
use HTTP::Cookies;

#########################################
# INCLUSION DES SOUS FONCTIONS		#
#					#
do ('.\\sub\\sub_antigen.pl');		#
do ('.\\sub\\sub_webwasher.pl');	#
do ('.\\sub\\sub_result_mail.pl');	#
do ('.\\sub\\sub_norton.pl');		#
do ('.\\sub\\sub_listvirus.pl');	#
do ('.\\sub\\sub_excel.pl');		#
do ('.\\sub\\sub_rapatriement_logs.pl');#
do ('.\\sub\\sub_export_mensuel.pl');	#
#					#
#########################################

#########################################
# 	VARIABLES GLOBALES		#
# 					#
# => test de lancement			#
$lancement_ok = 0;			#
#					#
# => index des widgets			#
%W;					#
#					#
# => Mode DEBUG				#
$DEBUG = 0;				#
#					#
# => fichier DEBUG			#
$DEBUG_FILE = 				#
".\\logs\\debug_TBvir.txt";		#
if (-e ".\\logs\\debug_TBvir.txt"){	#
  unlink ".\\logs\\debug_TBvir.txt";	#
}					#
#					#
# => les fichiers de resultats		#
$resultat_mail = 			#
".\\logs\\result_mail.csv";		#
$resultat_fichiers = 			#
".\\logs\\result_fichiers.csv";		#
$detail_norton = 			#
".\\logs\\NORTON_detail.csv";		#
$liste_virus_mail = 			#
".\\logs\\liste_virus_mail.csv";	#
$liste_virus_fichiers = 		#
".\\logs\\liste_virus_fichiers.csv";	#
#					#
# => compte SAV REPORTER		#
$user = "XXXXXXXXXXX";			#
$pass = "XXXXXXXXXXX";			#
#					#
#########################################


#
# ----> LA BASE		~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#

# Création de la fenetre principale
$window = Gtk2::Window->new(toplevel);

# Evenement de fin du programme (clic sur la croix de fermeture)
$window->signal_connect('delete_event', \&confirm_quitter);

# taille par défaut de la fenetre
$window->set_default_size (600, 700);

# titre de la fenetre
$window->set_title("TBvirus 1.0 - Tableau de bord pour l'activité virale");

# placement de la fenetre au milieu de l'écran
$window->set_position('center');

# distance de la bordure
$window->set_border_width( 3  ) ;

# Ajout du widget dans la table de hachage
$W{main} = $window;


#
# ----> LES BOX		~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#

# Creation d'une box verticale
$vbox = Gtk2::VBox->new(0,1);

# Ajout de la box dans la fenetre principale
$window->add($vbox);

# Ajout du widget dans la table de hachage
#
# ceci étant effectué pour TOUS les widgets, il ne sera pas commenté par la suite
$W{vbox} = $vbox;



#
# ----> LES DIALOGUES	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#

# boite horizontale dans laquelle on place les boutons
my $hbox = Gtk2::HBox->new (0,1);

$W{hbox} = $hbox;

# creation d'une frame entourant la hbox
my $framehbox = Gtk2::Frame->new("Paramètres d'exploitation");
$framehbox->set_shadow_type('etched_out');
$framehbox->add($hbox);

$W{framehbox} = $framehbox;

# framehbox est rangée dans la vbox
$vbox->pack_start($framehbox,0,0,10);

# dans la box horizontale, on refait 2 box verticales
my $vbox_1 = Gtk2::VBox->new(0,1);
my $vbox_2 = Gtk2::VBox->new(0,1);
$hbox->add($vbox_1);
$hbox->add($vbox_2);

$W{vbox_1} = $vbox_1;
$W{vbox_2} = $vbox_2;


###
# la VBOX_1 contient les boutons de choix
#

#la date de début
my $hbox_1_1 = Gtk2::HBox->new(0,1);
my $txtdatedebut = Gtk2::Label->new("Date de début d'exploitation : ");
$txtdatedebut->set_justify('left');

my $datedebut = Gtk2::Entry->new_with_max_length(10);
$datedebut->set_text("JJ/MM/AAAA");
$hbox_1_1->add($txtdatedebut);
$hbox_1_1->add($datedebut);
$vbox_1->add($hbox_1_1);

$W{datedebut} = $datedebut;
$W{hbox_1_1} = $hbox_1_1;

#la date de fin
my $hbox_1_2 = Gtk2::HBox->new(0,1);
my $txtdatefin = Gtk2::Label->new("Date de fin d'exploitation : ");
$txtdatefin->set_justify('left');

my $datefin =  Gtk2::Entry->new_with_max_length(10);
$datefin->set_text("JJ/MM/AAAA");
$hbox_1_2->add($txtdatefin);
$hbox_1_2->add($datefin);
$vbox_1->add($hbox_1_2);

$W{datefin} = $datefin;
$W{hbox_1_2} = $hbox_1_2;

#les choix de logs a exploiter (tous par défaut)
my $choix_messagerie = Gtk2::CheckButton->new( "Statistiques sur la messagerie" ) ;
$vbox_1->add( $choix_messagerie ) ;
$choix_messagerie->signal_connect( 'toggled' , \&toggle_messagerie ) ;
$choix_messagerie->set_active( TRUE ) ;

my $choix_fichiers = Gtk2::CheckButton->new( "Statistiques sur les fichiers" ) ;
$vbox_1->add( $choix_fichiers ) ;
$choix_fichiers->signal_connect( 'toggled' , \&toggle_fichiers ) ;
$choix_fichiers->set_active( TRUE ) ;

my $choix_virus = Gtk2::CheckButton->new( "Liste(s) de virus (nécessite messagerie et/ou fichiers)" ) ;
$vbox_1->add( $choix_virus ) ;
$choix_virus->signal_connect( 'toggled' , \&toggle_virus ) ;
$choix_virus->set_active( TRUE ) ;

my $mode_debug = Gtk2::CheckButton->new( "Mode DEBUG (logs dans $DEBUG_FILE )" ) ;
$vbox_1->add( $mode_debug ) ;
$mode_debug->signal_connect( 'toggled' , \&toggle_debug ) ;


$W{choix_messagerie} = $choix_messagerie;
$W{choix_fichiers} = $choix_fichiers;
$W{choix_virus} = $choix_virus;
$W{mode_debug} = $mode_debug;



##
# la VBOX_2 contient les boutons d'actions
#
my $lancer = Gtk2::Button->new_from_stock( "Lancer" ) ;
$lancer->signal_connect( 'clicked' , \&lancer);
$vbox_2->add( $lancer ) ;
$lancer->can_default( TRUE ) ;

my $rapatrier = Gtk2::Button->new_from_stock( "Rapatrier les logs vers secsi" ) ;
$rapatrier->signal_connect( 'clicked' , \&rapatriement ) ;
$vbox_2->add( $rapatrier ) ;
$rapatrier->can_default( TRUE ) ;

my $exporter = Gtk2::Button->new_from_stock( "Exporter les résultats" ) ;
$exporter->signal_connect( 'clicked' , \&exporter ) ;
$vbox_2->add( $exporter ) ;
$exporter->can_default( TRUE ) ;

my $export_auto = Gtk2::Button->new_from_stock( "Export automatique mensuel" ) ;
$export_auto->signal_connect( 'clicked' , \&export_auto ) ;
$vbox_2->add( $export_auto ) ;
$export_auto->can_default( TRUE ) ;

my $bouton_quitter = Gtk2::Button->new_from_stock( "Quitter" ) ;
$bouton_quitter->signal_connect( 'clicked' , \&confirm_quitter ) ;
$vbox_2->add( $bouton_quitter ) ;
$bouton_quitter->can_default( TRUE ) ;

$W{lancer} = $lancer;
$W{rapatrier} = $rapatrier;
$W{exporter} = $exporter;
$W{export_auto} = $export_auto;
$W{bouton_quitter} = $bouton_quitter;

#
# ----> LES LISTES	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#

# table de trois cases pour y placer les listes
$tablelist=Gtk2::Table->new(2,3,1);
$tablelist->set_row_spacings(5);
$tablelist->set_col_spacings(10);

$W{tablelist} = $tablelist;

# ajout du tablelist dans la box
$vbox->add($tablelist);

##
# Pour le traitement des logs des mails - - - - - - - - - - - - - - - - - - - - -

# on commence par creer une zone d'affichage avec scrolling
my $zonemail = Gtk2::ScrolledWindow->new();

$W{zonemail} = $zonemail;

# Rangement de zonemail dans un cadre framemail
$framemail = Gtk2::Frame->new("Activité virale sur le mail");
$framemail->set_shadow_type('etched_out');
$framemail->add($zonemail);

$W{framemail} = $framemail;

# rangement de la zone de liste dans la tablelist
#
# atach_defaults prend en argument :
# 1. le widget
# 2. l'attache a gauche
# 3. l'attache a droite
# 4. l'attache en haut
# 5. l'attache en bas

$tablelist->attach_defaults($framemail, 0, 2, 0, 1);

# l'argument "automatic" permet a GTK de n'afficher les barres de
# defilement que lorsque c'est nécessaire
$zonemail->set_policy(qw/automatic automatic/);

# creation des entetes de colonnes
my @fieldmail = qw/Date #Mails-entrants #Mails-sortants #Virus-WW #Virus-Antigen/;
my @headermail;
@headermail = map { $_ => 'text' } @fieldmail;

# ajout des entetes dans la liste
my $listmail = Gtk2::SimpleList->new(@headermail);

$W{listmail} = $listmail;

# ajout de la list dans la zone scrolled
$zonemail->add($listmail);


##
# Pour le traitement des logs des fichiers - - - - - - - - - - - - - - - - - - - - -
# (pas de commentaires car c'est la meme chose)

my $zonefichiers = Gtk2::ScrolledWindow->new();

$W{zonefichiers} = $zonefichiers;

$framefichiers = Gtk2::Frame->new("Activité virale sur les fichiers");
$framefichiers->set_shadow_type('etched_out');
$framefichiers->add($zonefichiers);
$tablelist->attach_defaults($framefichiers, 0,2,1,2);

$W{framefichiers} = $framefichiers;

$zonefichiers->set_policy(qw/automatic automatic/);

my @fieldfichiers = qw/Date Fichiers-cont Total-Postes Ordi-Agence Ordi-siege Serveurs/;
my @headerfichiers;
@headerfichiers = map { $_ => 'text' } @fieldfichiers;

my $listfichiers = Gtk2::SimpleList->new(@headerfichiers);

$W{listfichiers} = $listfichiers;

$zonefichiers->add($listfichiers);


##
# Pour le comptage des virus - - - - - - - - - - - - - - - - - - - - -
# on crée une box horizontale contenant nos deux listes
#
my $hbox_2 = Gtk2::HBox->new(0,1);
$tablelist->attach_defaults($hbox_2, 0,3,2,3);


#pour les virus du mail
my $zonevirusmail = Gtk2::ScrolledWindow->new();

$W{zonevirusmails} = $zonevirusmail;

$framevirusmail = Gtk2::Frame->new("Liste des virus WebWasher/Antigen");
$framevirusmail->set_shadow_type('etched_out');
$framevirusmail->add($zonevirusmail);
$hbox_2->add($framevirusmail);

$W{framevirusmail} = $framevirusmail;

$zonevirusmail->set_policy(qw/automatic automatic/);

my @fieldvirusmail = qw/Nom-Virus #Infections Type-Virus/;
my @headervirusmail;
@headervirusmail = map { $_ => 'text' } @fieldvirusmail;

my $listvirusmail = Gtk2::SimpleList->new(@headervirusmail);

$W{listvirusmail} = $listvirusmail;

$zonevirusmail->add($listvirusmail);

#pour les virus des fichiers
my $zonevirusfichiers = Gtk2::ScrolledWindow->new();

$W{zonevirusfichiers} = $zonevirusfichiers;

$framevirusfichiers = Gtk2::Frame->new("Liste des virus Norton");
$framevirusfichiers->set_shadow_type('etched_out');
$framevirusfichiers->add($zonevirusfichiers);
$hbox_2->add($framevirusfichiers);

$W{framevirusfichiers} = $framevirusfichiers;

$zonevirusfichiers->set_policy(qw/automatic automatic/);

my @fieldvirusfichiers = qw/Nom-Virus #Infections Type-Virus /;
my @headervirusfichiers;
@headervirusfichiers = map { $_ => 'text' } @fieldvirusfichiers;

my $listvirusfichiers = Gtk2::SimpleList->new(@headervirusfichiers);

$W{listvirusfichiers} = $listvirusfichiers;

$zonevirusfichiers->add($listvirusfichiers);




#
# ----> LES TRIS SUR LES LISTES	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 

##
# Tri des colonnes pour la liste des logs de mail

# Creation du modele de tri des chaines de caractères
my $mailtrichar = $listmail->get_model();

# Routine de tri par défaut des colonnes de chaines de caractères
$mailtrichar->set_default_sort_func(
	sub {
		my ($model, $item1, $item2) = @_;
	
		#on récupére les valeurs 
		my $a = $model->get($item1, 1);
		my $b = $model->get($item2, 1);

		# comparaison
		return $a cmp $b;
	}
);

# on spécifie le champ d'entetes comme cliquable
$listmail->set_headers_clickable(1);

# action performée lors du clic de la colonne Date
my $colmail0 = $listmail->get_column(0);

$colmail0->signal_connect('clicked', sub {
	my ($colonne, $model) = @_;
		#on demande un tri ascendant sur cette colonne
		$model->set_sort_column_id (0, 'ascending');
	},
	$mailtrichar
);

# action performée lors du clic de la colonne #Mails-entrants
my $colmail1 = $listmail->get_column(1);

$colmail1->signal_connect('clicked', sub {
	my ($colonne, $model) = @_;
		# tri ascendant
		$model->set_sort_column_id (1, 'ascending');
	},
	$mailtrichar
);

# action performée lors du clic de la colonne #Mails-sortants
my $colmail2 = $listmail->get_column(2);

$colmail2->signal_connect('clicked', sub {
	my ($colonne, $model) = @_;
		# modification du model : tri ascendant
		$model->set_sort_column_id (2, 'ascending');
	},
	$mailtrichar
);

# action performée lors du clic de la colonne #Virus-Webwasher
my $colmail3 = $listmail->get_column(3);

$colmail3->signal_connect('clicked', sub {
	my ($colonne, $model) = @_;
		# modification du model : tri ascendant
		$model->set_sort_column_id (3, 'ascending');
	},
	$mailtrichar
);

# action performée lors du clic de la colonne #Virus-Antigen
my $colmail4 = $listmail->get_column(4);

$colmail4->signal_connect('clicked', sub {
	my ($colonne, $model) = @_;
		# modification du model : tri ascendant
		$model->set_sort_column_id (4, 'ascending');
	},
	$mailtrichar
);

##
# Tri des colonnes pour la liste des logs de fichiers

my $modfichiers = $listfichiers->get_model();

$modfichiers->set_default_sort_func(sub {
	my ($model, $item1, $item2) = @_;
	my $a = $model->get($item1, 1);
	my $b = $model->get($item2, 1);  
	return $a cmp $b;
	}
);
$listfichiers->set_headers_clickable(1);

my $colfichiers0 = $listfichiers->get_column(0); #Periode
$colfichiers0->signal_connect('clicked', sub {
	my ($colonne, $model) = @_;
		$model->set_sort_column_id (0, 'ascending');
	},
	$modfichiers
);
my $colfichiers1 = $listfichiers->get_column(1); #Fichiers-Cont
$colfichiers1->signal_connect('clicked', sub {
	my ($colonne, $model) = @_;
		$model->set_sort_column_id (1, 'ascending');
	},
	$modfichiers
);
my $colfichiers2 = $listfichiers->get_column(2); #Total-postes
$colfichiers2->signal_connect('clicked', sub {
	my ($colonne, $model) = @_;
		$model->set_sort_column_id (2, 'ascending');
	},
	$modfichiers
);
my $colfichiers3 = $listfichiers->get_column(3); #Ordi-Agence
$colfichiers3->signal_connect('clicked', sub {
	my ($colonne, $model) = @_;
		$model->set_sort_column_id (3, 'ascending');
	},
	$modfichiers
);
my $colfichiers4 = $listfichiers->get_column(4); #Ordi-siege
$colfichiers4->signal_connect('clicked', sub {
	my ($colonne, $model) = @_;
		$model->set_sort_column_id (4, 'ascending');
	},
	$modfichiers
);
my $colfichiers5 = $listfichiers->get_column(5); #Serveurs
$colfichiers5->signal_connect('clicked', sub {
	my ($colonne, $model) = @_;
		$model->set_sort_column_id (5, 'ascending');
	},
	$modfichiers
);

##
# Tri des colonnes pour la liste du comptage des virus du mail

my $modvirus = $listvirusmail->get_model();

$modvirus->set_default_sort_func(sub {
	my ($model, $item1, $item2) = @_;
	my $a = $model->get($item1, 1);
	my $b = $model->get($item2, 1);  
	return $a cmp $b;
	}
);
$listvirusmail->set_headers_clickable(1);

my $colvirus0 = $listvirusmail->get_column(0); #Nom-Virus
$colvirus0->signal_connect('clicked', sub {
	my ($colonne, $model) = @_;
		$model->set_sort_column_id (0, 'ascending');
	},
	$modvirus
);
my $colvirus1 = $listvirusmail->get_column(1); #Type
$colvirus1->signal_connect('clicked', sub {
	my ($colonne, $model) = @_;
		$model->set_sort_column_id (1, 'ascending');
	},
	$modvirus
);
my $colvirus2 = $listvirusmail->get_column(2); #Nb-infections
$colvirus2->signal_connect('clicked', sub {
	my ($colonne, $model) = @_;
		$model->set_sort_column_id (2, 'ascending');
	},
	$modvirus
);

##
# Tri des colonnes pour la liste du comptage des virus des fichiers

my $modvirus = $listvirusfichiers->get_model();

$modvirus->set_default_sort_func(sub {
	my ($model, $item1, $item2) = @_;
	my $a = $model->get($item1, 1);
	my $b = $model->get($item2, 1);  
	return $a cmp $b;
	}
);
$listvirusfichiers->set_headers_clickable(1);

my $colvirus0 = $listvirusfichiers->get_column(0); #Nom-Virus
$colvirus0->signal_connect('clicked', sub {
	my ($colonne, $model) = @_;
		$model->set_sort_column_id (0, 'ascending');
	},
	$modvirus
);
my $colvirus1 = $listvirusfichiers->get_column(1); #Type
$colvirus1->signal_connect('clicked', sub {
	my ($colonne, $model) = @_;
		$model->set_sort_column_id (1, 'ascending');
	},
	$modvirus
);
my $colvirus2 = $listvirusfichiers->get_column(2); #Nb-infections
$colvirus2->signal_connect('clicked', sub {
	my ($colonne, $model) = @_;
		$model->set_sort_column_id (2, 'ascending');
	},
	$modvirus
);

#
# ----> LES TOTAUX	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#

# totaux pour la messagerie
$tot_messagerie = Gtk2::Label->new();
$tot_messagerie->set_justify('left');

$frame_messagerie = Gtk2::Frame->new("Totaux pour la Messagerie");
$frame_messagerie->add($tot_messagerie);
$frame_messagerie->set_shadow_type('etched_out');

$tablelist->attach_defaults($frame_messagerie, 2,3,0,1);

$W{tot_messagerie} = $tot_messagerie;
$W{frame_messagerie} = $frame_messagerie;

#totaux pour les fichiers
$tot_fichiers = Gtk2::Label->new();

$tot_fichiers->set_justify('left');

$frame_fichiers = Gtk2::Frame->new("Totaux pour les infections de machines");
$frame_fichiers->add($tot_fichiers);
$frame_fichiers->set_shadow_type('etched_out');

$tablelist->attach_defaults($frame_fichiers, 2,3,1,2);

$W{tot_fichiers} = $tot_fichiers;
$W{frame_fichiers} = $frame_fichiers;

#
# ----> AFFICHAGE DES INFORMATIONS	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#

#champ d'informations
$informations = Gtk2::Label->new();

$frame_informations = Gtk2::Frame->new("Informations");
$frame_informations->add($informations);
$frame_informations->set_shadow_type('etched_out');

$vbox->add($frame_informations);

$W{informations} = $informations;
$W{frame_informations} = $frame_informations;


#
# ----> MODE DEBUG	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
if ($DEBUG == 1){
	debug("-----------------------------\n\tLISTE DES WIDGETS\n-----------------------------");
	for $i(sort keys %W){
		debug("$i");
	}
	debug("-----------------------------");
}

#
# ----> ET POUR FINIR	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#

# Affichage de la fenetre principale
$window->show_all();
    
# fin de la définition de l'interface
Gtk2->main();


#															#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~THE~~~~~~~~~~END~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
#															#
#########################################################################################################################







#                        ______
#                       /\     \
#                      /  \     \
#                     /    \_____\
#                    _\    / ____/_
#                   /\ \  / /\     \
#                  /  \ \/_/  \     \
#                 /    \__/    \_____\
#                _\    /  \    / ____/_
#               /\ \  /    \  / /\     \
#              /  \ \/_____/\/_/  \     \
#             /    \_____\    /    \_____\
#            _\    /     /    \    / ____/_
#           /\ \  /     /      \  / /\     \
#          /  \ \/_____/        \/_/  \     \
#         /    \_____\            /    \_____\
#        _\    /     /            \    / ____/_
#       /\ \  /     /              \  / /\     \
#      /  \ \/_____/                \/_/  \     \ 
#     /    \_____\                    /    \_____\
#    _\    /     /_  ______  ______  _\____/ ____/_
#   /\ \  /     /  \/\     \/\     \/\     \/\     \
#  /  \ \/_____/    \ \     \ \     \ \     \ \     \
# /    \_____\ \_____\ \_____\ \_____\ \_____\ \_____\
# \    /     / /     / /     / /     / /     / /     /
#  \  /     / /     / /     / /     / /     / /     /
#   \/_____/\/_____/\/_____/\/_____/\/_____/\/_____/
#
#
#
#
#	INFORMATION POUR LES VETERANS QUI ONT TENUS JUSQU'ICI.... 
#
#	Vu qu'a compter d'aout 2006, je ne serais plus en stage a MAAF Assurances, vous pouvez me contacter
#	en permanence a l'adresse julien@linuxwall.info ou, si j'étais amené a changer cette adresse, via mon
#	site perso http://jvehent.free.fr
#	Je sais que ce code est assez obscur, alors n'hésitez surtout pas ! Si je peux donner un coup de main 
#	ce sera avec plaisir ;=)
#
#	julien
#



#
# ----> SOUS FONCTIONS		~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#

############################################################################################################################
# Fonctions de rappels pour les boutons
#

sub toggle_messagerie {
	if($messagerie_ok==1){
		$messagerie_ok = 0;
	}else {
		$messagerie_ok = 1;
	}
}

sub toggle_fichiers {
	if($fichiers_ok==1){
		$fichiers_ok = 0;
	}else {
		$fichiers_ok = 1;
	}
}

sub toggle_virus {
	if($virus_ok==1){
		$virus_ok = 0;
	}else {
		$virus_ok = 1;
	}
}

sub toggle_debug {
	if($DEBUG==1){
		$DEBUG = 0;
	}else {
		$DEBUG = 1;
	}
}

############################################################################################################################
# Fonctions d'action
#

#
# Exploitation d'une période via le bouton "lancer"
#
sub lancer {

	if($DEBUG==1){
		#initialisation du fichier debug
		open (NULL, ">$DEBUG_FILE") or die print "OUVERTURE DE $DEBUG_FILE IMPOSSIBLE\n";
		close NULL;
		debug("MAIN ==> appel de la fonction lancer");
	}

	$info="";

	# suppression de tous les fichiers de logs existants
	opendir(LOGDIR,".\\logs\\") or die print "IMPOSSIBLE D'OUVRIR LE REPERTOIRE CONTENANT LES LOGS\n$!";
	my @lstlogs = readdir LOGDIR;
	close LOGDIR;
	foreach $fich (@lstlogs){
		debug("MAIN ==> Suppression du fichier de logs $fich");
		unlink ".\\logs\\".$fich;
	}

	# initialisation des tableaux de listes de résultats
	for my $i(@DonneesMail){delete $DonneesMail[$i];}
	for my $i(@DonneesFichiers){delete $DonneesFichiers[$i];}
	for my $i(@DonneesVirusMail){delete $DonneesVirusMail[$i];}
	for my $i(@Top5virmail){delete $Top5virmail[$i];}
	for my $i(@DonneesVirusFichiers){delete $DonneesVirusFichiers[$i];}
	for my $i(@TotauxMail){delete $TotauxMail[$i];}
	$totmailinf=0;
	$tot_fichiers_inf=0;

	####
	# 1. récupération des dates début et fin
	#
	my $tmpdatedebut = $W{datedebut};				# les adresses mémoires des deux champs de dates
	my $debut_exp = $tmpdatedebut->get_text;			# existent toujours dans la table de hachage %W
	debug("MAIN ==> date de début d'exploitation : $debut_exp");	# .....
									# donc pour éviter le bug de destruction du widget
	my $tmpdatefin = $W{datefin};					# lors de la RELANCE d'une exploitation, on utilise 
	my $fin_exp = $tmpdatefin->get_text;				# systématiquement l'adresse du widget en la prenant
	debug("MAIN ==> date de fin d'exploitation : $fin_exp");	# dans la table de hachage %W
									# (oui je sais c'est un peu compliqué.. désolé ! )
	#tests sur les dates
	my @tab_debut_exp = split(/\//, $debut_exp);
	my $debut_exp_formated = $tab_debut_exp[2].$tab_debut_exp[1].$tab_debut_exp[0];

	my @tab_fin_exp = split(/\//, $fin_exp);
	my $fin_exp_formated = $tab_fin_exp[2].$tab_fin_exp[1].$tab_fin_exp[0];

	if (	#format de date : regexp vrai si debut_exp n'est pas du type 11/22/3333
		($debut_exp =~ /\D{2}\/\D{2}\/\D{4}/)
		or ($fin_exp =~ /\D{2}\/\D{2}\/\D{4}/)
		#intégrité de la date
		or ($tab_debut_exp[0]>31) or ($tab_fin_exp[0]>31)
		or ($tab_debut_exp[1]>12) or ($tab_fin_exp[1]>12)
		or ($tab_debut_exp[2]>2025) or ($tab_fin_exp[2]>2025)
		or ($tab_debut_exp[2]<2000) or ($tab_fin_exp[2]<2000)
		#datedebut doit etre inférieur a datefin
		or (($debut_exp_formated)>
			($fin_exp_formated))
		){	
			my $erreur_date = Gtk2::MessageDialog->new ($window,	#fenetre parente
						[qw/modal destroy-with-parent/],	#params de la fenetre
						'error',	#type d'icone de la fenetre
						'ok',	#valeur pour le champ 'valider'
						"ERREUR DE LANCEMENT\nMerci de vérifier les champs de dates !\nFormat => JJ/MM/AAAA");
			$erreur_date->show();
			$erreur_date->run;
			# destruction de la boite de dialogue
			$erreur_date->destroy;
			#sors de la fonction avec le code -1
			return -1;
	}

	####
	# 2. Appel des scripts d'exploitation
	#
	if($DEBUG==1){print "debug= $DEBUG\tdate debut= $debut_exp\tfin_exp= $fin_exp\n";}
	if($messagerie_ok == 1){

		affich_info("Exploitation Antigen en cours.....");

		#appel de la fonction d'exploitation
		if($DEBUG==1){debug("MAIN ==> appel de la fonction sub_antigen");}
		sub_antigen($DEBUG,$debut_exp_formated,$fin_exp_formated);
		if($DEBUG==1){debug("MAIN ==> sortie de la fonction sub_antigen");}

		affich_info("OK\nExploitation WebWasher en cours.....");

		if($DEBUG==1){debug("MAIN ==> appel de la fonction sub_webwasher");}
		sub_webwasher($DEBUG,$debut_exp_formated,$fin_exp_formated);
		if($DEBUG==1){debug("MAIN ==> sortie de la fonction sub_webwasher");}
		affich_info("OK\n");
	}

	if($fichiers_ok==1){

		affich_info("Exploitation Norton en cours.....");

		if($DEBUG==1){debug("MAIN ==> appel de la fonction sub_norton");}
		sub_norton($DEBUG,$debut_exp_formated,$fin_exp_formated);
		if($DEBUG==1){debug("MAIN ==> sortie de la fonction sub_norton");}

		affich_info("OK\n");
	}

	####
	# 3. Corrélations
	#
	if($messagerie_ok == 1){

		affich_info("Corrélation des chiffres de messagerie en cours.....");

		if($DEBUG==1){debug("MAIN ==> appel de la fonction sub_result_mail");}
		sub_result_mail($DEBUG,$debut_exp_formated,$fin_exp_formated);
		if($DEBUG==1){debug("MAIN ==> sortie de la fonction sub_result_mail");}

		affich_info("OK\n");
	}

	if($virus_ok==1){
		
		affich_info("Création de la liste des virus.....");

		if($DEBUG==1){debug("MAIN ==> appel de la fonction sub_listvirus");}
		sub_listvirus($DEBUG, $messagerie_ok, $fichiers_ok);
		if($DEBUG==1){debug("MAIN ==> sortie de la fonction sub_listvirus");}

		affich_info("OK\n");
	}

	####
	# 4. affichage des resultats dans la fenetre principale

	afficher_messagerie();
	afficher_fichiers();
	if ($messagerie_ok==1 or $fichiers_ok==1){
		afficher_virus();
	}
	else{
		$info="";
		affich_info("Pour afficher la liste des virus, vous devez choisir au\nmoins un des deux autres modes.");
	}


	# basculement du test de lancement
	$lancement_ok = 1;
}

############################################################################################################################
# rapatriement des logs sur \\SECSI\\VIRUS\\ARCHIVE
#
sub rapatriement {
	
	#un peu de verbiage
	if($DEBUG==1){debug("MAIN ==> Appel de la fonction de rapatriement des logs vers secsi\\virus\\archives");}
	$info="";
	affich_info("Rapatriement des logs en cours.....");
	
	# appel de la fonction de rapatriement et attente d'un code de retour
	$retour = 0;
	my $status = sub_rapatriement_logs($DEBUG,\$retour,$user,$pass); # \$retour passage le pointeur vers $retour

	if($retour == -1){ #là, ya eu plantage du script...
		affich_info("ERREUR !!!\nRelancez l'exploitation en mode debug et consultez .\\logs\\debug_TBvir.txt\n");
	}
	else {	# tout s'est bien passé, on affiche le nombre de fichier copié
		affich_info("OK\n$status fichiers ont été copiés dans \\Secsi\\Virus\\Archivage\nConsultez $DEBUG_FILE pour plus d'infos...");
	}
}


############################################################################################################################
# Choix du fichier pour l'exportation des données
#
sub exporter {

	if($DEBUG==1){debug("MAIN ==> Appel de la fonction exporter");}

	#test de lancement avec l'export
	if ($lancement_ok == 1){
	
		# Gtk a une méthode toute prete pour créer une boite de selection de fichier
		$file_dialog =  Gtk2::FileSelection->new( "Selectionner un fichier pour l'export" );
	
		#on spécifie un nom par défaut qui est modifiable
		$file_dialog->set_filename( "TB_virus-[SPECIFIEZ UNE DATE].xls" );

		#affichage de tous les boutons d'options
		$file_dialog->show_fileop_buttons();
	
		# Connecte le bouton cancel à la fonction qui détruit la fenetre
		$file_dialog->cancel_button->signal_connect( "clicked" , sub {$file_dialog->destroy;});

		# Connecte le bouton ok à la fonction export_xls
		my $file_for_export = 	$file_dialog->get_filename();
		
		$file_dialog->ok_button->signal_connect( "clicked" , \&export_xls ) ; 
		# affichage
		$file_dialog->show_all();

		$info="";
		affich_info("Export au format Excel en cours.....");

	}
	else { #affichage d'une erreur
		my $erreur_export = Gtk2::MessageDialog->new ($window,	#fenetre parente
						[qw/modal destroy-with-parent/],	#params de la fenetre
						'error',	#type d'icone de la fenetre
						'ok',	#valeur pour le champ 'valider'
						"Aucune exploitation effectuée !!!\nVous n'avez rien à exporter");
		$erreur_export->show();
		$erreur_export->run;
		# destruction de la boite de dialogue
		$erreur_export->destroy;
	}

	affich_info("OK");

}

#########################################
# Appel de l'export excel
#

sub export_xls(){
	
	#récupération du fichier de destination de l'export
	$fichier_sortie = $file_dialog->get_filename();
	
	# destruction de la fenetre de selection
	$file_dialog->destroy;

	# choix de l'export des graphiques en PNG
	my $annuler="Annuler";
	my $export_png = 0;
	my $dialog = Gtk2::MessageDialog->new ($window,	#fenetre parente
					[qw/modal destroy-with-parent/],	#params de la fenetre
					'question',	#type d'icone de la fenetre
					'ok',	#valeur pour le champ 'valider'
					"Voulez-vous exporter les graphiques\nau format PNG a coté du\nfichier excel ?");	#message
	$dialog->add_button($annuler, 'cancel');
	$dialog->set_response_sensitive('cancel',TRUE);
	$dialog->show_all();
	# lors du clic sur 'valider' on change la valeur d'export png
	if('ok' eq $dialog->run){
		$export_png=1;
	}
	$dialog->destroy;

	if($DEBUG==1){debug("MAIN ==> Entrée dans la fonction sub_excel pour exporter vers $fichier_sortie");}

	#####
	# appel de la fonction d'exportation des données au format excel
	#
	# *** passages de paramétres :
	# 		*DEBUG => mode débug activé ou non
	# 		*fichier_sortie => le fichier excel de destination
	# 		*tous les "@" sont des tableaux contenants les données d'exploitation
	# 		*$totmailinf est le total de mails infectés (pour le top 5 virus mail)
	# 		*$tot_fichiers_inf est le total de fichiers infectés (pour le top 5 virus norton)
	# 		*$export_png est le choix d'exporter les graphiques au format PNG ou non
	#
	sub_excel($DEBUG, $fichier_sortie,\@DonneesMail,\@DonneesFichiers,\@DonneesVirusMail,\@TotauxMail,\@Top5virmail, $totmailinf, \@DonneesVirusFichiers,$tot_fichiers_inf, $NbMachinesUniqInf, $export_png);
}


############################################################################################################################
# Export automatique des logs pour le mois précédent
#
sub export_auto {

		if($DEBUG==1){debug("MAIN ==> Appel de l'export automatique mensuel");}

		# récupére la date du mois précédent (celui à exploiter)
		my $dateexploit = getdateexploit();
		if($DEBUG==1){debug("MAIN ==> Mois traités : $dateexploit");}

		# supprime l'ancien fichier de logs
		unlink ".\\logs\\DEBUG_Export_Auto_Mensuel.txt";

		$info = "";
		affich_info("Export automatique mensuel appelé\n\t\t------------------\nMois traité : $dateexploit\n");

		# on test si l'exploitation a déjà été faite
		$retour = 0;
		test_dejafait($dateexploit,\$retour);	# cette fonction passe la valeur de retour a -1 si 
							# l'exploitation a déjà été faite pour le mois
		if($retour == -1){
			affich_info("ERREUR !!!\nPériode déjà exploitée...arrêt de l'export !\n");
		}
		else {	
			if($retour==0){

				# ok, on continu de suivre le script en testant la présence de TOUS les fichiers de logs
				affich_info("Vérification de la présence des fichiers de logs....");
				my $listabsence = "";

				# listabsence récupère la liste des fichiers manquants
				$listabsence = test_presencelogs($dateexploit,\$retour);

				# si listabsence n'est pas vide, le script s'arrete en affichant la liste des fichiers manquants
				if ($listabsence ne ""){
					affich_info("\nDES FICHIERS SONT MANQUANTS POUR LA PERIODE $dateexploit\n$listabsence\n\nEssayez de rapatrier les logs et recommencez.");
				}
				else {	# si aucun fichier ne manque, on continue
					affich_info("OK\n");

					# si le mois traités est janvier, on crée un nouveau fichier excel
					if(01 == substr($dateexploit,4,2)){

						affich_info("Début d'année => Création du nouveau tableau de bord.....");

						new_TB($dateexploit,$retour);	# la fonction change la valeur de retour si 
										# la création fonctionne mal
						if($retour == 0){
							affich_info("OK\n");
						}
						else{ 	affich_info("ERREUR NON LISTEE !!!\nVerifiez les droits et relancez.\n");
						}
					}

					# exploitation des données pour le mois 
					# (réutilisation des sous-fonctions présentes dans la fonction "lancer")
					$DEBUG=1; $messagerie_ok=1; $fichiers_ok=1; 
					my $debut_exp_formated = $dateexploit."01"; my $fin_exp_formated = $dateexploit."31";
					if($DEBUG==1){print "debug= $DEBUG\tdate debut= $debut_exp\tfin_exp= $fin_exp\n";}
					affich_info("Exploitation Antigen en cours.....");
					if($DEBUG==1){debug("MAIN ==> appel de la fonction sub_antigen");}

					# exploitation antigen => fichier "sub_antigen.pl"
					sub_antigen($DEBUG,$debut_exp_formated,$fin_exp_formated);
					if($DEBUG==1){debug("MAIN ==> sortie de la fonction sub_antigen");}
					affich_info("OK\nExploitation WebWasher en cours.....");
					if($DEBUG==1){debug("MAIN ==> appel de la fonction sub_webwasher");}

					# exploitation webwasher => fichier "sub_webwasher.pl"
					sub_webwasher($DEBUG,$debut_exp_formated,$fin_exp_formated);
					if($DEBUG==1){debug("MAIN ==> sortie de la fonction sub_webwasher");}
					affich_info("OK\n");
					affich_info("Exploitation Norton en cours.....");
					if($DEBUG==1){debug("MAIN ==> appel de la fonction sub_norton");}

					# exploitation norton => fichier "sub_norton.pl"
					sub_norton($DEBUG,$debut_exp_formated,$fin_exp_formated);
					if($DEBUG==1){debug("MAIN ==> sortie de la fonction sub_norton");}
					affich_info("OK\n");
					affich_info("Corrélation des chiffres de messagerie en cours.....");
					if($DEBUG==1){debug("MAIN ==> appel de la fonction sub_result_mail");}

					# correlation des resultat de la messagerie => fichier "sub_result_mail.pl"
					sub_result_mail($DEBUG,$debut_exp_formated,$fin_exp_formated);
					if($DEBUG==1){debug("MAIN ==> sortie de la fonction sub_result_mail");}
					affich_info("OK\n");
					affich_info("Création de la liste des virus.....");
					if($DEBUG==1){debug("MAIN ==> appel de la fonction sub_listvirus");}

					# création des listes de virus => fichier "sub_listvirus.pl"
					sub_listvirus($DEBUG, $messagerie_ok, $fichiers_ok);
					if($DEBUG==1){debug("MAIN ==> sortie de la fonction sub_listvirus");}
					affich_info("OK\n");
					afficher_messagerie();
					afficher_fichiers();
					afficher_virus();
					$lancement_ok = 1;

					# export vers un fichier excel temporaire
					# (réutilisation de la sous-fonction sub_excel présente dans le fichier "sub_excel.pl")
					affich_info("Export vers fichier Excel temporaire.....");
					my $fichier_temp = "C:\\tbvirus_auto.xls"; my $export_png=0;
					sub_excel($DEBUG, $fichier_temp,\@DonneesMail,\@DonneesFichiers,\@DonneesVirusMail, \@TotauxMail, \@Top5virmail, $totmailinf, \@DonneesVirusFichiers,$tot_fichiers_inf, $NbMachinesUniqInf, $export_png);
					affich_info("OK\n");

					# copie des données dans le tableau de bord annuel
					affich_info("Stockage des données dans le tableau de bord annuel.....");
					sub_stocktb($dateexploit, $fichier_temp, $retour);
					if($retour == 0){
						affich_info("OK\n");
					}
					else{ 	affich-info("ERREUR NON LISTEE !!!\nVerifiez les droits et la présence du fichier et relancez.\n");
					}
					# suppression du fichier temporaire
					unlink $fichier_temp;


				}
			}
		}



}


############################################################################################################################
# Bouton de confirmation pour quitter l'application
#
sub confirm_quitter {

	if($DEBUG==1){debug("MAIN ==> appel de la fonction confirm_quitter");}

	my $annuler="Annuler";

	# bouton de dialogue			
	my $dialog = Gtk2::MessageDialog->new ($window,	#fenetre parente
					[qw/modal destroy-with-parent/],	#params de la fenetre
					'question',	#type d'icone de la fenetre
					'ok',	#valeur pour le champ 'valider'
					"Voulez-vous vraiment quitter ?");	#message
	# le deuxième bouton : Annuler
	$dialog->add_button($annuler, 'cancel');

	# on le rend actif
	$dialog->set_response_sensitive('cancel',TRUE);

	# affichage de la boite de dialogue
	$dialog->show_all();

	# lors du clic sur 'valider' on quitte tout
	if('ok' eq $dialog->run){
		Gtk2->main_quit;
	}

	# destruction de la boite de dialogue
	$dialog->destroy;
}

	

############################################################################################################################
# Affichage des résultats dans l'interface
#
# les resultats sont pris dans les fichiers créé par les sous fonctions (au format csv) et sont importés dans
# les variables de "listes" de l'interface Gtk2
#
sub afficher_messagerie {

	#récup des résultats dans un tableau
	my @templst;
	my @gettotal;

	# booleen de test
	my $MAJ=0;

	if (-e $resultat_mail){

	       	open LIRE, $resultat_mail or die "$!\n";
  
		if($DEBUG==1){debug("MAIN ==> lecture du fichier $resultat_mail");}    
	
		while(<LIRE>) {
			chomp;
			# si la ligne commence par un dieze, c'est un total
			if ($_ =~ /#/){
				if (($_ =~/a/) or ($_ =~/e/)){
					push @gettotal, split(/ /,$_);
				}
			}
			#sinon c'est une ligne a mettre dans la liste
			else { 	push @templst, [split ";"];
			}
		}
		close LIRE;
		if($DEBUG==1){debug("MAIN ==> fermeture du fichier $resultat_mail effectuee avec succes, $#DonneesMail lignes lues.");}    

		$MAJ=1;
	}

	# si les données on été mise a jour, alors on rentre dans cette partie... sinon on met les champs a blanc
	if($MAJ==1){

		#affichage des totaux
		$tot_messagerie->set_text("\n$gettotal[1]\n\n$gettotal[3]\n\n$gettotal[5]\n\n$gettotal[7]\n\n");

		#total des mails infectes dans variable globale pour réutilisation ultérieure
		my @temp = split(/\t\t/,$gettotal[5]);
		$totmailinf = $temp[1];
		@temp = split(/\t\t\t/,$gettotal[7]);
		$totmailinf += $temp[1];
		if($DEBUG==1){debug("MAIN ==> calcul du total de mails infectés : $totmailinf");}

	}
	else {
		$tot_messagerie->set_text("");
		$totmailinf=0;
	}

	# on met templst dans le tableau global DonneesMail
	@DonneesMail = @templst;
	@TotauxMail = @gettotal;

	my @cases = (0..$#DonneesMail); # cases contient le nombre de jours traités dans Donnees Mails
    
	#Chaque ligne est stockée dans la référence a listmail
	@{$W{listmail}->{data}} = @DonneesMail[@cases];
	
}

# => pour norton
#
sub afficher_fichiers {
	
	#variables pour les totaux
	$tot_fichiers_inf = 0;
	my ($tot_machines_inf, $tot_ordi_agence, $tot_ordi_siege, $tot_serveur)=0;	
	my @temp;

	my $MAJ=0;

	if(-e $resultat_fichiers){
		open LIRE, $resultat_fichiers or die "$!\n";
		if($DEBUG==1){debug("MAIN ==> lecture du fichier $resultat_fichiers effectuee avec succes");}

		#parcours du fichier
		while(<LIRE>) {
			chomp;
			#tableau pour affichage de la liste
			push @temp, [split ";"];
			#ajout dans les totaux
			my @val=split(/;/,$_);
			$tot_fichiers_inf += $val[2];
			$tot_machines_inf += $val[3]+$val[4]+$val[5];
			$tot_ordi_agence += $val[3];
			$tot_ordi_siege += $val[4];
			$tot_serveur += $val[5];
			debug("MAIN ==> TOTAUX FICHIERS : $tot_fichiers_inf, $tot_machines_inf, $tot_ordi_agence, $tot_ordi_siege, $tot_serveur");
		} 
		close LIRE;
		if($DEBUG==1){debug("MAIN ==> fermeture du fichier $resultat_fichiers effectuee avec succes");}    
	
		# récup les valeurs de totaux (qui contiennent la chaine "soit =>")
		if (-e $detail_norton){
			open LIREDETAIL,$detail_norton or die "$!\n";
			while(<LIREDETAIL>){
				if($_ =~/soit => /){
					@tot_machines_inf_uniq = split(/ /,$_);
				}
			}
			close LIREDETAIL;
		}

		$MAJ=1;
	}

	if($MAJ==1){
		#affichage des totaux
		$tot_fichiers->set_text("\nFichiers infectés\t\t$tot_fichiers_inf\n\nMachines infectées (avec doublons)\t$tot_machines_inf\n\n\tdont:\t$tot_ordi_agence en agence\n\t\t\t$tot_ordi_siege au siège\n\t\t\t$tot_serveur serveurs\n\n$tot_machines_inf_uniq[2] machines différentes ont été\ninfectées sur la période.");

	}
	else{
		$tot_fichiers->set_text("");
	}

	@DonneesFichiers = @temp;
	$NbMachinesUniqInf = $tot_machines_inf_uniq[2];

	my @cases = (0..$#DonneesFichiers);

	@{$W{listfichiers}->{data}} = @DonneesFichiers[@cases];
}



# => pour les virus du mail
#
sub afficher_virus {

	# travail sur des variables locales copiés ensuites sur des variables globales
	my @templst;
	my @tempvirmail;

	#liste des virus de la messagerie
	if($messagerie_ok==1){
		# si le fichier existe
		if (-e $liste_virus_mail){

			# on le parcours
			open LIRE, $liste_virus_mail or die "$!\n";
			if($DEBUG==1){debug("ouverture de $liste_virus_mail effectuee avec succes");}
    
			while(<LIRE>) {
				chomp;
				# on sépare les lignes commencant par un diéze des autres
				if($_ =~/#/){ 
					
					# la ligne "TOP 5 ..." n'est pas considérée
					unless ($_ =~/TOP/){
				
						# on enleve le dieze de début de ligne
						$_ =~ s/#//;
						# et le point virgule qui suis
						$_ =~s/^;//;

						push @tempvirmail, [split ";"];
					}
				}
				else {
					push @templst, [split ";"];
				}
			} 
			close LIRE;
			if($DEBUG==1){debug("fermeture du fichier $liste_virus_mail effectuee avec succes");} 
		}
	}
	# récup des informations
	@DonneesVirusMail = @templst;
	@Top5virmail = @tempvirmail;

	# stockage des infos (tableau a 2 dimensions) dans la liste
	my @cases = (0..$#DonneesVirusMail);
    	@{$W{listvirusmail}->{data}} = @DonneesVirusMail[@cases];

			#############################################################################

	my @templst;

	#liste des virus norton
	if($fichiers_ok==1){
		if (-e $liste_virus_fichiers){
			open LIRE, $liste_virus_fichiers or die "$!\n";
			if($DEBUG==1){debug("ouverture de $liste_virus_fichiers effectuee avec succes");}
    
			while(<LIRE>) {
				chomp;
				push @templst, [split ";"];
			} 
			close LIRE;
				if($DEBUG==1){debug("fermeture du fichier $liste_virus_fichiers effectuee avec succes");}    
		}
		
	}
	@DonneesVirusFichiers = @templst;   

	my @cases = (0..$#DonneesVirusFichiers);
   
	@{$W{listvirusfichiers}->{data}} = @DonneesVirusFichiers[@cases];
}


#################################################
# Fonction d'affichage dans le fichier debug
#

sub debug(){
	@message = @_;
	open(DEBUG_FILE,">>$DEBUG_FILE") or die print "IMPOSSIBLE D'OUVRIR LE FICHIER DEBUG\n";
	print DEBUG_FILE "$message[0]\n";
	close DEBUG_FILE;
}

#################################################
# Fonction d'affichage dans la fenetre TBvirus
#
sub affich_info(){
	@txt = @_;
	$info = $info.$txt[0];
	$informations->set_text($info);
	Gtk2->main_iteration while Gtk2->events_pending;
}

