Voici ma première utilisation pratique du Raspberry. Je l'appellerai un signal pour Centreon. Il s'agit d'un système sonore et visuel récupérant les états critiques et warnings des hôtes et services d'un serveur Centreon. Le Raspberry se comporte en serveur TCP récupérant les données envoyées par le client TCP du serveur Centreon. Les programmes côté client et côté serveur sont codés en python. J'ai utilisé du matériel de récupération pour la partie visuelle et le signal est en briques Lego.
C'est ma première interface, tout est codé en dur dans le programme en attendant des améliorations…
C'est ma première interface, tout est codé en dur dans le programme en attendant des améliorations…
1 Principes de fonctionnement
Pour faire fonctionner ce signal, nous aurons besoin d'un serveur Centreon utilisant une base SQL CENTSTATUS (fonctionnement NDOUTILS) et d'un réseau TCP/IP.
Toutes les minutes, le client TCP, situé sur le serveur Centreon, va vérifier dans tables de CENTSTATUS, l'état des hôtes et services. Il enverra au serveur TCP, situé dans le Raspberry, les informations de santé du serveur Centreon. Le Raspberry, grâce à son interface entrée/sortie va gérer l'affichage des leds. Nous utiliserons le langage Python et la librairie RPi.GPIO pour commander l'interface I/O.
Toutes les minutes, le client TCP, situé sur le serveur Centreon, va vérifier dans tables de CENTSTATUS, l'état des hôtes et services. Il enverra au serveur TCP, situé dans le Raspberry, les informations de santé du serveur Centreon. Le Raspberry, grâce à son interface entrée/sortie va gérer l'affichage des leds. Nous utiliserons le langage Python et la librairie RPi.GPIO pour commander l'interface I/O.
1.1 Schéma électronique

Ci-dessus le schéma électronique pour alimenter les leds. Il vous faudra trois résistances de 470 ohms et trois leds électroluminescences. La position des Pin de sortie est indiquée plus bas sur le dessin.
2 Installation du programme
Pour le serveur Centreon, vous aurez besoin de Python (normalement déjà installé) et de la librairie Mysql pour Python.
apt-get install python-mysqldb
Pour le serveur Centreon, vous aurez besoin de Python (normalement déjà installé) et de la librairie Mysql pour Python.
nano /root/sendcentreon.py
2.1 Programme client TCP
Voici le programme installé sur le serveur Centreon :
#!/usr/bin/env python
# -*- coding:Utf-8 -*-
# chargement des librairies
import MySQLdb;
import socket
# initialisation des variables
TCP_IP = '192.168.0.15'
TCP_PORT = 5670
BUFFER_SIZE = 1024
MESSAGE="Host:unknown,Service:unknown"
conn = MySQLdb.connect('localhost','centreon','password', 'centstatus')
curs = conn.cursor()
# vérification des hosts
result=curs.execute("select distinct current_state from nagios_hoststatus" )
# récupération du nombre d'enregistrement
numrows = int(curs.rowcount)
# initialisation host alarme
host_alarme = 0
# lecture des enregistrements
for x in range(0, numrows):
result=curs.fetchone()
if result[0] == 1:
host_alarme = 1
# résultat host
if host_alarme:
print "host critical"
else:
print "Host OK"
# vérification des services
result = curs.execute("select distinct current_state from nagios_servicestatus order by current_state desc")
# récupération du nombre d'enregistrement
numrows = int(curs.rowcount)
# inialisation service alarme
service_alarme = 0
# lecture des enregistrement
for x in range(0, numrows):
result=curs.fetchone()
if result[0] == 2:
# Critical
service_alarme = 2
break
if result[0] ==1:
# Warning
service_alarme = 1
break
if result[0] == 3:
# Unknow
service_alarme = 3
# resultat service
if service_alarme == 0:
print "Services OK"
elif service_alarme == 1:
print "Services Warning"
elif service_alarme == 2:
print "Services Critical"
else:
print "Services Unknow"
curs.close()
conn.close()
MESSAGE = "Host:"+str(host_alarme)+", Service:"+str(service_alarme)
print MESSAGE
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(MESSAGE)
data = s.recv(BUFFER_SIZE)
s.close()
# affichage du retour
print "received data:", data
2.2 Programme serveur TCP
Voici le programme installé sur le RaspBerry. Créez le fichier dans le répertoire de votre choix.
nano /root/recv_tcpip_led.py
#!/usr/bin/env python
# -*- coding:Utf-8 -*-
# Programme serveur
# version 1.00
# reçoit les informations du serveur Central
# charge les librairies
import socket
import time
import RPi.GPIO as GPIO
import os
# initialisation des variables
TCP_IP = '192.168.0.15'
TCP_PORT = 5670
BUFFER_SIZE = 20
SON_CRIT = True
SON_WARN = True
# initialisation des ports
GPIO.setup(11, GPIO.OUT)
GPIO.setup(12, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
GPIO.output(11, True)
GPIO.output(12, True)
GPIO.output(13, True)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
print "Ecoute sur le port 5670"
# boucle principal
while 1:
conn, addr = s.accept()
# Affichages des information de connexion
print "connexion", addr
data = conn.recv(BUFFER_SIZE)
# Affichage des informations reçues
print "received data:", data
# traitement des information
if (data[5] == "1") or (data[16] == "2"):
print "affichage led rouge"
# réglage led
GPIO.output(11, True)
GPIO.output(12, True)
GPIO.output(13, False)
# alarme sonss critique
if SON_CRIT :
os.system("sudo aplay /home/pi/critical.wav")
SON_CRIT = False
elif data[16] == "1":
print "affichage led jaune"
# réglage led
GPIO.output(11, True)
GPIO.output(12, False)
GPIO.output(13, True)
# alarme son warning
if SON_WARN :
os.system("sudo aplay /home/pi/warning.wav")
SON_WARN = False
elif data[16] == "3":
GPIO.output(11, True)
GPIO.output(12, True)
GPIO.output(13, True)
print "affichage led verte clignotante"
# pas imprklémenter
else:
GPIO.output(11, False)
GPIO.output(12, True)
GPIO.output(13, True)
SON_CRIT = True
SON_WARN = True
print "affichage led verte"
conn.send(data)
conn.close()3 Montage du signal
Pour la connexion des leds à l'interface, j'utilise du matériel de récupération comme les connexions de lecteur CD d'ordinateur.

Ensuite, des briques Lego serviront à la fabrication du signal.
3 Vérifications et essais
Passons au fonctionnement, modifiez la configuration du crontab du serveur Centreon.
root@supervision:~# crontab -e
Rajoutez la ligne suivante.
* * * * * /root/sendcentreon.py >> /root/sendcentreon.log
Ensuite lançons la commande sur le RaspBerry
pi@raspberrypi:~$ sudo python recv_tcpip_led.py
Ecoute sur le port 5670
Au bout d'environ une minute, la LED verte s'affichera ainsi que les lignes suivantes sur le terminal.
connexion ('192.168.0.6', 55828)
received data: Host:0, Service:0
affichage led verteEt voici une petite vidéo expliquant le fonctionnement du signal pour Centreon.
