1 - Installation de Webinject et des modules perl

Webinject est écrit en perl, il nécessite cependant des modules perl supplémentaires qui ne sont pas installés par défaut.
Pour utiliser les fonctions ssl il fau installer libssl-dev.

minitux~# aptitude install libssl-dev
minitux~# cpan -i LWP HTTP::Cookies HTTP::Request::Common Time::HiRes Getopt::Long Error XML::Parser XML::Simple Crypt::SSLeay

On récupère ensuite le script webinject :

minitux~# cd /tmp
minitux~# wget http://downloads.sourceforge.net/webinject/webinject-1.41.src.tar.gz
minitux~# tar xzvf webinject-1.41.src.tar.gz
minitux~# cd webinject
minitux~# cp webinject.pl /usr/local/nagios/libexec/
minitux~# cp config.xml testcases.xml /usr/local/nagios/etc/object/

2- Les codes de retour du plugin webinject

Après chaque test, Webinject peut retourner ces codes à Nagios.

OK
Tous les tests se sont passés correctement, Le code retour 0 est envoyé à Nagios avec le temps nécessaire pour effectuer le test.

WARNING
Si vous déclarez un "globaltimeout" dans votre fichier de configuration, cette valeur sera comparé au temps passé à effectuer le test.
Si le test s'est passé correctement mais avec un temps supérieur au "globaltimeout", il est considéré comme WARNING.
Le code 1 est envoyé à Nagios avec le message que le test à pris plus de temps que le "globaltimeout".

CRITICAL
On considère que le test a échoué si un des cas paramétré a échoué. Le code de retour 2 est envoyé à Nagios avec un le numéro du test qui à échoué.
Ce message peut être facilement personnalisé en ajoutant une section "errormessage" dans les différents cas de test.

3- Configuration de Webinject

Webinject a besoin de 2 fichiers wml, un pour sa configuration et un autre pour le scénario de test. Nous allons nous intéresser au premier fichier qui définira la configuration global.
Nous allons modifier me fichier config.xml et ajouter le mode nagios plugin :

minitux~# vi /usr/local/nagios/etc/object/config.xml
en ajoutant ceci : <reporttype>nagios</reporttype>

Ceci va modifier la sortie de webinject.pl pour être compatible avec Nagios avec une seule ligne et un code de retour.
On peut aussi ajouter "<globaltimeout>" dans la configuration pôur obtenir un warning en cas de lenteur.

Voici un exemple de fichier de configuration :

<testcasefile>testcase.xml</testcasefile>
<useragent>NagiosWabinjectAgent</useragent>
<globaltimeout>20</globaltimeout>
<reporttype>nagios</reporttype>

Pour plus d'option il suffit de consulter la documentation de Webinject.

4- Configuration d'un scénario de test

Maintenant nous devons mettre en place un scénario de test.
Dans chaque cas nous pourrons spécifier un message d'erreur pour décrire le problème qui apparaitra dans l'interface de Nagios.
Voici un simple exemple du fichier testcase.xml :

<testcases repeat="1">
<case
id="1"
description1="Test de login sur mon site"
method="post"
url="http://www.mydummyapplication.com/Authentication"
postbody="user=foo&password=bar"
verifynegative="User unknown"
errormessage="Impossible d'authentifier l'utilisateur"
/>

<case
id="2"
description1="Test d'acces à la base de données"
method="post"
url="http://www.mydummyapplication.com/DatabaseRequest.php"
postbody="object=fruits&color=red"
verifypositive="strawberry"
errormessage="Impossible d'effectuer une requete sur la base"
/>
</testcases>

Une fois ceci installé, il est assez facile de valider notre configuration avant de le mettre en place dans Nagios.

minitux~# /usr/local/nagios/libexec/webinject.pl -c ../etc/object/config.xml ../etc/object/testcase.xml

ou tout simplement :

minitux~# /usr/local/nagios/libexec/webinject.pl -c ../etc/object/config.xml

car nous avons spécifié le fichier de scénario dans le fichier de configuration config.xml.

4- Configuration de Nagios

La première chose à faire est de créer une nouvelle commande dans Nagios dans le fichier commands.cfg.

define command {
command_name webinject
command_line /usr/local/nagios/libexec/webinject.pl -c $ARG1$ $ARG2$
}

Ensuite il faut déclarer un nouveau service dans Nagios dans le fichier services.cfg.

define service {
use generic-service
host_name Application-server
service_description WebInject test of MyApplication
is_volatile 0
check_period 24x7
max_check_attempts 3
normal_check_interval 1
retry_check_interval 1
contact_groups admins
notification_interval 120
notification_period 24x7
notification_options w,u,c,r
check_command webinject!../etc/object/config.xml!../etc/object/testcase.xml
}

Bien sur, adaptez les différents paramètres pour qu'ils soient correct avec votre plateforme.
Il ne vous reste plus qu'à recharger la configuration de Nagios.

5- Résultats

Maintenant si votre base de données est arrêtée mais pas votre application, vous recevrez une alerte CRITICAL.

WebInject CRITICAL: Impossible d'effectuer une requete sur la base

Ou si vous n'avez pas spécifier de message d'erreur ;

WebInject CRITICAL - Test case number 2 failed

Si tout se passe correctement, vous recevrez :

WebInject OK - All tests passed successfully in 4.932 seconds

6- Problèmes rencontrés

Attention si vous avez fait tourner Webinject avec un utilisateur autre queNagios car quelques fichiers vont être créés avec cet utilisateur.
Nagios obtiendra une erreur car il ne pourra pas écrire sur ces fichiers. Il faudra donc changer le propriétaire de ces fichiers avec l'utilisateur nagios.
SI vous rencontrez ce problème, Nagios affichera une erreur du type
"Return code of 13 for check of service ... on host ... was out of bounds".

Assurez vous aussi que nagios a suffisamment de droits pour exécuter webinject.pl

7- Liens

Le document original en anglais Webinject nagios plugin
Le site de Nagios Nagios site