Catégories
Nagios Open-source Planet-libre

Nagios 4: Résoudre l’erreur « Can’t open /etc/rc.d/init.d/functions »

La version 4 de Nagios est enfin sortie et vous avez décidé de l’installer sur votre serveur Debian/Ubuntu. Il y a de forte chance que vous tombiez sur un message d’erreur au lancement du démon Nagios. Nous allons voir dans ce billet comment résoudre ce problème.

Identification du problème

Vous avez le message suivant quand vous lancer Nagios ?

# /etc/init.d/nagios start
/etc/init.d/nagios: 20: .: Can't open /etc/rc.d/init.d/functions

alors ce billet est fait pour vous…

Explication du pourquoi…

Depuis la mise à jour de Nagios vers la version 4.0 (et la version corrective 4.0.1) un bug plutôt gênant peut impacter les machines Debian et Ubuntu. En effet le script de démarrage de Nagios qui se trouve dans le fichier /etc/init.d/nagios fait un appel à un ensemble de fonctions génériques sous /etc/rc.d/init.d/functions. Malheureusement, ce fichier n’existe pas sous ce nom sur les dernières versions de Debian/Ubuntu mais il est disponible sous  /lib/lsb/init-functions.

Comment résoudre le problème étape par étape…

On commence par installer le logiciel daemon qui est utilisé par le script d’installation nouvelle mouture:

sudo apt-get install daemon

Puis on hack le script de démarrage:

        sudo sed -i 's/^\.\ \/etc\/rc.d\/init.d\/functions$/\.\ \/lib\/lsb\/init-functions/g' /etc/init.d/nagios
        sudo sed -i 's/status\ /status_of_proc\ /g' /etc/init.d/nagios
        sudo sed -i 's/daemon\ --user=\$user\ \$exec\ -ud\ \$config/daemon\ --user=\$user\ --\ \$exec\ -d\ \$config/g' /etc/init.d/nagios
        sudo sed -i 's/\/var\/lock\/subsys\/\$prog/\/var\/lock\/\$prog/g' /etc/init.d/nagios
        sudo sed -i 's/\/sbin\/service\ nagios\ configtest/\/usr\/sbin\/service\ nagios\ configtest/g' /etc/init.d/nagios
        sudo sed -i 's/\"\ \=\=\ \"/\"\ \=\ \"/g' /etc/init.d/nagios
        sudo sed -i "s/\#\#killproc\ \-p\ \${pidfile\}\ \-d\ 10/killproc\ \-p \${pidfile\}/g" /etc/init.d/nagios
        sudo sed -i "s/runuser/su/g" /etc/init.d/nagios
        sudo sed -i "s/use_precached_objects=\"false\"/&\ndaemonpid=\$(pidof daemon)/" /etc/init.d/nagios
        sudo sed -i "s/killproc\ -p\ \${pidfile}\ -d\ 10\ \$exec/\/sbin\/start-stop-daemon\ --user=\$user\ \$exec\ --stop/g" /etc/init.d/nagios
        sudo sed -i "s/\/sbin\/start-stop-daemon\ --user=\$user\ \$exec\ --stop/&\n\tkill -9 \$daemonpid/" /etc/init.d/nagios

Il ne reste plus qu’à redémarrer Nagios:

sudo service nagios start

 …Ou utiliser un script qui fait tout pour vous

Pour les gros flemmards que vous êtes, j’ai créé un script qui va vérifier que le problème existe sur votre configuration et le corriger pour vous:

wget https://raw.github.com/nicolargo/nagiosautoinstall/master/hack4nagiosstart.sh
chmod a+x ./hack4nagiosstart.sh
./hack4nagiosstart.sh

Note: J’ai également ajouter l’appel à ce hack dans mes scripts d’installation et de mise à jour automatique de Nagios.

Catégories
Developpement Open-source Planet-libre

Gérer ces processus/démons Python avec Supervisor

C’est en lisant la document du projet 0Bin, une implémentation libre et auto-hébergé de PasteBin dont je reparlerai bientôt, que je suis tombé sur Supervisor. Supervisor est un système de contrôle de processus (comme launchd ou runinit) simple et orienté utilisateur (voir la documentation et les avantages ici) et donc idéal pour lancer des processus Python en mode démon (par un exemple un serveur Glances, mais ce n’est qu’un exemple…).

Installation de Supervisor

Sur un système Debian/Ubuntu, l’installation de Supervisor se résume à la saisie de la commande suivante dans un terminal:

sudo apt-get install supervisor

Une fois l’installation terminé, nous allons maintenant configurer Supervisor en utilisant le fichier /etc/supervisor/supervisord.conf (sur un système Debian).

Ajout d’un démon dans Supervisor

Nous allons donc prendre l’exemple d’un administrateur système qui souhaite que le serveur Glances soit lancé au démarrage de la machine et que celui ci soit redémarré automatiquement dans le cas ou Glances plante <mauvaisefois>ce qui n’arrive jamais</mauvaisefois>.

Pour lancer Glances en mode serveur, il faut utiliser la ligne de commande suivante:

/usr/local/bin/glances -s -C /etc/glances/glances.conf -P motdepasse

Il suffit donc d’ajouter la section suivante en fin du fichier  /etc/supervisor/supervisord.conf:

; Glances server section
[program:glances]
command=/usr/local/bin/glances -s -C /etc/glances/glances.conf -P motdepasse
user=nicolargo
autostart=true
autorestart=true

On demande a ce que le processus soit exécuté avec les droits d’un utilisateur standard (user=nicolargo dans mon exemple) et que le processus démarre automatiquement au démarrage de Supervisor (autostart=true) et qu’il soit bien redémarré si Supervisor détecte un problème sur le processus Glances.

Prendre en compte la configuration et administrer nos processus

Pour que notre configuration soit prise en compte, il faut relancer Supervisor avec les lignes de commandes:

sudo service supervisor stop
sudo service supervisor start

Normalement, à ce stade, votre processus Glances server doit être lancé. Pour le vérifier vous pouvez utiliser la commande supervisorctl qui permet d’avoir un statu des processus et un moyen simple de les arrêter / démarrer.

Vérification du statu du service Glances server:

$ sudo supervisorctl status
glances                          RUNNING    pid 5844, uptime 0:26:11

Je vous laisse regarder les autres commandes disponibles avec supervisorctl:

$ sudo supervisorctl help

default commands (type help <topic>):
=====================================
add    clear  fg        open  quit    remove  restart   start   stop  update 
avail  exit   maintail  pid   reload  reread  shutdown  status  tail  version