D API du cockpit

Les 13 routes servies par la passerelle elle-même : ce qu'elles font, ce qu'elles exigent, ce qu'elles répondent. Page vérifiée contre le flux le 2026-09-23.
Une seule API, deux portes

Les 13 routes sont servies à l'identique sur les deux ports (8888 et 8889). Ce n'est pas le port qui décide de ce qui est permis, mais le rôle du compte avec lequel on s'est connecté.

Conséquence à connaître : un compte « opérateur » n'est pas un accès en lecture seule. Il peut modifier la configuration d'une balise, en déclarer une nouvelle et envoyer un réglage. Seule l'écriture des variables globales lui est refusée.

Authentification

Deux couches, avec les mêmes identifiants. Le serveur HTTP demande d'abord une authentification au navigateur. Ensuite, POST /cockpit/login ouvre une session applicative et renvoie un jeton, valable huit heures, à placer dans l'en-tête X-Session de chaque appel suivant.

jeton=$(curl -s -u <compte>:<mot de passe> \
  -X POST http://<passerelle>:8888/cockpit/login \
  -H 'Content-Type: application/json' \
  -d '{"user":"<compte>","password":"<mot de passe>"}' \
  | sed -n 's/.*"token":"\([^"]*\)".*/\1/p')

curl -s -u <compte>:<mot de passe> -H "X-Session: $jeton" \
  http://<passerelle>:8888/cockpit/health

Routes

RouteAccèsObjetRéponsesTraitée par
GET /publicLa page du cockpit.200fichier servi tel quel
GET /app.jspublicLe code de l'interface.200fichier servi tel quel
POST /cockpit/balisesession requiseDéclare une nouvelle balise. Le corps porte name, deveui et appkey. Répond 202 : la déclaration est lancée, pas terminée — elle réécrit le flux et redémarre toutes les chaînes. Plusieurs garde-fous peuvent la refuser ; le message dit lequel.202, 400, 401post_balise
GET /cockpit/balisessession requiseÉtat de chaque balise : dernière trame, compteurs, qualité radio, réglage en cours, historique récent et compteurs horaires sur 24 h.200, 401cockpit_balises
POST /cockpit/downlinksession requiseMet un réglage ou un redémarrage en file pour une balise. La commande part au prochain réveil de celle-ci.200, 202, 401cockpit_downlink
GET /cockpit/globalssession requiseVariables globales. Les secrets ne sont jamais renvoyés en clair : ils apparaissent masqués.200, 401cockpit_globals
POST /cockpit/globalsrôle adminÉcrit les variables globales. Seule route réservée au rôle admin. Seules les clés d'une liste blanche sont acceptées ; les autres sont ignorées. Un champ secret laissé vide conserve la valeur en place.400, 401, 403post_globals_stash
GET /cockpit/healthpublicÉtat général : temps de fonctionnement, réception radio, santé des envois vers IoBase et Asystom, authentification, liaison cellulaire, et les environnements IoBase déclarés. C'est ce que lit le tableau de bord.200fichier servi tel quel
POST /cockpit/loginouverteOuvre une session. Le corps porte user et password ; la réponse renvoie un jeton et le rôle associé. Ce jeton se place ensuite dans l'en-tête X-Session de tous les autres appels.200, 401cockpit_login
GET /cockpit/metapublicConfiguration des balises, telle qu'elle est stockée sur la passerelle.200fichier servi tel quel
POST /cockpit/metasession requiseÉcrit la configuration des balises. Le corps porte l'ensemble des balises, pas seulement celle qu'on modifie : envoyer un objet partiel effacerait les autres. Chaque champ est validé, et une destination inconnue est refusée plutôt que ramenée au défaut.200, 400, 401post_meta
GET /cockpit/whoamisession requiseRôle de la session en cours. Sert à l'interface pour décider ce qu'elle affiche.200, 401whoami_session
GET /style.csspublicLa feuille de style de l'interface.200fichier servi tel quel

Codes de réponse

CodeSignification
200Succès.
202Demande acceptée, traitement lancé — le résultat n'est pas encore connu.
400Requête refusée : contenu invalide, ou garde-fou déclenché. Le corps donne le motif.
401Session absente, invalide ou expirée. Se reconnecter.
403Session valide mais rôle insuffisant.