Vous êtes ici:

Menu


Stacks Image 8983
L'API Rest est une fonctionnalité ajoutée depuis la version 2.7.x. Avec la version 19.10, l'API Rest est passée en version 2. Elle est un peu méconnue mais elle mérite que l'on s'y intéresse. Lors de l'Open Summit de 2017, j'avais eu besoin d'un requêteur simple et léger pour interroger l'état de mon serveur Centreon. Tout au long de cet article, nous allons voir comment utiliser l'API Rest en ligne de commande pour obtenir l'état de santé de notre infrastructure informatique.
Nous utiliserons mon OS préféré DEBIAN pour utiliser l'API Rest, le fonctionnement de l'API reste le même pour la distribution CentOS choisi pour l'ISO Centreon.
J'ai ajouté la version 2 ainsi que des nouveaux scripts sous Python. Nous découvrirons aussi Node-Red, un générateur de flux fonctionnant avec Nodejs très didactique.
Et je terminerai pas un grand merci à Laurent Calvet pour son aide à la compréhension des REST API avec Centreon.

1 Prérequis

Pour utiliser l'API Rest en ligne de commande, nous aurons besoin des utilitaires suivants : curl et jq. curl est un utilitaire destiné à récupérer des informations d'une ressource accessible grâce à une URL. Il peut être utilisé comme client REST, ce qui nous intéresse dans notre cas. jq est un utilitaire, à l'instar de sed, manipulant et transformant les données JSON.
Il est temps d'installer ces utilitaires :
apt-get install curl jq
Stacks Image 294399
jq pour l'ISO Centreon
le paquet jq n'est pas disponible par défaut, il faudra utiliser provisoirement le repo epel.
yum install epel-release -y
yum install jq -y
yum remove epel-release -y

Il est préférable d'enlever le dépôt epel pour éviter des problèmes de dépendances avec les dépôts Centreon lors des prochaines mises à jour.

2 Première utilisation

2.1 Authentification

2.1a Authentification admin

Maintenant, pour effectuer des requêtes avec l'API Rest, nous devons disposer des autorisations nécessaires. Cette autorisation sera paramètre au niveau des contacts Centreon. Dans un premier temps, nous devrons définir un mot de passe puis activer l'option Reach API. Pour mes tests, j'ai utilisé le contact admin mais je vous conseille d'utiliser un autre contact dans un environnement de production.
Stacks Image 294335

2.1b Authentification user

Dans un environnement de production, nous utiliserons un user spécifique conditionné par une ACL. Tout d'abord, créez votre utilisateur.
Stacks Image 294377
C'est le minimum vital pour créer un utilisateur, définissez un mot de passe. Dans l'onglet Centreon Authentication, activez les API pour le temps réel et/ou la configuration.
Stacks Image 294384
Nous continuons par créer une ACL pour cet utilisateur. On lui ajoutera le minimum vital, à savoir, toutes les ressources et les actions simples.
Stacks Image 294390
Sélectionnez l'onglet Authorizations Information et ajouter All ressources et Simple User.
Stacks Image 294387
Sauvegardez et votre user est prêt pour les REST Api Centreon.

2.2 Test d'authentification

2.2a Version 1

Pour utiliser les requêtes de l'API Rest, nous allons nous authentifier pour récupérer un jeton (Token). Celui-ci nous servira pour effectuer toutes les opérations de requêtes qui suivront. Ce Token a une durée de validité de l'orde d'une dizaine de minutes. Voici la commande pour obtenir ce jeton.
curl -s -d "username=admin&password=password" -H "Content-Type: application/x-www-form-urlencoded" -X POST http://127.0.0.1/centreon/api/index.php?action=authenticate
Description des paramètres
-s : mode silence; on n'affiche pas la progression des données
-d : on envoie des données avec la commande POST, dans notre cas l'identifiant du contact et son mot de passe
-H : on ajoute un Header à l'envoie des données
-X : méthode de la requête POST dans notre cas

Nous utilisons la boucle locale mais nous pourrions faire la commande à distance, pour cela il faut indiquer l'adresse IP du serveur Centreon.
Vous obtiendrez ce jeton comme ci-dessous :
{"authToken":"NWEwODhmODA1ZjllMDUuODA4MjAxNTY="}
Pour effectuer une requête, il faut récupérer le résultat situé à droite en enlevant les doubles-quotes.
Stacks Image 294368
Protéger votre token
Attention, le token peut comporter des suites de caractères spéciaux comme ceux-ci : {"authToken":"rSRl\/\/gAniKn5HDebToYgf19Q03RMZmVGl3J2z\/dx10="}. SI vous ne protégez pas votre token avec des simples quotes, vous aurez droit à un message d'erreur.
curl -s 'http://192.168.1.99/centreon/api/index.php?object=centreon_realtime_services&action=list&status=critical' -H 'Content-Type: application/json' -H 'centreon-auth-token: rSRl\/\/gAniKn5HDebToYgf19Q03RMZmVGl3J2z\/dx10='
"Forbidden"

En encadrant votre token de simple quote, vous éviterez ce problème.
curl -s 'http://192.168.1.99/centreon/api/index.php?object=centreon_realtime_services&action=list&status=critical' -H 'Content-Type: application/json' -H 'centreon-auth-token: 'rSRl\/\/gAniKn5HDebToYgf19Q03RMZmVGl3J2z\/dx10=''
[{"host_id":"91","name":"srv-mysql-01","description":"disk-\/usr","service_id":"590","state":"2","state_type":"1","output":"Disk \/usr - used : 152.87 Go - size : 158.00 Go - percent : 96 %\n","perfdata":"used=164145131639o;135720966554;152686087373;0;169651208192 size=169651208192o","max_check_attempts":"3","check_attempt":"3","last_check":"1563179799","last_state_change":"1563177879","last_hard_state_change":"1563177999","acknowledged":"0","criticality":null},{"host_id":"34","name":"mbi1904","description":"DWH-db-content","service_id":"310","state":"2","state_type":"1","output":"[Table mod_bi_hgmonthavailability: EMPTY] [Table mod_bi_hgservicemonthavailability: EMPTY] [Table mod_bi_metricmonthcapacity: EMPTY] [Table mod_bi_metriccentiledailyvalue: EMPTY]\n","perfdata":"","max_check_attempts":"3","check_attempt":"3","last_check":"1563172116","last_state_change":"1563084698","last_hard_state_change":"1563084698","acknowledged":"1","criticality":null}]

2.2a Version 2

Pour utiliser les requêtes de l'API Rest V2, nous allons nous authentifier d'une autre façon pour récupérer le jeton (Token).
curl -s -d '{"security": {"credentials": {"login": "admin","password": "password"}}}' -H "Content-Type: application/json" -X POST http://127.0.0.1/centreon/api/beta/login
Vous obtiendrez le résultat ci-dessous au format json :
{"contact":{"id":1,"name":"admin admin","alias":"admin","email":"admin@localhost","is_admin":true},"security":{"token":"6e1dc013af7be0b112b248218e37c0a8"}}
Avec la version V2, vous pouvez aussi tester l'API avec une session ouverte sur l'iHM de Centreon car c'est la session PHP qui vous authentifie.
Stacks Image 294517
Si votre session est fermée, vous obtiendrez ce message
Stacks Image 294522

2.3 Première requête

2.3a Version 1

Nous allons utiliser ce jeton pour effectuer notre première requête sur les informations temps réel de notre supervision. Nous allons récupérer, par exemple, tous les services en état critique de notre infrastructure. Pour obtenir les services en état critique, il faut ajouter le paramètre status égal à critical dans l'URL.
curl -s 'http://192.168.0.250/centreon/api/index.php?object=centreon_realtime_services&action=list&status=critical' -H 'Content-Type: application/json' -H 'centreon-auth-token: 'NWEwODhmODA1ZjllMDUuODA4MjAxNTY=''
Nous aurons le résultat suivant :
[{"host_id":"21","name":"vmitop","description":"MySQL_qcache-hitrate","service_id":"93","state":"2","state_type":"1","output":"CRITICAL: query cache hitrate at 0.00%","perfdata":"'qcache_hitrate'=0.00%;40:;20:;0; 'qcache_hitrate_now'=100.00%;;;0;","max_check_attempts":"3","check_attempt":"3","last_check":"1510511092","last_state_change":"1510081625","last_hard_state_change":"1510081985","acknowledged":"1","criticality":"1"},{"host_id":"14","name":"Centreon-Server","description":"version_plugin_old","service_id":"380","state":"2","state_type":"1","output":"CRITICAL - Ver. Centreon 20160524  Ver. Git 20171013, The plugin must be updated","perfdata":"","max_check_attempts":"3","check_attempt":"3","last_check":"1510468293","last_state_change":"1510079517","last_hard_state_change":"1510079517","acknowledged":"1","criticality":""}]
C'est assez brut de fonderie et pas très lisible. Ce qui m'intéresse, c'est le nombre de service qui est en état critique. Nous utiliserons l'utilitaire jq pour cela.
curl -s 'http://192.168.0.250/centreon/api/index.php?object=centreon_realtime_services&action=list&status=critical' -H 'Content-Type: application/json' -H 'centreon-auth-token: 'NWEwODhmODA1ZjllMDUuODA4MjAxNTY='' | jq 'length'
Nous aurons le résultat suivant :
2
Si vous voulez les services critiques non-acquités, il faudra utiliser le paramètre viewType comme ceci :
curl -s 'http://192.168.0.250/centreon/api/index.php?object=centreon_realtime_services&action=list&status=critical&viewType=unhandled' -H 'Content-Type: application/json' -H 'centreon-auth-token: 'NWEwODkyNWEwM2Y4YjQuODA2MTQxNDQ='' | jq 'length'

2.3b Version 2

Avec la version 2, la syntaxe sera la suivante (2 correspond à Critical) :
curl -s -H 'X-AUTH-TOKEN:'09f4a92e8fbfc9f9f530771ac32d37a1'' -H "Content-Type: application/json" -X GET 'http://127.0.0.1/centreon/api/beta/monitoring/services?search=\{"service.state":"2"\}'
Nous aurons le résultat suivant :
{"result":[{"id":188,"check_attempt":1,"description":"Ping","display_name":"Ping","host":{"id":24,"name":"serveur","alias":"serveur centreon","display_name":"serveur","state":1},"icon_image":"","icon_image_alt":"","last_check":"2019-12-09T16:06:59+01:00","last_state_change":"2019-12-09T14:06:52+01:00","max_check_attempts":3,"output":"CRITICAL - 192.167.2.2: rta nan, lost 100%\n","state":2,"state_type":1}],"meta":{"page":1,"limit":10,"search":{"$and":{"service.state":"2"}},"sort_by":{},"total":1}}
Quelques conseils : Protéger les accolades et encadrez de simples quotes l'URL. le résultat diffère de la version 1 avec les informations meta donnant des informations supplémentaires sur la requête.

2.3c Acquittement avec l'API V2

Une autre possibilité avec l'API V2 est d'acquitter un hôte ou un service. Voici la commande avec comme recherche les services non-acquittés (valeur 0) et en état critique (valeur 2) :
curl -s -H 'X-AUTH-TOKEN:'09f4a92e8fbfc9f9f530771ac32d37a1'' -H "Content-Type: application/json" -X GET 'http://127.0.0.1/centreon/api/beta/monitoring/services?search=\{"service.state":"2","service.is_acknowledged":"0"\}'
Résultat (le service ping en état critique):
{"result":[{"id":188,"check_attempt":1,"description":"Ping","display_name":"Ping","host":{"id":24,"name":"serveur","alias":"serveur centreon","display_name":"serveur","state":1},"icon_image":"","icon_image_alt":"","last_check":"2019-12-09T17:01:59+01:00","last_state_change":"2019-12-09T14:06:52+01:00","max_check_attempts":3,"output":"CRITICAL - 192.167.2.2: rta nan, lost 100%\n","state":2,"state_type":1}],"meta":{"page":1,"limit":10,"search":{"$and":{"service.state":"2","service.is_acknowledged":"0"}},"sort_by":{},"total":1}}
Nous allons acquitter ce service avec cette commande en récupérant les ID host (24) et service (188) :
curl -s -d '{"comment": "acquittement par API","host_id": 24,"is_notify_contacts": false,"is_persistent_comment": true,"is_sticky": true,"service_id": 188}' -H 'X-AUTH-TOKEN:'09f4a92e8fbfc9f9f530771ac32d37a1'' -H "Content-Type: application/json" -X POST 'http://127.0.0.1/centreon/api/beta/acknowledgements/services'
Nous pouvons vérifier avec la commande précédente que notre service est acquitté.
curl -s -H 'X-AUTH-TOKEN:'09f4a92e8fbfc9f9f530771ac32d37a1'' -H "Content-Type: application/json" -X GET 'http://127.0.0.1/centreon/api/beta/monitoring/services?search=\{"service.state":"2","service.is_acknowledged":"0"\}'
{"result":[],"meta":{"page":1,"limit":10,"search":{"$and":{"service.state":"2","service.is_acknowledged":"0"}},"sort_by":{},"total":0}}

2.4 Déconnexion

Avec l'API V2, il est possible de se déconnecter et de supprimer le token.
curl -s -H 'X-AUTH-TOKEN:'34669bbc758c1209c8ef42370cef2a22'' -H "Content-Type: application/json" -X GET http://127.0.0.1/centreon/api/beta/logout
{"message":"Successful logout"}

3 Script etat_monitoring

3.1 Authentification

Passons à un exercice pratique. Nous allons créer un petit script utilisant l'API Rest en bash pour récupérer les états des hosts et des services. Commençons par la récupération du jeton (token).
#!/bin/bash
# etat_monitoring.sh
# version 1.00
# date 12/11/2017

CURL="/usr/bin/curl"
JQ="/usr/bin/jq"
SED="/bin/sed"

IP_CENTREON="192.168.0.250"
USER="admin"
PASSWORD="password"

TOKEN=`$CURL -s -d "username=$USER&password=$PASSWORD" -H "Content-Type: application/x-www-form-urlencoded" -X POST http://$IP_CENTREON/centreon/api/index.php?action=authenticate | $JQ '.["authToken"]'| $SED -e 's/^"//' -e 's/"$//'`

echo $TOKEN
Modifiez les droits du fichier pour le rendre exécutable.
chmod +x etat_monitoring.sh
Lancez la commande, vous devriez afficher un jeton comme ci-dessous :
root@debkvm:/home/vmdebian# ./etat_monitoring.sh
NWEwOGFiMjQyNjAxZjMuMDUxNjMwNzE=

3.2 les requêtes

Maintenant que nous avons notre jeton, nous allons construire nos requêtes pour les hosts puis pour les services. Ajoutons ces lignes à notre script et supprimons la ligne echo $TOKEN.
NB_HOST=`$CURL -s "http://$IP_CENTREON/centreon/api/index.php?object=centreon_realtime_hosts&action=list&viewType=unhandled&status=down" -H 'Content-Type: application/json' -H 'centreon-auth-token: '$TOKEN'' | $JQ 'length'`

NB_SERVICE=`$CURL -s "http://$IP_CENTREON/centreon/api/index.php?object=centreon_realtime_services&action=list&viewType=unhandled&status=critical" -H 'Content-Type: application/json' -H 'centreon-auth-token: '$TOKEN'' | $JQ 'length'`

echo "Critical hosts    : "$NB_HOST
echo "Critical services : "$NB_SERVICE
Pour obtenir les états non acquittés, nous utiliserons le paramètre viewType à unhandled. Attention par défaut, comme sur la vue temps réel, le nombre d'objets est limité à 30. Pour augmenter cette limite, il faudra utiliser le paramètre limit. Exemple de l'utilisation du script :
root@debkvm:/home/vmdebian# ./etat_monitoring.sh
Critical hosts : 1
Critical services : 1
Stacks Image 294364
Notre exemple en image
Nous avons vu un bref aperçu de l'API Rest, il existe encore bien d'autres possibilités comme l'utilisation de CLAPI dans l'API Rest.

4 Utilisation du langage Python

Voici deux exemples pour utiliser les API REST de Centreon avec Python. Le premier exemple avec la version 1 et le deuxième avec la version 2.
Stacks Image 294435
ImportError: No module named requests pour l'ISO Centreon
Il faut installer le module requests manquant sur l'ISO Centreon. Voici la procédure pour l'installation de ce module.
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py
pip install requests

4.1 Version 1

Voici le premier script permettant de lister les hôtes. Le language Python manipule le Json sans trop de difficulté.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests

# données authentification
payload = {'username': 'admin', 'password': 'password'}

#requête authentification
r = requests.post('http://127.0.0.1/centreon/api/index.php?action=authenticate', data=payload)

#on récupère le token
json = r.json()

#initialisation du header pour le token
headers = dict()
headers['centreon-auth-token'] = json['authToken']

#requête liste des hôtes
r = requests.get('http://127.0.0.1/centreon/api/index.php?object=centreon_realtime_hosts&action=list',headers=headers)

#résultat
print r.text

#résultat partiel
hote = r.json()

print "Le premier hote est " + hote[0]['name']
Et voici le résultat de l'exécution du script. La première ligne affiche la liste des hôte aux nombre de deux et la deuxième ligne affiche le nom du premier hôte.
./request.py
[{"id":"1","name":"Central","alias":"serveur centreon","address":"127.0.0.1","state":"0","state_type":"1","output":"OK - 127.0.0.1 rta 0,107ms lost 0%\n","max_check_attempts":"3","check_attempt":"1","last_check":"1575904454","last_state_change":"1574167828","last_hard_state_change":"1574167828","acknowledged":"0","instance_name":"Central","criticality":null},{"id":"24","name":"serveur","alias":"serveur centreon","address":"192.167.2.2","state":"1","state_type":"1","output":"CRITICAL - 192.167.2.2: rta nan, lost 100%\n","max_check_attempts":"3","check_attempt":"1","last_check":"1575904639","last_state_change":"1575896714","last_hard_state_change":"1575896729","acknowledged":"0","instance_name":"Central","criticality":null}]
Le premier hote est Central

4.2 Version 2

Ce premier script nous permettra de lister tous les hôtes.
#!/usr/bin/env python
# -*- coding:Utf-8 -*-

import requests
import json

# données authentification
payload = {'security': {'credentials': {'login': 'admin', 'password': 'password'}}}
headers = {'content-type': 'application/json'}
#requête authentification
r = requests.post('http://192.168.1.16/centreon/api/beta/login', data=json.dumps(payload), headers=headers)


#on récupère le token
json = r.json()


#initialisation du header pour le token
headers = dict()
headers['X-AUTH-TOKEN'] = json['security']['token']

#requête liste des hôtes
r = requests.get('http://192.168.1.16/centreon/api/beta/monitoring/hosts',headers=headers)

#résultat
print r.text

#résultat partiel
hote = r.json()


print hote['result'][0]['name']

Ce deuxième script nous permettra d'acquitter un hôte. Les nombreuses options vous permettra de réaliser simplement votre acquittement.
#!/usr/bin/env python
# -*- coding:Utf-8 -*-

# script send_ack.py

import requests
import json
from optparse import OptionParser

# initialisation des variables
API_IP = '127.0.0.1'
API_USER = 'admin'
API_PWD = 'centreon'
REC_HOST = ''
REC_SERVICE = ''
ACK_COMMENT = 'ack for API'
ACK_NOTIFY = False
ACK_STICKY = True
ACK_PERSISTENT = True


# définitions des options
options = {}
options[('-u','--user')] = {'dest':'user',
                              'help':'username'}
options[('-p','--password')] = {'dest':'password',
                              'help':'password'}
options[('-i','--ip')] = {'dest':'ip',
                              'help':'centreon ip'}
options[('-H','--host')] = {'dest':'host',
                              'help':'search host'}
options[('-s','--service')] = {'dest':'service',
                              'help':'search service'}
options[('-c','--comment')] = {'dest':'comment',
                              'help':'comment ack'}
options[('-n','--notify')] = {'dest':'notify',
                              'help':'notify ack'}
options[('-S','--sticky')] = {'dest':'sticky',
                              'help':'sticky ack'}
options[('-P','--persistent')] = {'dest':'persistent',
                              'help':'persistent ack'}

def str2bool(v):
  return v.lower() in ("yes", "true", "t", "1")

# affichage des options
def main(options, arguments):
    print('options %s' % options)
    print('arguments %s' % arguments)
 
# récupérations des options
if __name__ == '__main__':
   parser = OptionParser()
   for param, option in options.items():
     parser.add_option(*param, **option)
   options, arguments = parser.parse_args()
    
if options.ip is not None: 
  API_IP = options.ip

if options.user is not None: 
  API_USER = options.user
  
if options.password is not None: 
  API_PWD = options.password
  
if options.host is not None: 
  REC_HOST = options.host

if options.service is not None: 
  REC_SERVICE = options.service

if options.comment is not None: 
  ACK_COMMENT = options.comment
  
if options.notify is not None: 
  ACK_NOTIFY = str2bool(options.notify)
  
if options.persistent is not None: 
  ACK_PERSISTENT = str2bool(options.persistent)

if options.sticky is not None: 
  ACK_STICKY = str2bool(options.sticky)


# données authentification
payload = '{"security": {"credentials": {"login": "'+API_USER+'", "password": "'+API_PWD+'"}}}'
headers = {'content-type': 'application/json'}

#requête authentification
r = requests.post('http://'+API_IP+'/centreon/api/beta/login', data=payload, headers=headers)

#on récupère le token
json = r.json()


#initialisation du header pour le token
headers = dict()
headers['X-AUTH-TOKEN'] = json['security']['token']
payload='{"service.description":"'+REC_SERVICE+'","host.name":"'+REC_HOST+'"}'

#requête liste les services
r = requests.get('http://'+API_IP+'/centreon/api/beta/monitoring/services?search='+payload,headers=headers)

#recupération id
data = r.json()
ID_SERVICE=data['result'][0]['id']
ID_HOTE=data['result'][0]['host']['id']

payload = dict()
payload['comment'] = ACK_COMMENT
payload['host_id'] = ID_HOTE
payload['is_notify_contacts'] = ACK_NOTIFY
payload['is_persistent_comment'] = ACK_PERSISTENT
payload['is_sticky'] = ACK_STICKY
payload['service_id'] = ID_SERVICE


#requête acquitement
r = requests.post('http://'+API_IP+'/centreon/api/beta/acknowledgements/services',json=payload,headers=headers)

Voici les options du script :
./send_ack.py -h
Usage: send_ack.py [options]

Options:
  -h, --help            show this help message and exit
  -c COMMENT, --comment=COMMENT
                        comment ack
  -p PASSWORD, --password=PASSWORD
                        password
  -H HOST, --host=HOST  search host
  -P PERSISTENT, --persistent=PERSISTENT
                        persistent ack
  -n NOTIFY, --notify=NOTIFY
                        notify ack
  -i IP, --ip=IP        centreon ip
  -S STICKY, --sticky=STICKY
                        sticky ack
  -u USER, --user=USER  username
  -s SERVICE, --service=SERVICE
                        search service
Et un exemple d'acquittement
./send_ack.py -u admin -p password -i 192.168.1.16 -c "test acquittement" -H Central -s proc-ntpd
Stacks Image 294539
L'acquittement a été réalisé

5 Et si on utilisait Node-Red ?

Dernièrement, j'ai découvert node-red avec le raspberry PI 4. J'ai trouvé ce programme tournant sous nodejs très sympathique. Son côté visuel pour réaliser des flux m'a séduit. Je vous propose une petite démonstration avec les API Centreon. Vous avez la possibilité d'installer ce programme très facilement sur une Debian, comme ceci :
apt-get install nodejs-legacy
apt-get install npm
npm install -g --unsafe-perm node-red node-red-admin
ensuite on peut lancer directement node-red
node-red
Et l'on se connecte sur l'interface Web avec l'adresse IP http://<IP serveur node-red>:1880
Stacks Image 294488
L'interface graphique node-red
Je ne vais pas vous faire un cours sur Node-red, mais je vais vous fournir le code des flux pour les API V1 et V2 de Centreon.

5.1 Version 1

Voici la présentation du flux Rest-API V1
Stacks Image 294497
le flux pour l'API V1
Et voici le code que vous pouvez aisément importer sur Node-red.
[{"id":"429bf07c.25504","type":"tab","label":"API V1 Centreon","disabled":false,"info":""},{"id":"304fab7f.7d3e2c","type":"inject","z":"429bf07c.25504","name":"API V1 Centreon","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":"","x":140,"y":40,"wires":[["702be121.a88c4"]]},{"id":"63130070.b62a8","type":"http request","z":"429bf07c.25504","name":"Authentication","method":"POST","ret":"txt","paytoqs":false,"url":"http://127.0.0.1/centreon/api/index.php?action=authenticate","tls":"","persist":false,"proxy":"","authType":"","x":140,"y":120,"wires":[["d851b061.71d33","cc1e88ba.b8c47"]]},{"id":"702be121.a88c4","type":"function","z":"429bf07c.25504","name":"set payload and headers","func":"msg.payload = { username: \"userapi\", password: \"centreon\" };\nmsg.headers = {'content-type':'application/x-www-form-urlencoded'};\n\nreturn msg;","outputs":1,"noerr":0,"x":370,"y":40,"wires":[["63130070.b62a8"]]},{"id":"d851b061.71d33","type":"debug","z":"429bf07c.25504","name":"Show response","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":420,"y":120,"wires":[]},{"id":"71b9a9d8.8124f","type":"debug","z":"429bf07c.25504","name":"Show Error Authentication","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"statusCode","targetType":"msg","x":400,"y":240,"wires":[]},{"id":"cc1e88ba.b8c47","type":"switch","z":"429bf07c.25504","name":"ifTokenReceived","property":"statusCode","propertyType":"msg","rules":[{"t":"eq","v":"200","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":150,"y":200,"wires":[["de5bc3b.bd55f4"],["71b9a9d8.8124f"]]},{"id":"29c79af1.422f76","type":"debug","z":"429bf07c.25504","name":"Show Error Request","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"statusCode","targetType":"msg","x":380,"y":580,"wires":[]},{"id":"de5bc3b.bd55f4","type":"function","z":"429bf07c.25504","name":"Extract Token","func":"var words = msg.payload.split(\":\");\nwords[1] = words[1].substring(1);\nvar longueur = words[1].length - 2\nwords[1] = words[1].substring(0,longueur);\nmsg.payload = words[1];\nreturn msg;","outputs":1,"noerr":0,"x":620,"y":200,"wires":[["c1d6e9a9.fe85b"]]},{"id":"c1d6e9a9.fe85b","type":"function","z":"429bf07c.25504","name":"Remove Backslash and set headers","func":"var regex = /\\\\/gi;\nvar token = msg.payload.replace (regex, \"\");\nmsg.method = \"GET\";\nmsg.headers = {};\nmsg.headers['centreon-auth-token'] = token;\nmsg.headers['Content-Type'] = 'application/json';\nreturn msg;","outputs":1,"noerr":0,"x":230,"y":360,"wires":[["ae88826e.2cdb9"]]},{"id":"ae88826e.2cdb9","type":"http request","z":"429bf07c.25504","name":"Request API service list","method":"use","ret":"obj","paytoqs":false,"url":"http://127.0.0.1/centreon/api/index.php?object=centreon_realtime_services&action=list","tls":"","persist":false,"proxy":"","authType":"","x":570,"y":360,"wires":[["34d17f5.64edf8"]]},{"id":"34d17f5.64edf8","type":"switch","z":"429bf07c.25504","name":"check status","property":"statusCode","propertyType":"msg","rules":[{"t":"eq","v":"200","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":180,"y":480,"wires":[["d33ffd97.02727"],["29c79af1.422f76"]]},{"id":"ab69666.7dd4698","type":"debug","z":"429bf07c.25504","name":"Results","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":700,"y":480,"wires":[]},{"id":"d33ffd97.02727","type":"json","z":"429bf07c.25504","name":"Convert Json To String","property":"payload","action":"","pretty":false,"x":450,"y":480,"wires":[["ab69666.7dd4698"]]}]

5.2 Version 2

Voici la présentation du flux Rest-API V2
Stacks Image 294508
le flux pour l'API V2
Et voici le code que vous pouvez aisément importer sur Node-red.
[{"id":"1fb288ae.6d2987","type":"tab","label":"API V2 Centreon","disabled":false,"info":""},{"id":"a541a232.3b45b8","type":"inject","z":"1fb288ae.6d2987","name":"API V2 Centreon","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":140,"y":60,"wires":[["4a5501d.d682a"]]},{"id":"4a5501d.d682a","type":"function","z":"1fb288ae.6d2987","name":"set payload and headers","func":"msg.payload = {\"security\": {\"credentials\": {\"login\": \"admin\",\"password\": \"password\"}}};\nmsg.headers = {};\nmsg.headers['Content-Type'] = 'application/json';\nreturn msg;","outputs":1,"noerr":0,"x":410,"y":60,"wires":[["554bf042.7f95a8","ca0bd525.4801b8"]]},{"id":"554bf042.7f95a8","type":"http request","z":"1fb288ae.6d2987","name":"Authentication","method":"POST","ret":"txt","paytoqs":false,"url":"http://192.168.1.16/centreon/api/beta/login","tls":"","persist":false,"proxy":"","authType":"","x":140,"y":140,"wires":[["d384fa3e.59c2c8","25dca1ae.7bbece"]]},{"id":"d384fa3e.59c2c8","type":"switch","z":"1fb288ae.6d2987","name":"ifTokenReceived","property":"statusCode","propertyType":"msg","rules":[{"t":"eq","v":"200","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":150,"y":240,"wires":[["cf597599.d4cf1"],["449f8844.736998"]]},{"id":"25dca1ae.7bbece","type":"debug","z":"1fb288ae.6d2987","name":"Show response","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":430,"y":140,"wires":[]},{"id":"449f8844.736998","type":"debug","z":"1fb288ae.6d2987","name":"Show error Authentication","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"statusCode","targetType":"msg","x":420,"y":260,"wires":[]},{"id":"cf597599.d4cf1","type":"json","z":"1fb288ae.6d2987","name":"Convert json","property":"payload","action":"","pretty":false,"x":650,"y":220,"wires":[["327109cc.4152ee"]]},{"id":"327109cc.4152ee","type":"function","z":"1fb288ae.6d2987","name":"set paylod and headers","func":"var token = msg.payload.security.token;\nmsg.method = \"GET\";\nmsg.headers = {};\nmsg.headers['X-AUTH-TOKEN'] = token;\nmsg.headers['Content-Type'] = 'application/json';\nreturn msg;","outputs":1,"noerr":0,"x":170,"y":400,"wires":[["cd42e6cb.5f96b"]]},{"id":"cd42e6cb.5f96b","type":"http request","z":"1fb288ae.6d2987","name":"Request API hosts list","method":"use","ret":"obj","paytoqs":false,"url":"http://192.168.1.16/centreon/api/beta/monitoring/hosts","tls":"","persist":false,"proxy":"","authType":"","x":470,"y":400,"wires":[["37c655ea.a7b242"]]},{"id":"37c655ea.a7b242","type":"switch","z":"1fb288ae.6d2987","name":"check status","property":"statusCode","propertyType":"msg","rules":[{"t":"eq","v":"200","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":180,"y":520,"wires":[["354180fa.b64e48"],["7ae0d03e.592ac"]]},{"id":"7ae0d03e.592ac","type":"debug","z":"1fb288ae.6d2987","name":"Show Error Request","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"statusCode","targetType":"msg","x":460,"y":560,"wires":[]},{"id":"a0a97679.3f91a","type":"debug","z":"1fb288ae.6d2987","name":"Results","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":700,"y":480,"wires":[]},{"id":"354180fa.b64e48","type":"json","z":"1fb288ae.6d2987","name":"Convert Json to String","property":"payload","action":"","pretty":false,"x":460,"y":500,"wires":[["a0a97679.3f91a"]]},{"id":"ca0bd525.4801b8","type":"debug","z":"1fb288ae.6d2987","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":720,"y":80,"wires":[]}]

6 Pour aller plus loin

comments powered by Disqus
 Vous êtes ici: