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.
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 :
Il est temps d'installer ces utilitaires :
apt-get install curl jq
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.
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.
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.
Nous continuons par créer une ACL pour cet utilisateur. On lui ajoutera le minimum vital, à savoir, toutes les ressources et les actions simples.
Sélectionnez l'onglet Authorizations Information et ajouter All ressources et Simple User.
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.
-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.
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.
Si votre session est fermée, vous obtiendrez ce message
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","is_notify_contacts": false,"is_persistent_comment": true,"is_sticky": true}' -H 'X-AUTH-TOKEN:'09f4a92e8fbfc9f9f530771ac32d37a1'' -H "Content-Type: application/json" -X POST 'http://127.0.0.1/centreon/api/beta/monitoring/hosts/24/services/217/acknowledgements'
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
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. Ces scripts sont prévus pour le Python 3.
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"
python3 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 python3 # -*- 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. Modification du 10 janvier 2022, la requête de listage retourne par défaut les 10 premiers hôtes, j'ai modifié le script en conséquence.
#!/usr/bin/env python3 # -*- 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 pour retrouver le nombre total d'hôtes dans la balise meta r = requests.get('http://192.168.1.16/centreon/api/beta/monitoring/hosts',headers=headers) #nbre d'hôte total hote = r.json() nbhost = hote['meta']['total'] #calcul du nombre de page, par défaut le nbre d'hôte par page est de 10 nbpage = nbhost // 10 reste = nbhost % 10 if reste > 0 : nbpage = nbpage + 1 #lister les hôtes par page for i in range(1,nbpage+1) : r = requests.get('http://192.168.1.16/centreon/api/beta/monitoring/hosts?page=' + str(i) ,headers=headers) hote = r.json() for j in range(0,len(hote['result'])) : print (hote['result'][j]['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 python3 # -*- 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['is_notify_contacts'] = ACK_NOTIFY payload['is_persistent_comment'] = ACK_PERSISTENT payload['is_sticky'] = ACK_STICKY #requête acquitement r = requests.post('http://'+API_IP+'/centreon/api/beta/monitoring/hosts/'+str(ID_HOTE)+'/services/'+str(ID_SERVICE)+'/acknowledgements',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
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
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
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
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
La documentation officielle de Centreon https://documentation-fr.centreon.com/docs/centreon/en/latest/api/api_rest/index.html
Une présentation d'Open-IT https://fr.slideshare.net/docmatt/clapi-et-api-rest-sous-centreon-28
Une présentation d'Open-IT https://fr.slideshare.net/docmatt/clapi-et-api-rest-sous-centreon-28