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 verte
Et voici une petite vidéo expliquant le fonctionnement du signal pour Centreon.