IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

[langage] sortir une procédure


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 34
    Points : 18
    Points
    18
    Par défaut [langage] sortir une procédure
    Bonjour tout le monde,

    voila mon pb. Je dois générer des scripts perl qui me font une mini surveillance des serveurs. Ces scripts stockent leurs résultats dans un fichier texte. Ce fichier devant partir par mail afin que l'ensemble de l'équipe d'admin puisse le consulter.

    J'ai donc pensé écrir ma procédure dans un autre fichier que j'appellerais depuis l'ensemble de mes scrpts de supervision.

    Peut-on le faire car pour le moment je n'ai rien trouvé dessus. Tout ce que j'ai trouvé, ceux sont des docs sur des procédures (ou fonctions) mais au sein d'un même fichier.

    Pouvez-vous me dire en quelque ligne de code exemple comment m'y prendre.


    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 46
    Points : 46
    Points
    46
    Par défaut
    soit tu developpe ta procedure en script shell et tu fais un "system" dans ton script perl, soit tu passe par la creation d une tache fille(pas super fiable sous windows).

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    merci

    si je comprends bien il n'est pas possible de stocker le programme pricipal dans un fichier qui irait chercher ses procédures et ses fonctions dans un autre fichier.

    Désolé, si je ne suis pas trés clair mais je suis pas encore bien familliarisé avec la terminaulogie des dévellopeurs.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 46
    Points : 46
    Points
    46
    Par défaut
    si c est possible , comme avec hassan ceiheif ( un brun d humour ne fait jamais de mal)

    tes fichiers procedure tu veux le programmer en quel language ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    En fait, tout serait en perl, le fichier principal et ceux contenant mes procédures ou functions;

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 46
    Points : 46
    Points
    46
    Par défaut
    alors voila comment tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #dans ton programme
    	$pid = fork();
     
    	if ($pidfils)
    	{
    		print ("je suis le pere = $pid");
    		wait;
    	}
    	else
    	{
    		print ("je suis le fils = $pid");
    		system ("$scrdir\\procedure.pl");
    		exit(0);
    	}
    voila et procedure.pl est le nom de ta procedure. mais renseigne toi un peu quand meme sur la creation de tache. si tu est sous unix pas de probleme mais utilise exec a la place de system et si tu est sous windows ben prie pour que ca plante pas (si tu le fais pas deja).

  7. #7
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Pourquoi ca devrait planter sous windows ? exec et system marche bien. Sinon utilise win32::process.

    En fait je comprend pas trop la question initiale Reexpliquez moi s'il vous plait
    MacOS 10.5 / Ubuntu / C / Python / R
    Pensez au tag résolu

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 46
    Points : 46
    Points
    46
    Par défaut
    il me semble que windows a du mal avec les fork en perl. enfin c est l experience que j ai eu avec un script qui tournait en boucle, tous les deux jours plantage et d apres ce que j ai pu lire ca vien du multi tache.

    sinon je crois qu il veux faire un script principale et des scripts secondaire dans un fichier different. un peu comme quand tu fais appelle a une subroutine

  9. #9
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Ca complique les choses, il veut juste envoyer un fichier par mail à une liste ... Non ?

    Pour les forks, c'est vrai que ca vaut pas Unix, mais bon les outils pour win existent et fonctionnent (pas de troll sur la qualité de l'OS )

    ++
    MacOS 10.5 / Ubuntu / C / Python / R
    Pensez au tag résolu

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 46
    Points : 46
    Points
    46
    Par défaut
    je pense mais j ai pas bien compris le probleme de ce cote la j ai juste compris ce qu il explique plus haut et trop content de pouvoir enfin proposer une solution j ai repondu peu etre trop vite

    (windows est tres bien) ... (pour le traitement de texte )

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    Messieur merci

    je vais tenté d'être plus simple en vous donnant l'exemple sur lequel je travail.

    Voici le programme principal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    use strict;
    use Win32::EventLog;
     
    #Déclaration de l'ensemble des variables globales du programme
    our ($rep,$server,$Log,$id,$evt);
    # Déclaration des listes locales
    my @servers;
    # Déclaration de variables locales
    my $parammachines;
    # Initialisation des différentes variables
    $rep = "c:\\tools";
    $parammachines = "$rep\\param\\machines.txt";
     
    # Les lignes suivantes crées l'arborescence si elle n'existe pas
     
    mkdir "$rep\\param",0777 unless -d "$rep\\param";
    mkdir "$rep\\Extract",0777 unless -d "$rep\\Extract";
     
    # Si le fichier servers.txt contenant la liste des serveurs à traiter n'existe pas,
    # on le crée et on y insere le nom du serveur sur lequel on execute ce script
    # le traitement se fera pour la machine locale
    # --------------------------------------------------------------------------------
     
    my $servername = shift || Win32::NodeName;
     
    if ( ! -f $parammachines )
    {
    	open ( IN, ">$parammachines" ) || die "Impossible d'ouvrir $parammachines : $!\n" ;
    	print IN "$servername\n" ;
    	close (IN) ;
    }
     
    #ouvre le fichier contenant les noms de machine
    open(INFILE, "$parammachines") or die "Impossible d'ouvrir machines.txt en écriture : $!";
     
    # insere le contenu du fichier dans une liste
    @servers = <INFILE>;
    # ferme le fichier
    close (INFILE);
    # supprime le carractére de fin de ligne
    chomp (@servers);
     
    # Pour chaque ligne de la liste, on affecte la valeur de la ligne à la variable $machine
    foreach $server (@servers)
    {
       # on réalise une boucle pour qu'a chaque machine il vérifie les trois journaux
       for $Log ("Application", "System", "Security")
       {
          #on appele la procedure GetEvents
          \&GetEvents();
       }
    }
     
    close INFILE;
    Et voici la prcédure GetEvents()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    sub GetEvents
    {
       # declare l'ensemble des variables locales
       my ($total,$oldest,$evtHashRef,
           $numeroenregistrement,$source,$computer,$categorie,
           $eventtype,$heuregeneration,$heureecriture,$resultat,$evtoutputfile,
           $servermail, $vers,$depuis,$sujet,$start,$cmd,$test,$test1,$file,$sec,$min,$hour,$mday,
           $mon,$year,$wday,$yday,$isdst);
     
       # initialisation des variables
       $start = 1;
       $test = 0;
     
       # récupére les différentes parties de la date et heure local et les affectent
       # dans des variables
       ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
       $year += 1900;
       $mon++;
       $mday=sprintf("%02d",$mday);
       $mon=sprintf("%02d",$mon);
       $hour=sprintf("%02d",$hour);
       $min=sprintf("%02d",$min);
       $sec=sprintf("%02d",$sec);
     
       # création d'une variable contenant une réference au journal de la machine
       $evt = Win32::EventLog->new("$Log","\\\\$server") || die "Could not open $Log log on $server: $!\n";
       # calcul le nombre total d'evenement du journal est affecte le résultat dans $total
       $evt->GetNumber($total) || die "Can't get number of EventLog records: $!\n";
     
       # Si le journal est vide, on donne 1 comme valeur à test.
       if ($total == 0)
       {
          $test = 1;
       }
     
       # Si test = 1 on ne passe pas dans la boucle et on envoie pas de mail
       if ($test == 0)
       {
     
          # génére le fichier de sortie
          $evtoutputfile = "$rep\\Extract\\$server-$Log-$mday$mon$year-$hour h $min min $sec s.txt";
          #ouvre le fichier de destination de l'inventaire en écriture
          open ( EVTOUTPUT, ">$evtoutputfile" ) || die "Impossible de creer $evtoutputfile : $!\n";
     
          # tant qu'on est pas à la fin du journal d'event
          while ($start < $total)
          {
             # indique que l'on lit le journal dans l'ordre croissant en commençant
             # par l'enregistrement 1. On affecte ce qui est lu dans la variable
             # $evtHashRef
             $evt->Read(EVENTLOG_FORWARDS_READ|EVENTLOG_SEEK_READ,$start,$evtHashRef)
          			   or die "Can't read EventLog entry on $server\n";
     
             # format l'eventID afin qu'il soit lisible et le stocke dans une
             # variable id
     
             $id = (${$evtHashRef}{EventID} & 0xffff);
     
             # On exécute la fonction searchEvent afin de vérifier que le numéro
             # d'événement a besoin d'être remonté
             # Le résultat de cette fonction est stocké dans $resultat
             $resultat = searchEvents();
     
             if ($resultat == 1)
             {
                # On récupere dans des variables separées les valeurs de
                # l'enregistrement du journal
                $numeroenregistrement = ${$evtHashRef}{RecordNumber};
                $source = ${$evtHashRef}{Source};
                $computer = ${$evtHashRef}{Computer};
                $categorie = ${$evtHashRef}{Category};
                $eventtype = ${$evtHashRef}{EventType};
                $heuregeneration = localtime(${$evtHashRef}{TimeGenerated});
                $heureecriture = localtime(${$evtHashRef}{Timewritten});
     
    	         # on réalise l'affichage des variables
                print EVTOUTPUT "-" x 75 . "\n";
                print EVTOUTPUT "Nom de journal: $Log\n";
                print EVTOUTPUT "Numero d'enregistrement: $numeroenregistrement \n";
                print EVTOUTPUT "Source de l'event: $source\n";
      	         print EVTOUTPUT "Nom de l'ordinateur: $computer\n";
      	         print EVTOUTPUT "Categorie: $categorie\n";
      	         print EVTOUTPUT "Event ID:       $id\n";
     	         print EVTOUTPUT "Type d'evenement: $eventtype\n";
      	         print EVTOUTPUT "Heure de generation: $heuregeneration\n";
      	         print EVTOUTPUT "Heure d'ecriture: $heureecriture\n";
     
                # formatage de l'utilisateur
      	         my $sid = unpack("H" . 2 * length(${$evtHashRef}{User}), ${$evtHashRef}{User});
      	         print EVTOUTPUT "Utilisateur:           ".$sid."\n";
     
      	         Win32::EventLog::GetMessageText($evtHashRef);
      	         my $msg = $evtHashRef->{Message};
     	         print EVTOUTPUT "Description: $msg\n";
      	         print EVTOUTPUT "\n\n";
             }
             $start++;
          }
          close (EVTOUTPUT);
       }
       $file = 0;
       open ( OUT, "$evtoutputfile" ) || die $file = 1 ;
       read(OUT,$test1,10);
    	close (OUT);
       if ($test1 != "" && $file == 0)
       {
          # Envoi du resultat par mail
          $servermail = 'toe45060.cst.cnes.fr';
          $vers = 'beaujaua@toe45060.cst.cnes.fr';
          $depuis = "Administrateur";
          $sujet = "Extraction du journal des evenement";
          $cmd = $rep.'\postie -host:'.$servermail.' -port:smtp -to:'.$vers.' -from:'.$depuis.' -s:"Extraction des ERREURS du '.$mday.'/'.$mon.'/'.$year.' à '.$hour.':'.$min.':'.$sec.' " -file:"'.$evtoutputfile.'"';
          system ('postie -host:'.$servermail.' -port:smtp -to:'.$vers.' -from:'.$depuis.' -s:"Extraction des ERREURS du '.$mday.'/'.$mon.'/'.$year.' à '.$hour.':'.$min.':'.$sec.' " -file:"'.$evtoutputfile).'"';
       }
    }
    Je souhaiterais stocker cette procédure dans un autre fichier que celui qui contient le pricipal et ce afin de pouvoir la réutiliser lors de la création d'un nouveau programme.

    Voila est plus claire

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    Au passage,

    dans la procedure getevent (à la fin), je réalise un envoie de mail.

    J'aimerais que ce mail ne soit pas envoyé si le fichier OUT et vide ou s'il n'existe pas mais ce que j'ai écris ne semble pas fonctionner car il n'envoie plus aucun mail.

    A+

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 46
    Points : 46
    Points
    46
    Par défaut
    pour la creation du fichier de procedure tu fait un copier coller du contenu de sub GetEvents dans un fichier que tu nomme events.pl
    ensuite dans ton programme tu insere à la place de &GetEvents();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     $pid = fork(); 
     
       if ($pidfils) 
       { 
          wait; 
       } 
       else 
       { 
          system ("events.pl"); 
          exit(0); 
       }
    pour le second probleme fais un test sur l'existence du fichier avec ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if( -e "$evtoutputfile")
    quand tu ouvre ton fichier tu devrai pas plutot faire un truc come ca ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    open ( OUT,"<$evtoutputfile" )
    @test1 = <OUT>;
    close OUT;
    comme ca tu as tous dans un tableau et tu peu tester si ton tableau est plein ou vide.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 90
    Points : 96
    Points
    96
    Par défaut
    -e teste l'existence du fichier
    et -s te donne sa taille donc pas besoin d'ouvrir le fichier pour savoir si il est vide ou non
    -z doit aussi renvoyer un boolean sselon que la taille du ficheir est nulle ou pas

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    Merci,

    pour tes réponses. Pour ce qui est du test, voici comment je me suis débrouillé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $file = 0;
     
    open ( OUT, "$evtoutputfile" ) or $file = 1 ;
    read(OUT,$test1,10);
    close (OUT);
    if (($test1 ne "") and ($file eq 0))
    cela semble tré bien fonctionner.


    En revanche, concernant l'autre question je te remercie de ta réponse. Néanmoins, si je veux faire passer des paramètres à ma procédure ou ma fonction comment je dois faire????

    De plus, si j'ai un fichier que j'appelle procedure dans lequel je stocke plusieurs procédures, comment faire pour en appeler une en particulier avec les bons parramètres.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 46
    Points : 46
    Points
    46
    Par défaut
    dans ce cas la je pense que cela ne justifie pas la creation de tache avec le passage de parametre. (je sais meme pas si ca se fait en perl)

    neamoins je pense que tu devrais faire une programmation oriente objet avec une classe contenant tes procedures et la tu ateind ma limite en programmation perl.j aurai pu t aider en c++ mais la qqun pourra surement te conseiller pour ca.

    ou alors tu garde tous dans un seul programme meme si c est lourd et pas facile a lire ca marchera tres bien. si tu as deja fait de l'objet je pense pas que ca te posera pas de difficultes de comprendre comment ca marche en perl alors regarde dans les tutos je pense que tu trouvera.

  17. #17
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Non,noon !! Perl permet évidemment la création de bibliothèques, comme en C ou en tout autre langage qui se respecte.... Ce que vous proposez est horrible là. Vous allez l'inciter à croire que Perl est un faux langage de programmation.
    Ces bibliothèques ne sont pas très compliquées à faire, on les appelle des modules, et on peut y écrire des fonctions, des constantes, etc... qu'on réutilisera dans autant de programme qu'on veut, juste en rajoutant une ligne dans le programme principal (c'est ce que vous faites en écrivant 'use bidule;') et on n'est pas obligé de programmer les modules en convention objet. Voir perlmod ou autres documentations afférentes.
    N'hésitez pas à poser des questions supplémentaires !

    --
    Jedaï

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 46
    Points : 46
    Points
    46
    Par défaut
    heuu... j'ai rien dit de tel, perl est un vrai language de programmation, je pense juste que c etait une facon de faire c est tout, comme je l ai dit je ne connais pas la programmation objet sous perl et "suggerais" une possibilitée.

    mais effectivement j ai une question, on peu quand meme faire des classes en perl ? et si oui est ce qu une classe et un objet ne suffirai pas dans ce cas de figure, plutot que la création d'une bibliothèque?

    (si mais question son hors sujet, désole j ai pas du comprendre )

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 34
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    je vous remercie pour ces infos. Je pense pouvoir me débrouiller avec.

    Si j'ai d'autre pb je ferais un autre post

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sortir une table avec proc report
    Par lynleroy dans le forum ODS et reporting
    Réponses: 0
    Dernier message: 18/02/2014, 16h13
  2. comment sortir d'une boucle qui dure trop?
    Par gaston11 dans le forum Débuter
    Réponses: 8
    Dernier message: 07/01/2013, 23h34
  3. Sortir d'une proc sans sortir du programme
    Par gyver4000 dans le forum Tcl/Tk
    Réponses: 2
    Dernier message: 28/03/2009, 11h20
  4. [langage] surement une expression régulière...
    Par armada dans le forum Langage
    Réponses: 5
    Dernier message: 30/05/2003, 17h06
  5. langage] Découper une chaine suivant un délimiteur
    Par totox17 dans le forum Langage
    Réponses: 2
    Dernier message: 25/11/2002, 16h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo