#!/bin/bash
# Wrapper sudoers de l'agent AirLink : (re)démarre ou ARRÊTE UN canal wds-transmit, nom validé
# strictement (sudo >= 1.9.10 interdit les jokers d'arguments dans sudoers — la validation est
# donc ICI, et elle est la seule barrière : sudoers autorise le script, pas ses arguments).
#
# ⚠ Ce wrapper est un organe STABLE : il ne voyage PAS dans les archives de release signées
# (même doctrine qu'apply.sh). La raison est précise, et elle vaut d'être comprise : le sudoers
# autorise `wds` à lancer CE FICHIER en root, donc c'est son CONTENU qui décide de ce que root
# peut faire. S'il voyageait dans le payload, la clé de release deviendrait équivalente à root
# sur tout le parc — un binaire réécrirait sa propre porte.
#
# 🔴 MAIS cette doctrine n'a de sens que si le wrapper n'a JAMAIS besoin d'évoluer — sinon chaque
# nouvelle famille de canal impose un geste root, boîtier par boîtier, chez le client. C'est
# exactement ce qui est arrivé le 2026-08-08 (arrivée des caméras réseau `net-<CODE>`) puis le
# 2026-08-09 (le geste, posé dans un `/usr/local/bin` volatile, a disparu au reboot et les 3
# OBSBOT d'airlink-1 ont cessé de publier).
#
# ⭐ La cause n'était pas la doctrine, c'était CE FICHIER : il encodait un CATALOGUE PRODUIT
# (`cam1-4`, puis `net-*`) au lieu d'une PROPRIÉTÉ DE SÛRETÉ. Il n'exprime donc plus qu'elle :
#
#   « `wds` peut redémarrer ou arrêter UNE instance du template wds-transmit@, et rien d'autre. »
#
# Le template est FIXE (c'est lui la garantie) et le nom d'instance est réduit à un jeu de
# caractères qui ne peut ni s'échapper vers un autre nom d'unité, ni traverser un chemin (ni `/`,
# ni `.`, donc ni `..`). Toute famille de canaux future — USB, réseau, ce qui viendra — est déjà
# couverte : plus aucune évolution à déployer.
#
# ⚠ Et ce n'est PAS un élargissement de privilège : `/etc/wds-transmit` est déjà `root:wds 2775`
# (l'agent y crée ses `.env`), donc il pouvait déjà définir un canal arbitraire. La barrière utile
# a toujours été « uniquement start/stop, uniquement sur ce template » — c'est elle qu'on garde.
set -euo pipefail
[[ "${1:-}" =~ ^[A-Za-z0-9_-]{1,64}$ ]] || { echo "canal invalide: ${1:-}" >&2; exit 2; }
case "${2:-restart}" in
  restart) exec systemctl restart "wds-transmit@$1" ;;
  # `stop` sert au RELÂCHEMENT d'une caméra réseau : sans lui, une caméra retirée du projet
  # continuerait d'être tirée et publiée par un canal que plus personne ne réclame.
  stop)    exec systemctl stop    "wds-transmit@$1" ;;
  *)       echo "action invalide: ${2}" >&2; exit 2 ;;
esac
