Script Perl - Informations

Résolu
Bonjour à tous,

Quelqu'un aurait il l'amabilité de m'aider à commencer le programme suivant s'il vous plaît ?

Le problème étant que j'ai vraiment du mal à comprendre la syntaxe du perl.

Je connais l'utilité du programme : Il permet de lire dans un fichier log (syslog) les données sur chaque ligne et de check les access-list . Je lance mon fichier : fichier.pl > accesslist.xls et je redirige les données vers un fichier excel.

Ce qui est déjà commenté, c'est ce qui est intuitif, les autres lignes je ne comprends, j'ai vraiment besoin d'aide s'il vous plaît ...

#
$acl_name="MK1";
# Nom du fichier Syslog à examiner
$stuff="fichierSyslog.txt";
#
# Seuil : nombre de paquets minimum pour ajouter la conversation dans le rapport
$seuil=0;
$nc=0;
$conversation="";
open stuff, $stuff;
while (<stuff>) {
# On filtre le fichier d'entrée en ne traitant que les lignes comprenant la chaine de caractères entre // ci-dessous
if (/list 124/) {
s/^.*permitted//;
# print "\nLigne1 $_";
# good s/\([0-9\/]*\)//g;
# s/(\([0-9\/]*\))(.*?)(\([0-9\/]*\))/ PS\1 \2 PR\3/g;
s/ ->//g;
# print "\nLigne2 $_";
s/,//g;
s/\(0\/0\)//g;
# print "\nLigne3 $_";
s/([a-z]+).*?([\.\(\)0-9]+).*?([\.\(\)0-9]+).*?([0-9]+)/\1 \2 \3 \4/;
# print "\nLigne4 $_";
# s/(10\.22\.207)/toto/;
$conversation="$1 $2 $3";
$packet=$4;
# print "Conversation : |$conversation| $packet paquets\n";
$exist=0;
$I=0;
foreach $conv (@conv_tab) {
# print "Conv : $conv \n";
if ($conv eq $conversation) {
# print "Conv existante ($conv , $conversation )\n";
$exist=1;
$pkt_tab[$I]+=$packet;
# print " $pkt_tab[$I] \n";
last;
}
$I++;
}
if (!$exist) {
# print "Conv non existante\n";
push(@conv_tab,$conversation);
push(@pkt_tab,$packet);
# print @conv_tab;
# print "\n";
}

}
}
print "Tableau conversations \n";
$I=0;
foreach (@conv_tab) {
if ($pkt_tab[$I] > $seuil) {
print "$pkt_tab[$I] $conv_tab[$I]\n";
}
$I++;
}

pouvez vous m'aider s'il vous plait à commenter ce petit bout de code,

amicalement,

dimitri

23 réponses

  1. thanks you very much my friend :)

    i've now understand a little perl language.

    it's hard .. but with you i'll upgrade my personal skill .

    Thanks a lot :)
    1. Modérateur
      Re,
      # à ne pas oublié qu'on est toujours dans la boucle while
      
      # pour chaque élément du tableau @conv_tab
      foreach $conv (@conv_tab) {
      # print "Conv : $conv \n";
        if ($conv eq $conversation) { # si la variable $conv est égale avec $conversation
      # print "Conv existante ($conv , $conversation )\n";
        $exist=1;              # initialise la variable $exist
        $pkt_tab[$I]+=$packet; # équivalent avec $pkt_tab[$I] = $pkt_tab[$I] + $packet
                               # donc tu remplis le tableau @pkt_tab
      # print " $pkt_tab[$I] \n";
                      last; # sortir de la boucle
              }
              $I++; # $I est incrementé
      }
      if (!$exist) { # on test la valeur de vérité de $existe
                     # ! c'est pour négation
      # print "Conv non existante\n";
              push(@conv_tab,$conversation); # on ajoute à @conf la variable $conversation
              push(@pkt_tab,$packet);        # on ajoute à @pkt_tab,$packet
      # print @conv_tab;
      # print "\n";
      }
      
      }
      }
      print "Tableau conversations \n";
      $I=0;
      foreach (@conv_tab) {                # pour chaque élément de tableau @conv_tab
              if ($pkt_tab[$I] > $seuil) { # on teste les éléments de @pkt_tab avec $seuil
                      print "$pkt_tab[$I] $conv_tab[$I]\n"; # on affiche les éléments de @pkt_tab et @conv_tab
              }
              $I++; # incrémentatoin de $I
      }

      1. way
        1. Modérateur
          Hi,

          I don't speak english. Be patient. I'm at work.

          La suite ce soir.
          J'ai vu qu'il manque des choses dans ton programme
          Par exemple je vois
          foreach $conv (@conv_tab) { 
          mais je ne vois pas où le tableau @conf_tab est rempli.
      2. Modérateur
        Re,

        Voici une partie, mes commentaires sont en gras
        
        # ouverture de handle de fichier stuff
        # on utilise en général les majuscules
        # pour faire la différence entre une variable et un handle
        # ça donne
        # on utilise aussi un test d'ouverture de handle
        # open STUF, $stuff or die "E/S $stuff : $!\n";
        
        open stuff, $stuff;
        
        # ici on commence la lecture de handle
        # le handle c'est la connexion entre le programme et le fichier
        # la lecture se fait ligne par ligne
        
        while (<stuff>) {
        # On filtre le fichier d'entrée en ne traitant que les lignes comprenant la chaine de caractères entre // ci-dessous
                if (/list 124/) {
                        s/^.*permitted//;
        # print "\nLigne1 $_";
        # good s/\([0-9\/]*\)//g;
        # s/(\([0-9\/]*\))(.*?)(\([0-9\/]*\))/ PS\1 \2 PR\3/g;
                        s/ ->//g; # ici on supprime tout espace suivi d'un tiret suivi d'n signe plus grand
                                  # et ça sur tout la ligne
                                  # traitement effectuer sur chaque ligne
        # print "\nLigne2 $_";
          s/,//g;  # on supprime tous les virgules
          s/\(0\/0\)//g; # on supprime toute sous chaîne
                         # ( suivi de 0 suivi de / suivi de 0 suivi de )
                         # ce qui donne (0/0)
        # print "\nLigne3 $_";
          s/([a-z]+).*?([\.\(\)0-9]+).*?([\.\(\)0-9]+).*?([0-9]+)/\1 \2 \3 \4/;
          # la partie regex
          #=========================================================================
          # [a-z] - clase de caractères qui peut reconnaître un caractère de a à z
          # + - quantificateur qui veut dire une fois ou n'importe combien de fois
          # . - n'importe quel caractère
          # *? - quantificateur paresseux, qui veut dire 0 fois, une fois, ou tant
          # que tu peux jusqu'à 1ère caractère suivant le motif
          #
          # exemple pour comprendre
          #------------------------------------
          # $ echo je ne sais pas si tu sais le langage perl | perl -ne '/(.*sais)/;print "$1\n"'
          # je ne sais pas si tu sais
          # $ echo je ne sais pas si tu sais le langage perl | perl -ne '/(.*?sais)/;print "$1\n"'
          # je ne sais
          # -----------------------------------
          # fin exemple
          # [\.\(\)0-9]
          # classe de caractère qui peut reconnaître un point, une paranthèse ouvrante ou fermante
          # le chiffre de 0 à 9
          # + on l'a déjà vu
          # .*? on l'a déjà vu
          # [0-9] - classe de caractères qui reconnaît un chiffre de 0 à 9
          # =========================================================================
          # la partie remplacement
          # -----------------------------------------
          # les paranthèses dans les regex ont le rôle de capturer
          # leur numérotation se fait en commençant de la partie gauche
          # et c'est la paranthèse ouvrante qui est comptée
          # \1 c'est la capture numéro 1
          # \2 c'est la capture numéro 2
          # etc.
          #
          # Exemple
          #
          # $ perl -e '$var="123 azerty (100)";$var=~s/([0-9]+)\s*([a-z]+)\s*(\([0-9]+\))/\3 \2 \1/;print "$var\n";'
          # (100) azerty 123
          # mais je préfère $1, $2 et $3
          # $ perl -e '$var="123 azerty (100)";$var=~s/([0-9]+)\s*([a-z]+)\s*(\([0-9]+\))/$3 $2 $1/;print "$var\n";'
          # (100) azerty 123
        
        1. je l'ouvre avec excel oui car derrière j'ai fais quelques maccros pour rechercher les valeurs qui m'intéresse tout simplement .

          l'utilité du programme je la connais ... mais n'ayant aucune connaissance (linguistique) en perl, je demande de l'aide pour me commenter le coeur du programme pas ce qu'il fait .

          merci bcp !!
          1. Modérateur
            Salut,

            La panique totale je vois. Et depuis 09 juin tu n'as pas avancé d'un pas?!!!

            Je lance mon fichier : fichier.pl > accesslist.xls et je redirige les données vers un fichier excel.
            C'est ça que tu crois.
            En réalité, accesslist.xls ne sera qu'un fichier texte.
            Pour écrire dans un fichier excel directement depuis Perl tu as deux possibilités (peut être qu'il y a d'autres mais je n'ai pas chercher ;-)
            - un module, par exemple Spreadsheet::WriteExcel
            - écrire un fichier .csv (donc utiliser entre les champs un séparateur)
            • 1
            • 2