Perl CGI formulaire

Résolu/Fermé
deniss92 Messages postés 39 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 15 septembre 2013 - 15 nov. 2008 à 12:31
deniss92 Messages postés 39 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 15 septembre 2013 - 25 nov. 2008 à 23:10
Bonjour,
J'ai fait un script perl qui récupère plusieurs fichiers de logs de connexions en fonction d'un critère, en vu de faire les statistiques du mois. Le script a l'air de fonctionner. J'aimerai pouvoir mettre le script sur le web avec un formulaire, afin que l'utilisateur puisse saisir le mois (sous la forme 200810) pour lequel il veut éditer les statistiques et automatiser l'éditon à l'aide d'un bouton submit.
Pour le moment, je ne sais pas comment m'y prendre. Si quelqu'un a une idée, ce serait sympa.
Merci d'avance.
Deniss92

Voici le script

#!/usr/bin/perl
system "clear";
chdir('/home/user/stats') || die ("Erreur chdir \n");
$motif="COMPTE_UTILISATEUR";# pour ne récupérer que les lignes ayant le motif "COMPTE_UTILISATEUR"
$mois="*200810*";# pour récupérer la liste des fichiers de logs dont le nom a un motif "200810"
%table;
chomp(@logs = glob($mois));
foreach $e(@logs){
open FILE,"$e" or warn "E/S : $!\n";
while (<FILE>){
if ($_=~/$motif/){
$total++;
chomp;
($date,$compte,$id,$user,$ip)=split (/\|/,$_);
$_=join(";",$user,$date);
push @{$table{$user}}, $date;
}
}
}
print "Utilisateur\t| Nombre de connexion\n";
print "_____________________________________\n\n";
foreach $user (sort keys %table) {
$nombre = 0;
@dates = @{$table{$user}};
foreach $date (@dates) {
$nombre++;
}
$longueur=15;
$dif=" " x ($longueur-length($user));
print "$user $dif| $nombre\n";
}
print "_____________________________________\n\n";
print "Total\t\t:",$total,"\n";

Résultat


Utilisateur | Nombre de connexion
_____________________________________

Alain Terrieur | 100
Alex Terrieur | 20
Chantl Opéra | 16
Aude Veiselt | 20
Jean Peuplu | 30
Mégane Renault | 81
Molo Molo | 18
Gilet de sauvetage | 16
Allan Limite | 103
Toto | 70
Tata | 3
Autres | 500
_____________________________________

Total : xxxx

1 réponse

deniss92 Messages postés 39 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 15 septembre 2013 1
25 nov. 2008 à 23:10
Bonsoir,

J'ai modifié le script intial, car le formulaire ,avec param() n'était pas indispensable, sachant que l'on peut récupérer la date système et faire le même traitement. Ainsi, j'ai fait 2 scripts (un script pour le traitement des fichiers de logs et un autre pour l'affichage via cgi sur une page web). les fichiers de logs se pésentent sous la forme suivante :

extrait de fichiers de logs :
28 nov 8 16:47 stat_public_public_20081108164623
92 nov 8 17:58 stat_public_public_20081108175826
2490 nov 8 18:04 stat_public_public_20081108180022
336 nov 8 18:50 stat_public_public_20081108184955
389 nov 8 19:03 stat_public_public_20081108190222
130 nov 8 21:32 stat_public_public_20081108213219
90 nov 8 21:52 stat_public_public_20081108215243

Le script de traitement est le suivant :

#!/usr/bin/perl
# script de traitement des données
($sec, $min, $heure, $jour, $mois,$annee, undef, undef, undef) = localtime();
$mois += 1 and $annee += 1900;
chdir('/home/user/stats') || die ("Erreur chdir \n");
$annee_mois='*'.$annee.$mois.'*'; # récupération du critère année et mois
$motif="COMPTE_UTILISATEUR";
$total;
open RES,"> /var/www/cgi-bin/stat_mois.txt" or die "E/S : $!\n";
chomp(@logs = glob($annee_mois));
foreach $e(@logs){
open FILE,"$e" or warn "E/S : $!\n";
while (<FILE>){
if ($_=~/$motif/){
$total++;
chomp;
($date,$compte,$id,$user,$ip)=split (/\|/,$_);
$_=join(";",$user,$date);
push @{$table{$user}}, $date;
}
}
}
foreach $user (sort keys %table) {
$nombre = 0;
@dates = @{$table{$user}};
foreach $date (@dates) {
$nombre++;
}
push @{$stat{$user}},$nombre;
}
foreach $k(sort keys %stat){
chomp;
print RES "$k", map { ";$_" } @{$stat{$k}}, "\n";
}
print RES "Total;",$total,"\n";

Le script cgi pour le résultat sur le web est le suivant :

#!/usr/bin/perl
# affiche les données
use CGI qw(:standard :html3);

$cgi = new CGI;

($sec, $min, $heure, $jour, $mois,$annee, undef, undef, undef) = localtime();
$mois += 1 and $annee += 1900;
$mois_annee=$mois.'-'.$annee;
my %table;
open (FILE, "stat_mois.txt");
while (<FILE>) {
my ($user,$connexion)=split/;/;
chomp;
push @{$table{$user}},$connexion;
}

$\="\n";
print
$cgi->header() .
$cgi->start_html (
-title=>'Stats mensuelles',
-author=>'Deniss92',
-meta=>{'keywords'=>'CGI Perl'},
-BGCOLOR=>'white',
-LINK=>'red',
-charset=>'UTF-8',

).
$cgi->h1('Statistiques du '.$mois_annee) . "\n";
#print '<TABLE border="1" cellspacing="2" cellpadding="2">' . "\n";
print $cgi->table({border=>1,width=>'20%'}) . "\n";
print $cgi->Tr(th[qw(Utilisateur Connexion)]);
for my $k (sort keys %table) {
print $cgi->Tr(td($k), td({align=>"right"},[sort @{$table{$k}}]));
}
print "</TABLE>";
$cgi->end_html ;
exit (0);

Le résultat du script donne :

<head>
<title>Stats mensuelles</title>
<link rev="made" href="mailto:Deniss92" />
<meta name="keywords" content="CGI Perl" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body charset="UTF-8">
<h1>Statistiques du 11-2008</h1>

<table width="20%" border="1" />

<tr><th>Utilisateur</th> <th>Connexion</th></tr>
<tr><td>Alain Terrieur</td> <td align="right">16</td></tr>
<tr><td>Alex Terrieur</td> <td align="right">14</td></tr>
<tr><td>Alexis</td> <td align="right">14</td></tr>
<tr><td>Aude Veiselt</td> <td align="right">18</td></tr>
<tr><td>Chantal Op�ra</td> <td align="right">11</td></tr>
<tr><td>Gilet de Sauvetage</td> <td align="right">19</td></tr>
<tr><td>Jean Peuplu</td> <td align="right">13</td></tr>
<tr><td>Mathias</td> <td align="right">15</td></tr>
<tr><td>Public interne</td> <td align="right">101</td></tr>
<tr><td>Public externe</td> <td align="right">751</td></tr>
<tr><td>Tony</td> <td align="right">16</td></tr>
<tr><td>Total</td> <td align="right">988
</td></tr>
</TABLE>

-------------------------------------------------------------
Reamarque : Je reste convaincu, qu'on peut faire plus simple.

A bientot.

Deniss92
1