TP 8 : OpenWrt – L'écosystème IoT et Edge

Module : 2 – Fondamentaux des API REST et de l’embarqué Durée indicative : 1h30 Prérequis : TP 5 à 7 terminés, un routeur ou VM OpenWrt accessible, pip install requests

Objectifs

  • Comprendre le fonctionnement du micro-bus système ubus.
  • Interroger et modifier la configuration réseau via JSON-RPC.
  • Comparer concrètement JSON-RPC et REST (vu dans les TP précédents).

Contexte

OpenWrt, très utilisé sur les équipements IoT et edge, n’expose pas d’API REST classique : toute l’administration passe par ubus, accessible en JSON-RPC via HTTP (ubus-rpcd/uhttpd).

Étape 1 – Activation de l’accès distant à ubus

Sur OpenWrt, vérifiez que uhttpd et le module ubus JSON-RPC sont actifs (/etc/config/uhttpd), et notez l’URL du point d’entrée (généralement http://<ip>/ubus).

Étape 2 – Authentification

ubus s’authentifie via la session session.login, qui retourne un ubus_rpc_session à réutiliser dans les appels suivants :

import requests

URL = "http://192.168.1.1/ubus"

def call(method, params, session="00000000000000000000000000000000"):
    payload = {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "call",
        "params": [session, *params]
    }
    resp = requests.post(URL, json=payload, timeout=5)
    resp.raise_for_status()
    return resp.json()

login = call("call", ["session", "login", {"username": "root", "password": "motdepasse"}])
session_id = login["result"][1]["ubus_rpc_session"]

Authentification ubus : session réutilisée Authentification ubus : session réutilisée Le token de session obtenu via session.login est réutilisé comme premier paramètre de chaque appel call suivant.

Étape 3 – Lecture de l’état des interfaces

status = call("call", ["network.interface", "status", {}], session=session_id)
print(status)

Identifiez dans la réponse JSON : adresses IP, état du lien, statistiques de trafic.

Étape 4 – Modification de la configuration réseau

Utilisez le service uci (via ubus) pour modifier une interface, par exemple changer l’adresse IP de l’interface lan :

call("call", ["uci", "set", {
    "config": "network",
    "section": "lan",
    "values": {"ipaddr": "192.168.2.1"}
}], session=session_id)

call("call", ["uci", "commit", {"config": "network"}], session=session_id)

Appliquez et vérifiez le changement (ifconfig ou nouvelle requête network.interface.status).

Étape 5 – Comparaison REST vs JSON-RPC

Rédigez une courte synthèse (10 lignes) comparant, à partir de votre expérience des TP 5 à 8 :

  • la structure des requêtes (URL + verbe HTTP vs méthode + paramètres),
  • la gestion de la session/authentification,
  • la lisibilité et la facilité de découverte de l’API (documentation, exploration).

Rendu attendu

  • Script(s) Python versionnés.
  • Captures des appels ubus (lecture et modification).
  • La synthèse comparative REST vs JSON-RPC.

Points de vérification

  • La session ubus est correctement obtenue et réutilisée.
  • La modification de configuration via uci est persistée après commit.
  • La synthèse comparative aborde bien les trois axes demandés.