[PERL] [CGI] Recherche a partir de données d'un formulaire

Recherche a partir de données d'un formulaire [PERL] [CGI] - Perl - Programmation

Marsh Posté le 27-05-2006 à 22:08:16    

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 :
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html>
  3. <head>
  4. <title>Page de Recherche</title>
  5. </head>
  6. <body bgcolor="#E0E0E0">
  7. <h1>R&eacute;cup&eacute;ration de configuration : </h1>
  8. <form action="cgi-bin/script.cgi" method="post">
  9. <p>Hostname : <input size="30" maxlength="40" name="hostname"></p>
  10. <p>Adresse IP : <input size="15" maxlength="15" name="adresse"></p>
  11. <p><input type="submit" value="Chercher"> <input name="reset" type="reset" value="Effacer"></p>
  12. </form>
  13. </body>
  14. </html>


 
Puis celui du script cgi en perl dont il est question (script.cgi) :
 

Code :
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use CGI::Carp qw(fatalsToBrowser);
  4. use POSIX 'strftime';
  5. open (BASE, 'base.routeur.txt') || die ("Prblm d'ouverture du fichier base.routeur.txt : $!\n" );
  6. #Lecture des champs du formulaire
  7. read(STDIN, my $donnees, $ENV{'CONTENT_LENGTH'});
  8. my @champs_formulaire = split(/&/, $donnees);
  9. my ($champ, $nom, $valeur);
  10. my %formulaire;
  11. my (@version,@conf);
  12. ## Boucle de decodage HTML (type MIME)
  13. foreach $champ (@champs_formulaire)
  14. {
  15.   (my $nom, my $valeur) = split(/=/, $champ);
  16.   $valeur =~ tr/+/ /;
  17.   $valeur =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  18.   $valeur =~ s/</&lt;/g;
  19.   $valeur =~ s/>/&gt;/g;
  20.   $formulaire{$nom} = $valeur;
  21. }
  22. #Boucle de traitement du fichier ligne par ligne
  23. while (my $ligne=<BASE> )
  24. {
  25. chomp $ligne;
  26. chop $ligne;
  27. my($ipr,$hostname)=split(/ /, $ligne);
  28. my $iprform = $formulaire{adresse};
  29. my $hostform = $formulaire{hostname};
  30. #si le champ @IP correspond a une @ip reconnue alors...
  31. if ($iprform eq $ipr)
  32. {
  33. my $fichierver="/tftpboot/speedstream/$hostname/VERSION.TXT";
  34. my $time = (stat $fichierver)[9];
  35. open(VERSION,$fichierver);
  36. @version = <VERSION>;
  37. close(VERSION);
  38. open(COPY,"/tftpboot/speedstream/$hostname/COPY.TXT" );
  39. @conf = <COPY>;
  40. close(COPY);
  41. print "Content-type: text/html\n\n";
  42. print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">', "\n";
  43. print "<html><head><title>Configuration</title></head>\n";
  44. print "<body><h1>Resultat de la recherche :</h1>\n";
  45. print "<p><b>Hostname :</b> $hostname</p>";
  46. print "<p><b>Adresse IP :</b> $formulaire{adresse}</p>";
  47. print "<b>Version :</b><pre> @version</pre>";
  48. print "\n <b>Syntaxe pour rÈcupÈrer la conf :\n</b><pre> @conf</pre>";
  49. print "<b>Date de la derniere modification : </b>";
  50. print strftime '%a %d %b %Y @ %I:%M %p', localtime $time;
  51. print "<p><a href=\"/index.html\"><em><strong>Retour</strong></em></a></p>";
  52. print "</body></html>\n";
  53. last;
  54. }
  55. #de même si le hostname du routeur correspond
  56. elsif ($hostform eq $hostname)
  57. {
  58. my $fichierver="/tftpboot/speedstream/$hostname/VERSION.TXT";
  59. my $time = (stat $fichierver)[9];
  60. open(VERSION,$fichierver);
  61. @version = <VERSION>;
  62. close(VERSION);
  63. open(COPY,"/tftpboot/speedstream/$hostname/COPY.TXT" );
  64. @conf = <COPY>;
  65. close(COPY);
  66. print "Content-type: text/html\n\n";
  67. print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">', "\n";
  68. print "<html><head><title>Configuration</title></head>\n";
  69. print "<body><h1>Resultat de la recherche :</h1>\n";
  70. print "<p><b>Hostname :</b> $formulaire{hostname}</p>";
  71. print "<p><b>Adresse IP :</b> $ipr</p>";
  72. print "<b>Version :</b><pre> @version</pre>";
  73. print "\n <b>Syntaxe pour rÈcupÈrer la conf :\n</b><pre> @conf</pre>";
  74. print "<b>Date de la derniere modification : </b>";
  75. print strftime '%a %d %b %Y @ %I:%M %p', localtime $time;
  76. print "<p><a href=\"/index.html\"><em><strong>Retour</strong></em></a></p>";
  77. print "</body></html>\n";
  78. last;
  79. }
  80. #sinon en attendant on envoi un lien retour
  81. print "Content-type: text/html\n\n";
  82. print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">', "\n";
  83. print "<html><head><title>Configuration</title></head>\n";
  84. print "<p><a href=\"/index.html\"><em><strong>Retour</strong></em></a></p>";
  85. print "</html>\n";
  86. }


 
 
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 : http://img480.imageshack.us/img480/9420/screenshot26hd.th.png   Et si rien ne correspond ceci : http://img69.imageshack.us/img69/483/screenshot4if.th.png
 
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  :hello:


Message édité par Supermagnus le 28-05-2006 à 18:12:05
Reply

Marsh Posté le 27-05-2006 à 22:08:16   

Reply

Marsh Posté le 28-05-2006 à 18:11:32    

Reply

Marsh Posté le 29-05-2006 à 13:40:55    


 
j'ai pas tout lu mais...
 
Pour récupérer les arguments, tu serais pas mieux avec ca?
 

Code :
  1. use strict;
  2. use CGI;
  3. use POSIX;
  4. my $base_router_file = 'base.routeur.txt';
  5. my $cnt;
  6. $cnt .= "Content-type: text/html\n\n";
  7. $cnt .= '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">';
  8. $cnt .= '<html><head><title>Configuration</title></head>';
  9. $cnt .= '<body><h1>Resultat de la recherche :</h1>';
  10. $cnt .= '<p><b>Hostname :</b>__HOSTNAME__</p>';
  11. $cnt .= '<p><b>Adresse IP :</b>__IPR__</p>';
  12. $cnt .= '<b>Version :</b><pre>__VERSION__</pre>';
  13. $cnt .= '<b>Syntaxe pour récupérer la conf :</b><pre>__CONF__</pre>';
  14. $cnt .= '<b>Date de la derniere modification :</b>__TIME__';
  15. $cnt .= '<p><a href="/index.html"><em><strong>Retour</strong></em></a></p>';
  16. $cnt .= '</body></html>';
  17. open (BASE, '< ' . $base_router_file)
  18. while (my $line = <BASE> ) {
  19.   chomp($line);
  20.   my ($ipr, $hostname) = split(/ /, $line);
  21.   if ($ipr eq $q->param('adresse') || $hostname eq $q->param('hostname')) {
  22.     #my $ctime = (stat($fichierver))[9];
  23.     #open(VERSION, '< ' . $fichierver);
  24.     #my @version = <VERSION>;
  25.     #close(VERSION);
  26.     #open(COPY,'< /tftpboot/speedstream/' . $hostname . '/COPY.TXT');
  27.     #my @conf = <COPY>;
  28.     #close(COPY);
  29.     #$cnt =~ s/__TIME__/$time/;
  30.     #$cnt =~ s/__VERSION__//;
  31.     #$cnt =~ s/__HOSTNAME__//;
  32.     #$cnht =~ s/__IPR__//;
  33.   }
  34. }
  35. close(BASE);


---------------
http://www.boincstats.com/signature/user_664861.gif
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed