diff --git a/tools/qualifier-borne.sh b/tools/qualifier-borne.sh new file mode 100755 index 0000000..f59a5b8 --- /dev/null +++ b/tools/qualifier-borne.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +# qualifier-borne.sh — squelette de qualification d'un plugin de borne sur banc. +# +# Suit le journal nymead et n'imprime que les TRANSITIONS : les événements de +# branchement vus par le moteur, et les traces du plugin qualifié. Horodate +# chaque ligne pour qu'on puisse mesurer les écarts (délai de confirmation d'un +# débranchement, durée d'un faux positif, latence d'une consigne). +# +# Il ne conclut rien : il rend le cycle LISIBLE. Les trois questions auxquelles +# il sert à répondre sont dans AGENTS.md § QUALIFIER UN PLUGIN DE BORNE. +# +# ./qualifier-borne.sh [utilisateur] +# ./qualifier-borne.sh 10.0.0.12 V2C +# ./qualifier-borne.sh 10.0.0.12 Keba admin +# +# La catégorie est celle du Q_LOGGING_CATEGORY du plugin (« V2C », « Keba »…) ; +# elle doit être activée côté box, sinon les traces du plugin n'existent pas : +# Environment="QT_LOGGING_RULES=.debug=true" +# dans un drop-in systemd de nymead, puis daemon-reload + restart. +# +# Aucune adresse n'est codée en dur : cf. AGENTS.md § Miroir public. +set -uo pipefail + +HOTE="${1:-}" +CATEGORIE="${2:-}" +UTILISATEUR="${3:-etm}" + +if [ -z "$HOTE" ] || [ -z "$CATEGORIE" ]; then + sed -n '2,20p' "$0" + exit 2 +fi + +SSH=(ssh -o BatchMode=yes -o ConnectTimeout=10 -o ServerAliveInterval=30 + "${UTILISATEUR}@${HOTE}") + +# Garde-fou : sans la catégorie activée, le script tournerait en silence et on +# conclurait à tort « la borne ne fait rien ». Mieux vaut refuser tout de suite. +if ! "${SSH[@]}" 'systemctl show nymead -p Environment --value' \ + | grep -q "${CATEGORIE}.debug=true"; then + echo "!! ${CATEGORIE}.debug n'est PAS actif sur ${HOTE}." >&2 + echo " Les traces du plugin ne seront pas journalisées — activer la" >&2 + echo " catégorie dans un drop-in systemd de nymead, puis relancer." >&2 + exit 1 +fi + +echo "=== qualification : ${CATEGORIE} sur ${HOTE} — Ctrl-C pour arrêter ===" +echo " cycle à jouer : brancher → charger → ARRÊTER LA CHARGE (câble en" +echo " place) → débrancher → rebrancher. Relever les valeurs à chaque" +echo " transition ; les écarts de temps se lisent dans l'horodatage." +echo + +# « plugged in / unplugged » viennent du MOTEUR : c'est ce que verrait un +# consommateur naïf de pluggedIn. Les comparer aux traces du plugin est +# précisément ce qui révèle un faux positif de débranchement. +"${SSH[@]}" 'journalctl -u nymead -f -n0 --no-pager' 2>&1 \ + | grep --line-buffered -iE "${CATEGORIE}|plugged in|unplugged" \ + | while IFS= read -r ligne; do + printf '%s | %s\n' "$(date '+%T')" "$ligne" + done