Vous êtes ici:

Menu


Stacks Image 47288
Patientez, je travaille…

2 - Créer ses plugins en Perl - Troisième Partie

Stacks Image 5251
Troisième article sur la création de plugin Perl. Nous allons créer une sonde qui vérifiera le nombre de message électronique non envoyé par le serveur MTA(Mail Transfert Agent) postfix. Je vous propose un plugin simple avec deux solutions pour arriver à la même finalité.

2.1 Principe du plugin

Ce plugin ou sonde en français va vérifier le nombre de message non envoyé par Postfix suite à un problème réseau par exemple. Il existe plusieurs méthodes cela. La première est l'utilisation de la commande mailq.
Commande seule
mailq
Aperçu du résultat
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
B03ADA2C89      465 Wed Jul 12 19:24:41  root@central341pack.localdomain
(Host or domain name not found. Name service error for name=gmail.com type=MX: Host not found, try again)
                                         eric.coquard@gmail.com

4EEAEA2C88      465 Wed Jul 12 19:24:40  root@central341pack.localdomain
(Host or domain name not found. Name service error for name=gmail.com type=MX: Host not found, try again)
                                         eric.coquard@gmail.com

382E0A2C86      465 Wed Jul 12 19:24:39  root@central341pack.localdomain
(Host or domain name not found. Name service error for name=gmail.com type=MX: Host not found, try again)
                                         eric.coquard@gmail.com

-- 2 Kbytes in 3 Requests.
La deuxième méthode est d'utiliser la commande postqueue avec l'option -p. Elle donne le même résultat.
Commande seule
postqueue -p
Aperçu du résultat
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
B03ADA2C89      465 Wed Jul 12 19:24:41  root@central341pack.localdomain
(Host or domain name not found. Name service error for name=gmail.com type=MX: Host not found, try again)
                                         eric.coquard@gmail.com

4EEAEA2C88      465 Wed Jul 12 19:24:40  root@central341pack.localdomain
(Host or domain name not found. Name service error for name=gmail.com type=MX: Host not found, try again)
                                         eric.coquard@gmail.com

382E0A2C86      465 Wed Jul 12 19:24:39  root@central341pack.localdomain
(Host or domain name not found. Name service error for name=gmail.com type=MX: Host not found, try again)
                                         eric.coquard@gmail.com

-- 2 Kbytes in 3 Requests.
Comme vous pouvez le constater, la première ligne ne nous intéresse pas. La liste des processus n’est pas triée en fonction de l’utilisation du CPU mais plutôt par rapport au processus père. Il faut y remédier par l’utilisation de pipe et de deux commande. La première va supprimer la première ligne, la seconde va trier la liste par l’utilisation du processus. Voici la commande modifiée :
ps -eo pcpu,pid,user,args | tail -n +2 | sort -k1 -n -r
Aperçu du résultat
25.7  4653 pi       /usr/lib/libreoffice/program/soffice.bin --calc --splash-pipe=5
 7.0  4763 root     sudo ps -eo pcpu,pid,user,args
 1.0  4765 pi       sort -k1 -n -r
 1.0  4764 pi       tail -n +2
 1.0     1 root     /sbin/init
 0.9  3210 pi       lxpanel --profile LXDE-pi
 0.7    91 root     /lib/systemd/systemd-journald
 0.6  3136 root     /usr/bin/X -nolisten tcp :0 vt1 -auth /tmp/serverauth.dlINFNi1O9
 0.4   788 centreo+ /usr/sbin/centengine /etc/centreon-engine/centengine.cfg
 0.4   530 message+ /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
 0.3   699 snmp     /usr/sbin/snmpd -LS4d -Lf /dev/null -u snmp -g snmp -I -smux mteTrigger mteTriggerConf -p /run/snmpd.pid
 0.3  4634 pi       /usr/lib/libreoffice/program/oosplash --calc
 0.2     7 root     [rcu_preempt]
 0.2  3227 pi       /usr/lib/gvfs/gvfs-udisks2-volume-monitor
 0.1   560 root     /usr/sbin/rsyslogd -n
 0.1   460 root     /lib/systemd/systemd-logind
 0.1  4604 root     [kworker/0:3]
 0.1  3230 root     /usr/lib/udisks2/udisksd --no-debug
 0.1  3221 root     /usr/lib/policykit-1/polkitd --no-debug
 0.1  3211 pi       pcmanfm --desktop --profile LXDE-pi
…………………….
Pour finir, on ne gardera que la première ligne avec cette autre commande.
ps -eo pcpu,pid,user,args | tail -n +2 | sort -k1 -n -r | head -1
Aperçu du résultat
3.0  4653 pi       /usr/lib/libreoffice/program/soffice.bin --calc --splash-pipe=5
Maintenant que nous avons notre commande, passons à la création du plugin.

2.2 Création du plugin

Le plugin se nommera check_top_process.pl et sera créé dans le dossier des plugins. Commençons par les déclarations du programme.
#!/usr/bin/perl -w
#===============================================================================
# Auteur : kermith72
# Date   : 22/10/2013
# version: 2.00
# But    : plugin Nagios verification de processus (top processus)
#===============================================================================
use strict; # rends le language moins permissif, déclaration de variable obligatoire,...
use warnings; # affichage des avertissements, on peut utiliser /usr/bin/perl -w
use Monitoring::Plugin; # Chargement du module CPAN

# déclaration variable $licence
my $licence = "This program is free software; you can redistribute it and/or modify it under"
        ." the terms of the GNU General Public License as published by the Free Software"
        ." Foundation ; either version 2 of the License.";

# déclaration de la sonde
my $np = Monitoring::Plugin->new(
        shortname => 'Top process',
        usage => 'Usage : %s -c|critical  -w|warning=',
        license => $licence,
        version => '3.00',
        blurb => "Ce plugin affiche le processus utilsant le plus de CPU"
                ."les parametres critical et warning sont obligatoire et s'expriment en pourcentage@"
        );

2.3 Ajout des paramètres

Créons nos paramètres. Ce sont les seuils warning et critical, ils seront obligatoires grâce à ce paramétrage required = 1
# Définition de l'argument --critical ou -c
$np->add_arg(
  spec     => 'critical|c=f',
  help     => 'pourcentage process critique',    # Aide au sujet de cette option
  required => 1,                  # Argument obligatoire
);

# Définition de l'argument --warning ou -w
$np->add_arg(
  spec     => 'warning|w=f',
  help     => 'pourcentage process warning',
  required => 1,
);

# Récupération des valeurs de paramètres
$np->getopts;

2.4 Logique du programme

Voici le corps du programme, nous récupérons le résultat de la commande unix ps. Le dernier pipe envoie le résultat de la commande dans un fichier pour traiter le résultat. J'ai exclu la logique pour le plugin Nagios.
#logique du plugin
open(FILE, "ps -eo pcpu,pid,user,args | tail -n +2 | sort -k1 -n -r | head -2 |");
while (<FILE>)
{
	# récupération du TOP CPU
	($cpu,$pid,$user,$command) = split;
     
   
}

__END__
La commande ps affiche un résultat proche de celui-ci.
0.2  1470 6002     /usr/local/centreon-broker/bin/cbd /usr/local/centreon-broker/etc/central-broker.xml
La commande split permet de récupérer chaque sous-chaîne de la ligne dans une variable.

2.5 Traitement des données de performances

Nous utiliserons la fonction add_perfdata pour rajouter les données de performances.
        # ajout des données de performances
        $np->add_perfdata(
                 label => "top_process",
                 value => $cpu,
                 uom => "%",
                 warning => $np->opts->warning,
                 critical => $np->opts->critical
             );

2.6 Traitement du code de retour pour le plugin

Le code de retour sera traité avec la fonction check_threshold en fonction des seuils passés en arguments. En trois lignes de programme avec la condition if, nous terminons notre plugin.
         # Recupération du code retour en fonction de warning et critical
         $code_retour = $np->check_threshold(
                 check => $cpu,
                 warning => $np->opts->warning,
                 critical => $np->opts->critical,
             );
         # traitement du code retour
         $np->plugin_exit( $code_retour, "process critical : $command with $cpu%") if $code_retour == CRITICAL;
         $np->plugin_exit( $code_retour, "process warning : $command with $cpu%") if $code_retour == WARNING;
         $np->plugin_exit( $code_retour, "all process OK") if $code_retour == OK;

2.7 Le programme complet

#!/usr/bin/perl -w
#===============================================================================
# Auteur : kermith72
# Date   : 12/07/2017
# version: 3.00
# But    : plugin Nagios verification de processus (top processus)
#===============================================================================
use strict; # rends le language moins permissif, déclaration de variable obligatoire,...
use warnings; # affichage des avertissements, on peut utiliser /usr/bin/perl -w
use Monitoring::Plugin; # Chargement du module CPAN

# déclaration variable $licence
my $licence = "This program is free software; you can redistribute it and/or modify it under"
        ." the terms of the GNU General Public License as published by the Free Software"
        ." Foundation ; either version 2 of the License.";

# déclaration de la sonde
my $np = Monitoring::Plugin->new(
        shortname => 'Top process',
        usage => 'Usage : %s -c|critical  -w|warning=',
        license => $licence,
        version => '3.00',
        blurb => "Ce plugin affiche le processus utilsant le plus de CPU"
                ."les parametres critical et warning sont obligatoire et s'expriment en pourcentage@"
        );

# Définition de l'argument --critical ou -c
$np->add_arg(
  spec     => 'critical|c=f',
  help     => 'pourcentage process critique',    # Aide au sujet de cette option
  required => 1,                  # Argument obligatoire
);

# Définition de l'argument --warning ou -w
$np->add_arg(
  spec     => 'warning|w=f',
  help     => 'pourcentage process warning',
  required => 1,
);

# Récupération des valeurs de paramètres
$np->getopts;

# logique du programme
#declaration des variables
my $cpu;
my $pid;
my $user;
my $command;
my $code_retour;

# récupération du TOP CPU
open(FILE, "ps -eo pcpu,pid,user,args | tail -n +2 | sort -k1 -n -r | head -2 |");
while (<FILE>)
{
        ($cpu,$pid,$user,$command) = split;
        # ajout des données de performances
        $np->add_perfdata(
                 label => "top_process",
                 value => $cpu,
                 uom => "%",
                 warning => $np->opts->warning,
                 critical => $np->opts->critical
             );
         # Recupération du code retour en fonction de warning et critical
         $code_retour = $np->check_threshold(
                 check => $cpu,
                 warning => $np->opts->warning,
                 critical => $np->opts->critical,
             );
         # traitement du code retour
         $np->plugin_exit( $code_retour, "process critical : $command with $cpu%") if $code_retour == CRITICAL;
         $np->plugin_exit( $code_retour, "process warning : $command with $cpu%") if $code_retour == WARNING;
         $np->plugin_exit( $code_retour, "all process OK") if $code_retour == OK;
}


__END__

2.8 Test du plugin

Voici le test du plugin avec toutes les possibilités.

2.9

Affichage du graphe lié au plugin check_top_process
comments powered by Disqus
 Vous êtes ici: