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

Programmation et administration système Perl Discussion :

Script de récupération d'informations


Sujet :

Programmation et administration système Perl

  1. #1
    Membre habitué Avatar de Maillon
    Inscrit en
    Juin 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 136
    Points : 136
    Points
    136
    Par défaut Script de récupération d'informations
    Bonjour à tous ^^

    Voilà je voudrai réaliser un script en perl qui se connecte à une machine distante et qui analyse l'espace disque utilisé par partition.

    Selon le résultat (genre si /home > 80%) alors on envoie un mail à l'admin "attention sur TELLE machine, la partition /home devient pleine".

    J'utilise filetraq mais c'est pas simple de lecture (trop d'info dans les mails envoyé par filetraq). Je sais qu'il y a aussi nagios qui existe mais je voudrais le faire en script.

    J'ai bien parcouru le forum et plus particulièrement cette section et j'y ai trouvé des choses intéressantes.

    Voilà à quoi ressemble le début du script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/perl -w
    use strict;
    use Net::SSH::Perl;
     
    my $host = "serveur";
    my $username = "mon_login";
    my $password = "mon_pass";
     
    my $ssh = Net::SSH::Perl->new($host);
    $ssh->login($username, $password);
     
    $ssh->cmd('mkdir /home/mon_login/bouyou');

    Alors ce script fonctionne il n'y a pas de souci. Par contre c'est la fin qui me manque sur le fait de récupérer l'espace disque utilisé et d'envoyer le mail.


    Merci de votre aide ^^ :-)
    Aide ton prochain car à sa place tu aimerai bien qu'on t'aide.
    _
    Previously On My Life ...
    _
    Administrateur Réseaux et Systèmes.
    _

  2. #2
    Membre habitué

    Profil pro
    Inscrit en
    Août 2005
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 118
    Points : 142
    Points
    142
    Par défaut
    Bonjour,
    $ssh->cmd retourne ($out, $err, $exit)
    $out est la sortie standard de la commande (STDOUT)
    $err est la sortie d'erreur (STDERR)
    et $exit l'état de sortie (en général 0 pour une sortie sans erreur) -> voire la page de manuel de la commande concernée.

    Pour connaître l'état des disques sous unix c'est la commande du (souvent du -h )

    Pour envoyer des mails, tu as Mail::Sender et sans doute beaucoup d'autres modules.

    Avec ça, ça devrais aller.
    A+
    Joris

  3. #3
    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
    Et bien tu récupères la sortie de la commande "du" et tu la parses, puis tu envoies un mail s'il y a problème. Pour envoyer un mail, tu peux te contenter d'utiliser Net::SMTP (dans le CORE depuis Perl5.7.3) si tu n'as pas besoin d'envoyer des mails compliqués, mais un simple avertissement en texte.

    --
    Jedaï

  4. #4
    Membre habitué Avatar de Maillon
    Inscrit en
    Juin 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 136
    Points : 136
    Points
    136
    Par défaut
    Pour savoir l'espace disque utilisé j'utilise la commande df -h en fait qui me donne un pourcentage donc je ne sais pas si ça marchera avec ça ...

    Citation Envoyé par Jedai
    Et bien tu récupères la sortie de la commande "du" et tu la parses
    --
    Jedaï
    Euh c'est ça le problème en fait ^^ commen tu fais pour récupérer la sortie d'une commande (celle de df -h par exemple) ? ^^
    Aide ton prochain car à sa place tu aimerai bien qu'on t'aide.
    _
    Previously On My Life ...
    _
    Administrateur Réseaux et Systèmes.
    _

  5. #5
    Membre habitué

    Profil pro
    Inscrit en
    Août 2005
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 118
    Points : 142
    Points
    142
    Par défaut
    Euh c'est ça le problème en fait ^^ commen tu fais pour récupérer la sortie d'une commande (celle de df -h par exemple) ? ^^
    Dans $out

    Joris

  6. #6
    Membre habitué Avatar de Maillon
    Inscrit en
    Juin 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 136
    Points : 136
    Points
    136
    Par défaut
    Alors j'ai un peu avancé ^^

    Voilà ce que j'ai pour le moment dans mon script info.pl :
    --------------------------------------------
    #!/usr/bin/perl -w
    use strict;
    use Net::SSH::Perl;

    my $host = "cerbere";
    my $username = "mon_login";
    my $password = "mon_pass";

    my $ssh = Net::SSH::Perl->new($host);
    $ssh->login($username, $password);

    $ssh->cmd('sh /home/mon_login/message.sh');
    --------------------------------------------

    Et dans le message.sh :
    --------------------------------------------
    #!/bin/sh

    email="maillon@domaine.net"
    message=/home/mon_login/script/recap.$$
    limit="80"

    df -h | tr "%" " " | awk '{ if ( $5 > $limit ) print $6" est utilisé a "$5"%. Il reste "$4" sur "$2" disponibles pour "$1"\n" } ' > $message

    serveur=/bin/hostname

    if [ $5 > $limit ]
    then
    mail -s "Alerte sur le serveur "$serveur" sur la partition "$6"." $email

    fi
    -------------------------------------------------

    Sachant que j'ai bien copié le script message.sh sur toute les machines.

    Alors pour l'instant j'ai deux souci : le premier c'est que le mail n'est pas envoyé. Pourtant je peux envoyé des mails par telnet. (peut-être qu'il faut que je rajoute le module Net::SMTP comme le suggère jedai ...)



    Le souci majeur varie en fonction des serveurs sur lequel le script message.sh est exécuté, je m'explique.

    Quand je lance la commande df -h j'obtiens ça :
    ---------------------------------------------------
    SysFichier Tail. Util.Disp. Uti% Monté sur
    /dev/sda8 2.0G 394M 1.5G 21% /
    /dev/sda3 190M 11M 170M 6% /boot
    none 1004M 0 1004M 0% /dev/shm
    /dev/sda7 1012M 33M 928M 4% /tmp
    /dev/sda5 9.7G 2.5G 6.7G 28% /usr
    /dev/sda9 9.7G 546M 8.6G 6% /var
    /dev/sda10 40G 49M 38G 1% /data
    /dev/sda2 3.2G 37M 3.0G 2% /home
    ----------------------------------------------------

    Sur le serveur cerbere (red hat 3) le script message.sh me génère un fichier dans lequel il y a :
    --------------------------------------------------
    / est utilisé a 21%. Il reste 1.5G sur 2.0G disponibles pour /dev/sda8

    /boot est utilisé a 6%. Il reste 170M sur 190M disponibles pour /dev/sda3

    /tmp est utilisé a 4%. Il reste 928M sur 1012M disponibles pour /dev/sda7

    /usr est utilisé a 28%. Il reste 6.7G sur 9.7G disponibles pour /dev/sda5

    /var est utilisé a 6%. Il reste 8.6G sur 9.7G disponibles pour /dev/sda9

    /data est utilisé a 1%. Il reste 38G sur 40G disponibles pour /dev/sda10

    /home est utilisé a 2%. Il reste 3.0G sur 3.2G disponibles pour /dev/sda2
    ---------------------------------------------------

    Donc ça marche là ^^

    Par contre sur l'autre serveur zeus (red hat 4), le df -h me génère ça :
    ----------------------------------------------------
    Sys. de fich. Tail. Occ. Disp. %Occ. Monté sur
    /dev/mapper/VolGroup_ID_21242-LogVol1
    1008M 506M 452M 53% /
    /dev/sda3 99M 17M 78M 18% /boot
    none 972M 0 972M 0% /dev/shm
    /dev/mapper/VolGroup_ID_21242-LogVol2
    496M 11M 460M 3% /tmp
    /dev/mapper/VolGroup_ID_21242-LogVol5
    9,9G 3,0G 6,6G 32% /usr
    /dev/mapper/VolGroup_ID_21242-LogVol4
    3,1G 195M 2,7G 7% /var
    /dev/mapper/VolGroup_ID_21242-LogVolHome
    131G 3,4G 121G 3% /home
    ------------------------------------------------------

    Et le script message.sh me génère ça :
    --------------------------------------------------------
    est utilisé a /%. Il reste 53 sur 506M disponibles pour 1008M

    /boot est utilisé a 18%. Il reste 78M sur 99M disponibles pour /dev/sda3

    est utilisé a /tmp%. Il reste 3 sur 11M disponibles pour 496M

    est utilisé a /usr%. Il reste 32 sur 3,0G disponibles pour 9,9G

    est utilisé a /var%. Il reste 7 sur 195M disponibles pour 3,1G

    est utilisé a /home%. Il reste 3 sur 3,4G disponibles pour 131G
    ----------------------------------------------------------

    Il y a un léger petit souci là ...
    Aide ton prochain car à sa place tu aimerai bien qu'on t'aide.
    _
    Previously On My Life ...
    _
    Administrateur Réseaux et Systèmes.
    _

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    Août 2005
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 118
    Points : 142
    Points
    142
    Par défaut
    Pourquoi ne fais-tu pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my ($out, $err, $exit) = $ssh->cmd("df -h");
    Ensuite tu peux travailler sur $out directement.
    Par exemple tu peux extraire les lignes qui contiennent 8\d%

    Après, il suffit d'envoyer un mail avec les lignes en cause, le nom du serveur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    my ($out, $err, $exit) = $ssh->cmd("df -h");
    my @trop plein;
    foreach my $line (split "/n",$out){
       push @trop_plein, $line if($line =~ /8\d%/);
    }
    Pas testé

    Joris

    Edit : plutôt quelque chose du genre

  8. #8
    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
    Citation Envoyé par d-jo
    Edit : plutôt quelque chose du genre
    Personnellement je préfère faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m/(\d{1,3})%/ and $1 >= 80
    Néanmoins je suis complètement d'accord avec d-jo : ça sera à la fois plus robuste et plus efficient de tout faire en Perl, de l'interrogation de la machine distante à l'envoi du mail.

    --
    Jedaï

  9. #9
    Membre habitué Avatar de Maillon
    Inscrit en
    Juin 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 136
    Points : 136
    Points
    136
    Par défaut
    Citation Envoyé par d-jo
    Pourquoi ne fais-tu pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my ($out, $err, $exit) = $ssh->cmd("df -h");
    Ensuite tu peux travailler sur $out directement.
    Par exemple tu peux extraire les lignes qui contiennent 8\d%

    Après, il suffit d'envoyer un mail avec les lignes en cause, le nom du serveur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    my ($out, $err, $exit) = $ssh->cmd("df -h");
    my @trop plein;
    foreach my $line (split "/n",$out){
       push @trop_plein, $line if($line =~ /8\d%/);
    }

    Donc en gros $ssh->cmd('df -h'); et ça my ($out, $err, $exit) = $ssh->cmd("df -h"); c'est pareil ? ^^


    Euh 8\d% c'est quoi ce truc lol ^^

    Citation Envoyé par jedai
    m/(\d?\d)%/ and $1 >= 80
    Et ça fait quoi ça au juste ? xD lol

    Et ui vous avez raison je vais m'orientez vers un script tout perl ... encore faut-il que j'ai un script qui marche ^^ xD


    Mais merci pour la suite je vais me baser dessus pour essayer de trouver une solution ;-) ^^
    Aide ton prochain car à sa place tu aimerai bien qu'on t'aide.
    _
    Previously On My Life ...
    _
    Administrateur Réseaux et Systèmes.
    _

  10. #10
    Membre habitué

    Profil pro
    Inscrit en
    Août 2005
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 118
    Points : 142
    Points
    142
    Par défaut
    Donc en gros $ssh->cmd('df -h'); et ça my ($out, $err, $exit) = $ssh->cmd("df -h"); c'est pareil ? ^^
    Oui
    Sauf que dans un cas tu récupère les valeurs de retour (la sortie standard, la sortie d'erreur et la valeur de retour, dans l'autre non.

    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my ($out, $err, $exit) = $ssh->cmd("df -h");
    print $out;
    pour t'en convaincre.

    Euh 8\d% c'est quoi ce truc lol ^^
    C'est une expression régulière qui repère
    8 -> un huit
    \d -> n'importe quel chiffre
    % -> %

    Donc renvoie vrai si la chaîne comporte 80% ou 81% ou 85% ...

    La dessus j'ai propposé :
    C'est à dire répérer s'il y a un huit ou un neuf suivie de n'importe quel chiffre et du signe % ou 100% dans ta chaîne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m/(\d?\d)%/ and $1 >= 80
    cela signifie que la chaîne doit comporter deux chiffres suivie de % et que ces deux chiffres forment un nombre supérieur ou égal à 80.

    C'est plus élégant bien que ça utilise la mémorisation et deux évaluations de plus

    En effet la vrai condition (>= 80%) est arithmétique. Elle est donc traitée arithmétiquement.

    Mais ça c'est une autre histoire

  11. #11
    Membre habitué Avatar de Maillon
    Inscrit en
    Juin 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 136
    Points : 136
    Points
    136
    Par défaut
    Citation Envoyé par d-jo
    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my ($out, $err, $exit) = $ssh->cmd("df -h");
    print $out;
    pour t'en convaincre.
    J'ai essayé et je comprends mieux ce que ça fait ! :-) En fait je comprenais pas comment en lancant une commande à distance sur une autre machine, le résultat pouvais nous revenir sur l'écran d'où on a lancé la commande mais maintenant c'est bon : $out ^^ hihii

    Pour récupérer les info du $out je pensais à utiliser un truc de ce genre :
    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
     
    # dans la variable list je met le $out
    my @list = $out;
    # j'affiche la 5eme colonne
    print $list[4] ;
    # je parcours list
    foreach $list {
    # je décompose la list en élements
       push @element, $list 
    # si @element est supérieur à 80% ou plus
       if (@element > /8\d%\100%/) {
    # j'utilise MIME::Lite pour envoyer mon mail
    my $mail = MIME::Lite->new (
                                    From=>'root@domaine.net',
                                    Cc=>undefined,
                                    To=>'admin@domaine.net',
                                    Subject=>"Une partition devient trop importante",
                                    Data=>undefined );
    # envoie du mail
    $mail->send();
                                       }
    }
    Je l'ai pas tester encore ...

    Alors je sais je suis une buse en prog mais ça pourrais ressembler à ça ? ^^ (m'as fallu 30 min pour faire ça ... xD ^^)
    Aide ton prochain car à sa place tu aimerai bien qu'on t'aide.
    _
    Previously On My Life ...
    _
    Administrateur Réseaux et Systèmes.
    _

  12. #12
    Membre habitué Avatar de Maillon
    Inscrit en
    Juin 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 136
    Points : 136
    Points
    136
    Par défaut
    Alors j'ai trouvé une solution finalement en shell ^^ Certes il n'y a pas de connection ssh mais bon je lance le script via crontab et c'est pareil ^^
    L'aide sur perl que vous m'avez donné m'a de toute façon servi ^^

    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
     
    #!/bin/bash
     
    email="maillon@domaine.net"
    message="/home/maillon/script/recap.$$"
    limit="20"
     
    df -h |\
    sed -e '/^\/dev\/mapper/ s/$/#/' -e :a -e '/#$/N ;s/#\n/ /; ta' -e '1d' |\
    tr "%" " " | awk -v limit=$limit '{ if ( $5 > limit ) print $6" est utilise a "$5"%. Il reste "$4" sur "$2" disponibles pour "$1"\n" } ' > $message
     
    serveur=$(/bin/hostname)
     
    if [ -s "$message" ]
    then
            cat "$message" | mail "$email" -s "Alerte disque $serveur. Partition(s) plus de 20% d'utilisation"
    fi
    rm recap.*
    Voilà ça ça marche c'est sûr ! lol :-)

    Merci à tous pour votre aide. Je vais essayer de faire l'équivalent en perl mais pour moi pour savoir ^^

    Mici à tous ^^ hihihi
    Aide ton prochain car à sa place tu aimerai bien qu'on t'aide.
    _
    Previously On My Life ...
    _
    Administrateur Réseaux et Systèmes.
    _

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

Discussions similaires

  1. script telnet récupération d'informations
    Par Waldner11 dans le forum VBScript
    Réponses: 3
    Dernier message: 22/06/2009, 17h14
  2. Réponses: 5
    Dernier message: 03/02/2006, 13h47
  3. Récupération des informations memoire
    Par xxiemeciel dans le forum Windows
    Réponses: 2
    Dernier message: 12/08/2005, 16h43
  4. Réponses: 9
    Dernier message: 17/08/2004, 16h16
  5. Réponses: 6
    Dernier message: 28/04/2004, 10h41

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