chore(scripts): add graylog validation runner

This commit is contained in:
thibaud-lclr 2026-04-17 15:45:48 +02:00
parent f2be837a1e
commit d6834cf648
2 changed files with 199 additions and 1 deletions

View file

@ -14,7 +14,10 @@
"qa:backend:check": "cd src-tauri && cargo check", "qa:backend:check": "cd src-tauri && cargo check",
"qa:backend:test": "cd src-tauri && cargo test", "qa:backend:test": "cd src-tauri && cargo test",
"qa:backend:clippy": "cd src-tauri && cargo clippy -- -D warnings", "qa:backend:clippy": "cd src-tauri && cargo clippy -- -D warnings",
"qa": "npm run qa:frontend && npm run qa:backend:check && npm run qa:backend:test && npm run qa:backend:clippy" "qa": "npm run qa:frontend && npm run qa:backend:check && npm run qa:backend:test && npm run qa:backend:clippy",
"validate:graylog": "bash scripts/validate-graylog-flow.sh all",
"validate:graylog:auto": "bash scripts/validate-graylog-flow.sh auto",
"validate:graylog:manual": "bash scripts/validate-graylog-flow.sh manual"
}, },
"dependencies": { "dependencies": {
"@tauri-apps/api": "^2.10.1", "@tauri-apps/api": "^2.10.1",

195
scripts/validate-graylog-flow.sh Executable file
View file

@ -0,0 +1,195 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_NAME="$(basename "$0")"
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
usage() {
cat <<USAGE
Usage: $SCRIPT_NAME [all|auto|manual] [--non-interactive]
Modes:
all Run automated checks, then run manual checklist (default)
auto Run only automated checks (qa + build)
manual Run only manual checklist
Options:
--non-interactive Print manual checklist without prompts
-h, --help Show this help
USAGE
}
log() {
printf '\n[%s] %s\n' "$1" "$2"
}
run_cmd() {
local description="$1"
shift
log RUN "$description"
(cd "$ROOT_DIR" && "$@")
}
run_automated_checks() {
log INFO "Automated validation started"
run_cmd "Frontend + backend QA" npm run qa
run_cmd "Production build" npm run build
log OK "Automated validation passed"
}
print_manual_checklist() {
cat <<'CHECKLIST'
Manual Graylog checklist (project UI):
1. Ouvre l'app: `npm run tauri dev`.
2. Va dans `Projet > Modules` et vérifie que `Polling Graylog + auto-resolve` est visible et activable.
3. Va dans `Projet > Graylog`.
- Sauvegarde une config valide (URL, token, agents analyst/developer, seuil).
- Clique `Tester la connexion` et vérifie le message de succès.
4. Lance `Poll manuel`.
- Vérifie qu'au moins une détection apparaît dans `Dernières détections`.
- Si score >= seuil, vérifie création d'un ticket dans `Tickets`.
5. Vérifie la dédup stricte:
- Relance `Poll manuel` sans clôturer le ticket actif du même sujet.
- Vérifie qu'un 2e ticket n'est pas créé pour ce sujet.
6. Ouvre le ticket créé:
- Vérifie `Source: graylog` et `Source ref` dans le détail.
- Vérifie le badge source dans la liste des tickets.
7. Retry/Cancel:
- Vérifie que `Retry` et `Cancel` restent opérationnels pour les tickets Graylog.
CHECKLIST
}
prompt_step() {
local step="$1"
while true; do
printf '\n%s\n' "$step"
read -r -p "Résultat ? [y=ok / n=ko / s=skip / q=quit] " answer
case "$answer" in
y|Y)
return 0
;;
n|N)
return 1
;;
s|S)
return 2
;;
q|Q)
return 3
;;
*)
echo "Réponse invalide. Utilise y/n/s/q."
;;
esac
done
}
run_manual_checklist() {
local non_interactive="$1"
print_manual_checklist
if [ "$non_interactive" = "true" ]; then
log INFO "Mode non interactif: checklist affichée uniquement"
return 0
fi
local -a steps=(
"1) Module Graylog visible et activable dans Projet > Modules"
"2) Sauvegarde config Graylog + test connexion OK"
"3) Poll manuel: détections visibles"
"4) Ticket créé quand score >= seuil"
"5) Dédup stricte vérifiée (pas de doublon actif)"
"6) Détail ticket: source graylog + source_ref"
"7) Retry/Cancel fonctionnels sur ticket Graylog"
)
local passed=0
local failed=0
local skipped=0
for step in "${steps[@]}"; do
if prompt_step "$step"; then
passed=$((passed + 1))
else
code=$?
if [ "$code" -eq 1 ]; then
failed=$((failed + 1))
elif [ "$code" -eq 2 ]; then
skipped=$((skipped + 1))
elif [ "$code" -eq 3 ]; then
break
fi
fi
done
printf '\nSummary: passed=%d failed=%d skipped=%d\n' "$passed" "$failed" "$skipped"
if [ "$failed" -gt 0 ]; then
log ERROR "Checklist manuelle en échec"
return 1
fi
log OK "Checklist manuelle validée"
}
main() {
local mode="all"
local non_interactive="false"
if [ "$#" -gt 0 ]; then
case "$1" in
all|auto|manual)
mode="$1"
shift
;;
-h|--help)
usage
return 0
;;
*)
echo "Unknown mode: $1" >&2
usage >&2
return 2
;;
esac
fi
while [ "$#" -gt 0 ]; do
case "$1" in
--non-interactive)
non_interactive="true"
;;
-h|--help)
usage
return 0
;;
*)
echo "Unknown option: $1" >&2
usage >&2
return 2
;;
esac
shift
done
case "$mode" in
auto)
run_automated_checks
;;
manual)
run_manual_checklist "$non_interactive"
;;
all)
run_automated_checks
run_manual_checklist "$non_interactive"
;;
esac
log OK "Validation Graylog terminée"
}
main "$@"