|
|
|
|
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 ;-)
Configuration: Windows XP Firefox 2.0.0.4
Salut,
|
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 ^^
|
Pour les mails tu as aussi http://www.alianwebserver.com/informatique/languages/perl/mail.htm lami20j |
Il est super ce lien ^^ merci :)
|
Salut,
|
Salut,
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" } ' > $messageLa 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]$;-)) Z'@+...che. JP : Zen, my Nuggets ! ;-) Le savoir n'est bon que s'il est partagé. |
Oué merci jipicy !! ça marche ça !! :D hihiihhi
|
Re-
#!/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". Z'@+...che. JP : Zen, my Nuggets ! ;-) Le savoir n'est bon que s'il est partagé. |
Salut,
#!/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 http://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 :-)) lami20j P.S. J'ai fixé la limite à 38, à changer aussi |
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
|
Par contre j'ai un trou de mémoire, je ne comprend pas à quoi sert le if dans le awk
|
OKI c'est bon j'ai pigé ! xD ^^ lol
|
Salut,
|
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 ^^ )
|