2 - Créer ses plugins en Perl - Troisième Partie
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
mailqAperç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 -pAperç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 -rAperç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 -1Aperç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.