Script Perl et Batch pour récupération d'info

Fermé
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 - 12 juin 2007 à 11:33
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 14 juin 2007 à 11:45
Voilà,

bon le perl je connais pas pas des masse non plus donc bon ^^

J'aimerai faire un script perl qui interroge à distance un serveur et qui remonte des informations comme l'espace disque utilisé sur chaque partition (df -h).

Après le script ce chargerai d'envoyé un mail si la valeur retournée est supérieur à telle valeur par exemple.

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@commentcamarche.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.



Le deuxième 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à ...

Je continue de chercher mais si vous avez des idées ou solutions n'hésitez pas ^^

Merci de votre aide ;-)
A voir également:

18 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
12 juin 2007 à 19:05
Re-

Tiens chez moi en ayant "sendmail" d'installer, avec un simple script "bash" ça marche :
#!/bin/bash

email="jipicy@commentcamarche.com"
message="/home/jp/tmpfs/recap.$$"
limit="80"

df -h |\
sed -e '/^\/dev\/ide/ s/$/#/' -e :a -e '/#$/N ;s/#\n[ ][ ]*/ /; ta' -e '1d' |\
tr "%" " " | awk -v limit=$limit '{ if ( $5 > limit ) print $6" est utilisé 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..."
fi
En ce qui concerne la ligne "sed" (j'ai rajouté juste un ch'tit truc à la fin), mais voilà les explications :
sed -e '/^\/dev\/ide/ s/$/#/' -e :a -e '/#$/N ;s/#\n/ /; ta' -e '1d'


- "-e" : Option permettant d'enchaîner plusieurs commandes

- /.../ : Caractère délimiteur. On recherche le motif qui se trouve entre

- \ : Caractère d'échappement

- /^\/dev\/ide/ : Condition. Si la ligne commence (^) par le motif "/dev/ide/"

- s/$/#/ : On substitue la fin de ligne ($) par un dièse (#)

- -e :a : Boucle de branchement

- -e '/#$/N ; s/#\n/ /; ta' : Si la ligne s'achève par un dièse (#$), on ajoute la ligne suivante (N) dans le buffer (tampon) et on substitue le retour à la ligne (\n) par un espace "/ /" puis on fait un test de condition (t) pour la boucle. Si la ligne a été modifiée on se branche au début de la boucle "a".

- -e '1d' : On efface la 1ère ligne qui correspond à "Sys. de fich. Tail. Occ. Disp. %Occ. Monté sur"


Voilou. Adapte le script à ton cas (notamment le "/dev/ide" à transformer en "/dev/mapper", enfin sers-toi plutôt de la syntaxe que je t'ai mise au post #7.

;-))

PS. J'ai modifié la ligne de "awk" en rajoutant "awk -v limit=$limit" afin d'initialiser la variable pour qu'elle soit prise en compte par "awk".
1
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
12 juin 2007 à 11:47
Salut,

je suis au boulot et je ne peux pas tester, je vais voir de plus près chez moi ce soir

en revanche j'ai une question

pourquoi ne fait tu tout en shell ou tout en perl, l'histoire de messages .sh ?
Pour envoyer le mail on pourra utilisé un module perl par exemple.

Pour ton histoire d'affichage c'est normal

sur le 1er pc tu as sur une ligne
/dev/sda8 2.0G 394M 1.5G 21% /

sur le 2ème pc tu as sur 2 lignes l'affichag
/dev/mapper/VolGroup_ID_21242-LogVol1
1008M 506M 452M 53% /


au lieu de
/dev/mapper/VolGroup_ID_21242-LogVol1 1008M 506M 452M 53% /
à voir pourquoi?
0
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 5
12 juin 2007 à 11:52
Euh le pourquoi j'utilise du perl et du batch c'est que ... euh che pas en fait c'est le plus simple que j'ai trouvé mais maintenant si je peux faire tout en perl ou batch je dis ui ça sera plus simple ^^

Ui j'ai bien noté t'as remarque aussi mais je ne sais vraiment pas pourquoi. Peut être que le $1 est trop grand ...
Peut etre que si je supprime le début du $1 (c'est à dire /dev/mapper qui est récurrent) peut etre que ça marchera ... (en utilisant la commande tr je pense non ?)

Et pour le mail en fait peut etre que je devrai utilisé le module Net::SMTP ... non ? ^^
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
12 juin 2007 à 12:23
Pour les mails tu as aussi http://www.alianwebserver.com/informatique/languages/perl/mail.htm
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 5
12 juin 2007 à 13:20
Il est super ce lien ^^ merci :)

Par contre comme tu le disais le souci c'est que la moitié de mon prog est en batch (le script qui execute la commande df -h et qui me retourne l'information et qui envoie le mail) et l'autre en perl (le script qui permet de se connecter à la machine distante pour executer un script)

Et dans mon cas l'envoie de mail se fait en batch donc à moins de réecrire ce script en perl je vois pas comment je pourrais utiliser le module MIME::Lite .... xD

Et j'ai essayer de taper la commande suivante dans une console et elle marche (j'ai bien recu un mail) :
echo test | mail -s test adresse@domaine.com
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
12 juin 2007 à 13:38
Salut,




Et j'ai essayer de taper la commande suivante dans une console et elle marche (j'ai bien recu un mail) :
echo test | mail -s test adresse@domaine.com


ce n'est pas de bash ça, c'est du C

je vois pas comment je pourrais utiliser le module MIME::Lite .... xD
il faut juste installer le module
mais on ne vas pas compliquer
je vais essayer ce soir d'écrire un bout de code pour resoudre ton problème :-))
0
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 5
12 juin 2007 à 13:45
c'est du C ? .... xD ah la boulette lol pour dire que j'y connais vraiment rien en prog lol

J'ai installer le module MIME::Lite avec cpan mais c'est tout ^^

Oki bah je continu d'essayer des trucs de mon côté et dès que tu as quelques chose reviens vite :-)

merci en tout cas ;-)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
12 juin 2007 à 16:34
Salut,

Pour ton 2nd soucis, tu peux inclure cette instruction dans ta ligne de script :
sed -e '/^\/dev\/mapper/ s/$/#/' -e :a -e '/#$/N ;s/#\n/ /; ta'
Ce qui donnerait :
df -h |\
sed -e '/^\/dev\/mapper/ s/$/#/' -e :a -e '/#$/N ;s/#\n/ /; ta' |\
tr "%" " " |\
awk '{ if ( $5 > $limit ) print $6" est utilisé a "$5"%. Il reste "$4" sur "$2" disponibles pour "$1"\n" } ' > $message
La preuve en image :
[jp@MDK tmpfs]$ cat plop

Sys. de fich. Tail. Occ. Disp. %Occ. 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

/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

[jp@MDK tmpfs]$ sed -e '/^\/dev\/mapper/ s/$/#/' -e :a -e '/#$/N ;s/#\n/ /; ta' plop

Sys. de fich. Tail. Occ. Disp. %Occ. 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

/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

[jp@MDK tmpfs]$ 
;-))
0
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 5
12 juin 2007 à 16:52
Oué merci jipicy !! ça marche ça !! :D hihiihhi

Par contre euh ... j'ai rien compris à la commande ... xD lol

Et puis vu que je vais ne faire que un seul script en perl (c'est beaucoup plus pratique) est ce que cette commande marche en perl ?



Sinon j'ai rajouter ça dans mon script perl qui se connecte en ssh sur une autre machine

#!/usr/bin/perl -w
use strict;
use Net::SSH::Perl;

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

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

my ($out, $err, $exit) = $ssh->cmd("df -h");
print $out;

# 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%/) {
# 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();
}
}

Mais je pense qu'il y a des erreurs (voir peut etre que tout est faux lol mais bon vu que je suis une bête en perl ... xD lol) ^^
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
13 juin 2007 à 01:38
Salut,

récapitulons
donc tu veux interroger un serveur
pour ça depuis le client tu te connecte avec un script perl
qui va executé un script shell se trouvant sur le serveur
qui script shell execute la commande df -h et le résultat est enregistrer dans un fichier
et ensuite l'envoie de mail

Voilà ce que je te propose

Avec un seul script Perl se trouvant sur le client tu fait tout (donc plus besoin de script shell sur le server) -
connexion sur le serveur, la collecte des données et l'envoie de mail
Le script
#!/usr/bin/perl 
use strict;use warnings
use Net::SSH::Perl;
use MIME::Lite;

my $host     = "localhost";  # à modifier
my $username = "lami20j";    # à modifier
my $password = "**********"; # à modifier

my $df=q{df -h | perl -ne 'next unless /%\s/;
         @t=split /\s+/;
         print "$t[5] est utilisé à $t[4].
         Il reste $t[2] sur $t[1] disponible pour $t[0]\n"
         if $t[4] > 38'
        };

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

my ($out, $err, $exit) = $ssh->cmd("$df");

if($out){
    MIME::Lite->send('smtp','smtp.free.fr');
    my $msg = new MIME::Lite
    From    => 'lami20j@free.fr',
    To      => 'lami20j@yahoo.fr',
    Subject =>  "Espace disque - Consomation",
    Type    =>  'TEXT',
    Data    =>  $out;
    $msg->send();
    print "***** MESSAGE ENVOYE *****\n";
}
__END__
L'exécution
lami20j@deb:~$ perl ccm.pl
***** MESSAGE ENVOYE *****
Le résultat
https://www.cjoint.com/?gnbJJxFWSP

Bon, je pouvais collecter le résultat de la commande df -h et de parser la variable à l'intérieur de script.
Si besoin pour gagne de performance je peux le faire, à toi de me le dire.
Pareil our l'affichage, si tu veux afficher autrement il faut modifier ou me dire quoi modifier si tu crois que tu n'arrives pas.

Si tu ne veux pas utiliser MIME::Lite tu peux toujours utiliser la commande mail, pareil il faut le dire pour que je fasse les modifications.

En bref le script te perment de te connecter et de récupérer le résultat de la commande lancée sur le server et ensuite l'envoi de mail, tandis que ton raisonnement c'était de se connecter sur le server et de charger le script se trouvant sur le server de traiter tout (ce qui n'est pas mauvais non plus).

C'est bien quand il y a plusieurs solutions, tu pourras utiliser celle qui te convient :-))

Je vais aller me couché maintenant :-))
0
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 5
13 juin 2007 à 11:05
Alors merci à vous deux déjà de vous être penché sur mon cas ^^ C'est bien parce que j'ai d'un côté la méthode batch et l'autre perl ^^ hihii

Merci jipicy j'ai un peu mieux compris comment marchais la commande lol ^^ (je vais faire davantages de recherche sur la commande sed pour essayer de mieux comprendre ^^). En tout cas merci parce que ta méthode marche ^^
Par contre j'ai un trou de mémoire, je ne comprend pas à quoi sert le if dans le awk car même si $5 est inférieur à $limit bah j'afficherai le résultat complet de la commande df -h non ? enfin c'est ce que j'ai sur mon pc en tout cas ^^

Merci lami ! en plus j'ai presque tout compris au script ^^ héhé
Voici si ce que je comprend et ne comprend pas ^^

####### initialisation de variables qui vont nous permettre de se connecter en ssh #######
my $host = "localhost"; # à modifier
my $username = "lami20j"; # à modifier
my $password = "**********"; # à modifier

####### là je comprend pas le q{df -h | perl -ne 'next unless /%\s/; . A part le df -h ici j'ai rien compris du tout xD ^^#######
my $df=q{df -h | perl -ne 'next unless /%\s/;
####### ici je comprend pas comment le split peut récupérer le résultat du df -h. Par contre je crois qu'en suite on met dans la variable @t tous les éléments généré par le split Mais je ne comprend pas le /\s+/ ######
@t=split /\s+/;
print "$t[5] est utilisé à $t[4].
Il reste $t[2] sur $t[1] disponible pour $t[0]\n"
####### Euh il sert à quoi le if ici ... si $t[4] > 38 bah on fait quoi ?? ########
if $t[4] > 38'
};

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

my ($out, $err, $exit) = $ssh->cmd("$df");

####### Ici le if sert bien à vérifié qu'il y a quelque chose dans la sortie $out c'est ça ? et si c'est le cas bah on envoie un mail ? #########
if($out){
MIME::Lite->send('smtp','smtp.free.fr');
####### Par contre ici le my $msg = new MIME::Lite sert à quoi ? à dire qu'on va créer un nouveau message c'est ça ? Mais si c'est ça il ça serait pas plutot un truc du genre my $msg=MIME::Lite->new ( from ..... ) non ??? ##########
my $msg = new MIME::Lite
From => 'lami20j@free.fr',
To => 'lami20j@yahoo.fr',
Subject => "Espace disque - Consomation",
Type => 'TEXT',
Data => $out;
$msg->send();
print "***** MESSAGE ENVOYE *****\n";
}
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
13 juin 2007 à 11:27
Par contre j'ai un trou de mémoire, je ne comprend pas à quoi sert le if dans le awk
Le "if" est une condition qui vérifie si le "champ 5" ($5, autrement dit le pourcentage d'occupation de la partition) est supérieur à la variable "$limit" fixée en début de script et reprise dans la commande "awk" (-v limit=$limit), et si la condition est vérifiée alors on écrit tout ce qui se trouve après le "print" dans le fichier "$message".

;-))
0
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 5
13 juin 2007 à 11:31
Ui c'est bien ce que j'avais compris par contre si j'enleve le if ( $5 > $limit) de la commande bah j'ai des informations qui vont dans le fichier $message par contre c'est pas de bonnes informations. Essaye sur ta machine tu comprendra peut etre ce que j'essaye de dire lol ^^
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
13 juin 2007 à 11:38
Pas la peine d'essayer, à partir du moment où il n'y a pas de condition, il affiche toutes les lignes de la commande "df".
0
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 5 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
13 juin 2007 à 11:43
ah oki il affiche tout ^^
Mais justement normalement avec le if il ne devrait pas y avoir dans le fichier $message uniquement les lignes où le $5 est supérieur à $limit ? Pourquoi à ce moment là il affiche l'intégralité du if c'est ça que j'arrive pas à comprendre.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
13 juin 2007 à 11:46
Affiche ton script s'il te plaît.
0
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 5
13 juin 2007 à 11:55
OKI c'est bon j'ai pigé ! xD ^^ lol

En fait moi j'écrivais if ( $5 > $limit ) ce qui me paraissait logique. Mais effectivement toi tu a rajouter limit=$limit pour qu'il soit pris en compte dans le awk si j'ai bien compris ^^
Par contre je ne comprend pas pourquoi si je met $5 > $limit ça marche pas, pourquoi $limit pourtant déclaré au-dessus n'est pas pris en compte dans le awk.

Mais j'ai pigé ouf ^^ hiihihi
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
13 juin 2007 à 12:09
Pour qu'une variable externe à "awk" soit prise en compte il faut à ce moment là qu'elle soit en dehors des quotes, exemple :
awk '$5 > '$limit' { print $6 }'
;-)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
13 juin 2007 à 17:31
Salut,

####### là je comprend pas le q{df -h | perl -ne 'next unless /%\s/; . A part le df -h ici j'ai rien compris du tout xD ^^#######


next unless /%\s/ me permets de sauter la ligne d'entête
si tu fait un df -h tout simplement tu verras la ligne d'en-tête
Sys. de fich. Tail. Occ. Disp. %Occ. Monté sur

quand je dit next unless /%\s/
en fait ça donne : la prochaine ligne sauf s'il y a un % suivi d'un espace (\s c'est pour un espace dans les expressions régulières)




my $df=q{df -h | perl -ne 'next unless /%\s/;
####### ici je comprend pas comment le split peut récupérer le résultat du df -h. Par contre je crois qu'en suite on met dans la variable @t tous les éléments généré par le split Mais je ne comprend pas le /\s+/ ######


il faut comprendre le fonctionnement de la fonction split
split prends une chaine de caractère et l'éclate dans un tableau en foncton de séparateur
dans notre cas j'ai mis \s+ qui veut dire minimum un espace, maximum n'importe

@t=split /\s+/;
print "$t[5] est utilisé à $t[4].
Il reste $t[2] sur $t[1] disponible pour $t[0]\n"
####### Euh il sert à quoi le if ici ... si $t[4] > 38 bah on fait quoi ?? ########
if $t[4] > 38'
};


en fait ici il s'agit d'un idiome Perl qu'on peut l'appeller modificateur d'expression
Exemple

en perl on peut écrire
if ($x>0){
print "positif\n";
}

ou

print "positif\n" if $x > 0;

C'est la même chose

Dans notre cas je dit de capturer les donné de df -h si la limite > 38
J'ai pouvais biensûr écrire
if(limite > 38){
capture df -h
}

mais c'est plus naturel de dire
affiche moi ça si la limite plus grande que 38

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

my ($out, $err, $exit) = $ssh->cmd("$df");

####### Ici le if sert bien à vérifié qu'il y a quelque chose dans la sortie $out c'est ça ? et si c'est le cas bah on envoie un mail ? #########


Ben, oui.
s'il y a quelque chose dans $out ça veut dire que j'ai dépassé la limite
donc j'envoie un mail
s'il n'y a rien if($out) et faux donc je n'envoie rien

if($out){
MIME::Lite->send('smtp','smtp.free.fr');
####### Par contre ici le my $msg = new MIME::Lite sert à quoi ? à dire qu'on va créer un nouveau message c'est ça ? Mais si c'est ça il ça serait pas plutot un truc du genre my $msg=MIME::Lite->new ( from ..... ) non ??? ##########
my $msg = new MIME::Lite
From => 'lami20j@free.fr',
To => 'lami20j@yahoo.fr',
Subject => "Espace disque - Consomation",
Type => 'TEXT',
Data => $out;
$msg->send();
print "***** MESSAGE ENVOYE *****\n";
}
0
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 5
14 juin 2007 à 11:34
Alors en fait j'ai choisis la méthode en shell (mais je vais aussi le faire en perl faut juste que je comprenne un peu plus comment ça marche ^^ )

Voilà le script final :

---------------------------------
#!/bin/bash

email="maillon@domaine.net"
message="/tmp/recap.$$"
limit="80"

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 "La partition "$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 QUOTA disque sur $serveur."
fi
rm /tmp/recap.*

--------------------------

Les détails du script sont expliqués un peu plus haut dans le sujet.

Voici les liens intéressants :
http://docsrv.caldera.com:8457/en/AdvBashHowto/index.html
guide d utilisation du shell pour debutant
http://abs.traduc.org/abs-4.2.01-fr/index.html
http://www.shellunix.com/index.html

Voili voilou ^^



Par contre dans un souci d'amélioration (et de connaissances ^^) :

ce script ne prend pas en compte les accents ... j'ai vu en faisant un man mail qu'il y avait une option -a qui permettait de changer l'encodage par contre quand je la lance il me dis qu'il ne connait pas l'option -a .... et le net est muet sur cette option ... si vous avez des infos là dessus ... ^^

Et en Perl en fait quand je lance ce script :
quand j'exécute ton script lami et bien il se bloque au niveau de la connexion ssh. Il n'affiche rien il reste et attends che pas quoi... en fait il bloque après le "bouyou" ...

Voilà le script :

#!/usr/bin/perl
use strict;
use warnings;
use Net::SSH::Perl;
use MIME::Lite;

my $host = "cerbere";
my $username = "maillon";
my $password = "maillon";

my $df=q{df -h | perl -ne 'next unless /%\s/;
@t=split /\s+/;
print "$t[5] est utilisé à $t[4].
Il reste $t[2] sur $t[1] disponible pour $t[0]\n"
if $t[4] > 10'
};

print "bouyou\n";

my $ssh = Net::SSH::Perl->new($host);
$ssh->login($username, $password);
print "bip bip\n";
my ($out, $err, $exit) = $ssh->cmd("$df");


print $out;

if($out){
MIME::Lite->send('smtp', 'smtp.domaine.com');
my $msg = new MIME::Lite
From => 'root@cerbere.domaine.net',
To => 'franck@quotatis.net',
Subject => "Espace disque - Consomation",
Type => 'TEXT',
Data => $out;
$msg->send();
print "***** MESSAGE ENVOYE *****\n";
}
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
14 juin 2007 à 11:45
Tu as fait ton, choix, c'est bien :-))

Bonne continuation et bravo Jipicy
0