Supermagnus | Bonjour,
Je suis en train de développer un script perl pour récupérer les données de 2 champs d'un formulaire (une adresse IP et un hostname) et les comparer avec ceux d'un fichier de base (base.routeur.txt). Si l'un des deux champs du formulaire correspond à une ligne du fichier de base alors on effectue le traitement adéquat.
Ex du fichier de base :
192.168.31.23 FGHUN-123
193.34.53.23 GHEN12-45
... |
Voici le code html du formulaire :
Code :
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Page de Recherche</title>
- </head>
- <body bgcolor="#E0E0E0">
- <h1>Récupération de configuration : </h1>
- <form action="cgi-bin/script.cgi" method="post">
- <p>Hostname : <input size="30" maxlength="40" name="hostname"></p>
- <p>Adresse IP : <input size="15" maxlength="15" name="adresse"></p>
- <p><input type="submit" value="Chercher"> <input name="reset" type="reset" value="Effacer"></p>
- </form>
- </body>
- </html>
|
Puis celui du script cgi en perl dont il est question (script.cgi) :
Code :
- #!/usr/bin/perl -w
- use strict;
- use CGI::Carp qw(fatalsToBrowser);
- use POSIX 'strftime';
- open (BASE, 'base.routeur.txt') || die ("Prblm d'ouverture du fichier base.routeur.txt : $!\n" );
- #Lecture des champs du formulaire
- read(STDIN, my $donnees, $ENV{'CONTENT_LENGTH'});
- my @champs_formulaire = split(/&/, $donnees);
- my ($champ, $nom, $valeur);
- my %formulaire;
- my (@version,@conf);
- ## Boucle de decodage HTML (type MIME)
- foreach $champ (@champs_formulaire)
- {
- (my $nom, my $valeur) = split(/=/, $champ);
- $valeur =~ tr/+/ /;
- $valeur =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
- $valeur =~ s/</</g;
- $valeur =~ s/>/>/g;
- $formulaire{$nom} = $valeur;
- }
- #Boucle de traitement du fichier ligne par ligne
- while (my $ligne=<BASE> )
- {
- chomp $ligne;
- chop $ligne;
- my($ipr,$hostname)=split(/ /, $ligne);
- my $iprform = $formulaire{adresse};
- my $hostform = $formulaire{hostname};
- #si le champ @IP correspond a une @ip reconnue alors...
- if ($iprform eq $ipr)
- {
- my $fichierver="/tftpboot/speedstream/$hostname/VERSION.TXT";
- my $time = (stat $fichierver)[9];
- open(VERSION,$fichierver);
- @version = <VERSION>;
- close(VERSION);
- open(COPY,"/tftpboot/speedstream/$hostname/COPY.TXT" );
- @conf = <COPY>;
- close(COPY);
- print "Content-type: text/html\n\n";
- print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">', "\n";
- print "<html><head><title>Configuration</title></head>\n";
- print "<body><h1>Resultat de la recherche :</h1>\n";
- print "<p><b>Hostname :</b> $hostname</p>";
- print "<p><b>Adresse IP :</b> $formulaire{adresse}</p>";
- print "<b>Version :</b><pre> @version</pre>";
- print "\n <b>Syntaxe pour rÈcupÈrer la conf :\n</b><pre> @conf</pre>";
- print "<b>Date de la derniere modification : </b>";
- print strftime '%a %d %b %Y @ %I:%M %p', localtime $time;
- print "<p><a href=\"/index.html\"><em><strong>Retour</strong></em></a></p>";
- print "</body></html>\n";
- last;
- }
- #de même si le hostname du routeur correspond
- elsif ($hostform eq $hostname)
- {
- my $fichierver="/tftpboot/speedstream/$hostname/VERSION.TXT";
- my $time = (stat $fichierver)[9];
- open(VERSION,$fichierver);
- @version = <VERSION>;
- close(VERSION);
- open(COPY,"/tftpboot/speedstream/$hostname/COPY.TXT" );
- @conf = <COPY>;
- close(COPY);
- print "Content-type: text/html\n\n";
- print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">', "\n";
- print "<html><head><title>Configuration</title></head>\n";
- print "<body><h1>Resultat de la recherche :</h1>\n";
- print "<p><b>Hostname :</b> $formulaire{hostname}</p>";
- print "<p><b>Adresse IP :</b> $ipr</p>";
- print "<b>Version :</b><pre> @version</pre>";
- print "\n <b>Syntaxe pour rÈcupÈrer la conf :\n</b><pre> @conf</pre>";
- print "<b>Date de la derniere modification : </b>";
- print strftime '%a %d %b %Y @ %I:%M %p', localtime $time;
- print "<p><a href=\"/index.html\"><em><strong>Retour</strong></em></a></p>";
- print "</body></html>\n";
- last;
- }
- #sinon en attendant on envoi un lien retour
- print "Content-type: text/html\n\n";
- print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">', "\n";
- print "<html><head><title>Configuration</title></head>\n";
- print "<p><a href=\"/index.html\"><em><strong>Retour</strong></em></a></p>";
- print "</html>\n";
- }
|
Actuellement le script fonctionne mais mal, en effet je trouve ma méthode peut pratique et je suis persuadé de pouvoir faire plus simple, c'est pourquoi je demande de l'aide ou des idées pour améliorer tout ça.
Aussi comme le fichier de base est lu ligne par ligne chaque if est traiter ligne par ligne, c'est à dire que si je recherche une @IP qui ce trouve à la ligne 50, j'obtient ceci : Et si rien ne correspond ceci :
Donc voilà si quelqu'un peu me débloquer ou me donner 2/3 idées, j'ai pensé à un tableau de Hashage mais je sais pas comment l'initialiser avec les valeurs du fichier de base.
Merci Message édité par Supermagnus le 28-05-2006 à 18:12:05
|