Petit problème de logique - Envoie d'un message xmpp

Salut,
Je suis en train de bricoler un script (à partir d’un script emprunté à NixCraft) qui est censé vérifier si mes services tournent et m’envoyer un message sur mon ejabberd en cas d’echec.
Voici ou j’en suis:

[code]chk_services(){

Quels ports sont à l’écoute ?

RPORTS=$($NETSTAT -tulpn | grep -vE ‘^Active|Proto’ | grep ‘LISTEN’ | awk ‘{ print $4}’ | awk -F: ‘{print $NF}’ | sed ‘/^$/d’ | sort -u)

    for t in $ports
    do
            sname=$(echo $service | cut -d' ' -f$c)
            echo -en " $sname\t\t\t : "
            echo -en " $sname\t\t\t : " >> $LOG
            for r in $RPORTS
            do
                    if [ "$r" == "$t" ]
                    then
                            status="YES"
                            sendjabb=1
                            break
                    fi
            done
            echo -n "$status"
            echo ""
            echo -n "$status" >>$LOG
            echo "" >>$LOG
            [ $logtosyslog -eq 1  ] && $LOGGER "$sname service running : $status"

            # MAJ compteur
            c=$( expr $c + 1 )
            status="NO"
    done

    if [ $sendjabb -eq 1 ];
    then
            sendxmpp -m $LOG $JABBID

fi
}[/code]

Mon problème est que le script envoie systématiquement un message, même si tous les service fonctionnent…
J’aimerais ne recevoir une alerte que lorsqu’un service tombe…

Voici ce que m’envoie le script sur mon pidgin…

quote toto@monserveur.tld: -------------------------------------------------------------
Running services status @ admin@monserveur.tld [ mardi 15 mai 2012, 14:32:19 (UTC+0200) ]

SSH : YES
DNS : YES
WEB : YES
MAIL : YES

This is an automatically generated Linux service status notification by /usr/local/bin/watchservices.sh script.[/quote]

Si vous aviez une idée, j’en serais ravi!
Merci.

if [ "$r" == "$t" ] then status="YES" sendjabb=1 break fi
Quand le status est à YES sendjabb est à 1.

if [ $sendjabb -eq 1 ]; then sendxmpp -m $LOG $JABBID fi
Quand sendjabb est à 1 tu envoie le message.

[code]Running services status @ admin@monserveur.tld [ mardi 15 mai 2012, 14:32:19 (UTC+0200) ]

SSH : YES
DNS : YES
WEB : YES
MAIL : YES

This is an automatically generated Linux service status notification by /usr/local/bin/watchservices.sh script.[/code]
Les status à YES te sont envoyé.

Je vois pas où est le problème entre ton code et ton résultat. Mais je présume que tu voudrait remplacer :

par

(il manquera toujours une initialisation de sendjabb au début)

@MisterFreez : Tu va penser que je te casse les pieds ( :mrgreen: ), mais ce script est typiquement le genre de chose que l’on peut faire avec perl?

Salut,
Merci. MisterFreeze est toujours présent quand il y a du script dans l’air… :038

[quote=“MisterFreez”]
Quand le status est à YES sendjabb est à 1.
Quand sendjabb est à 1 tu envoie le message.[/quote]
Ça j’avais bien percuté. Le truc c’est qu’il y a une boucle, donc plusieurs status.

[quote=“MisterFreez”]Mais je présume que tu voudrait remplacer :

if [ $sendjabb -eq 1 ];

par

if [ $sendjabb -ne 1 ];

Ça ne change rien. Service OK ou pas, pas de message envoyé.
La variable $sendjabb reste à 1 même si un service tombe.

Ça j’ai pas compris.

Re,

j’ai trouvé une solution. Je ne sais pas ce que ça vaut, mais ça fonctionne…

[quote=“lol”]Re,

j’ai trouvé une solution. Je ne sais pas ce que ça vaut, mais ça fonctionne…

Si tu veux il n’y a aucun lien entre le premier code et ça :slightly_smiling:

Le problème c’est que tu n’initialisais jamais sendjabb.

@M3t4linux > C’est assez proches dans l’idée des sondes nagios et un grand nombre d’entre elles sont faites en perl (les sondes nagios étant utilisées par un paquet de serveur de supervision). Pour en avoir discuté avec des personnes qui y touchent un peu plus. Pour ce genre de sondes, perl est utilisé par défaut, ensuite c’est du C si on a besoin de performance et du shell quand c’est vraiment plus simple/pratique en shell.

Il te manquais des infos, j’avais tronqué le début du script qui contient ça:

[quote]#Counters, set defaults
c=1
status=""
sendjabb=0[/quote]

Donc, je ne comprend pas trop ce qui déconnait.

Pas grave, ça fonctionne avec ma petite solution… :023
Quand un service tombe, j’ai un message sur mon compte jabber.

quote admin@domaine.tld: -------------------------------------------------------------
Running services status @ serveur.domaine.tld [ mardi 15 mai 2012, 16:35:53 (UTC+0200) ]

Mysql : YES
Monit : NO
Ftp : YES
SSH : YES
Imap : YES
Web : YES
Dns : YES
Mail : YES
-------------------------------------------------------------[/quote]

Il te manquais des infos, j’avais tronqué le début du script qui contient ça:

[quote]#Counters, set defaults
c=1
status=""
sendjabb=0[/quote][/quote]
Histoire que tu comprenne. Si tu veux qu’il soit initialisé à 0 à chaque itération de la boucle, le mieux c’est de l’initialiser à 0 à chaque itération de la boucle :wink:

Ce n’est pas le cas avec le bout de code que je donne en plus ?

Ça dépend de ce que tu appel « le début du script » (j’ai jamais était bon en puzzle).

Salut,

J’ai finalement du mal à te comprendre.
Si je l’initialise à chaque itération, je vais recevoir une alerte pour chaque service défaillant (si on imagine que tous mes services sont à la ramasse, je vais recevoir autant d’alertes que de services).

Tu as raison on s’est mal compris, je n’avais pas fait gaffe que l’envoie est hors de la boucle.

Salut,
Merci, ça me rassure. Mon grep sur le log, même s’il n’est pas joli, fait sont travail; C’est le principal.
Vu comment c’est foutu, je ne voyais pas comment mettre l’action dans la boucle de toute façon…