Vous êtes ici:

Menu

Stacks Image 33723
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…

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.

1.1 Schéma électronique


schema-electro
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.

Montage-CS01

Ensuite, des briques Lego serviront à la fabrication du signal.
Stacks Image 34190
Stacks Image 34193
Stacks Image 34196
Stacks Image 34320
Stacks Image 34324
Stacks Image 34328
Stacks Image 34467
Stacks Image 34471
Stacks Image 34475
Stacks Image 34614
Stacks Image 34618
Stacks Image 34622
Stacks Image 34908
Stacks Image 34912
Stacks Image 34916
Stacks Image 34761
Stacks Image 34765
Stacks Image 34769
Stacks Image 34956
Stacks Image 34969

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.
comments powered by Disqus
 Vous êtes ici: