diff --git a/package.json b/package.json index ca9fe41..6494b03 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,10 @@ "qa:backend:check": "cd src-tauri && cargo check", "qa:backend:test": "cd src-tauri && cargo test", "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": { "@tauri-apps/api": "^2.10.1", diff --git a/scripts/validate-graylog-flow.sh b/scripts/validate-graylog-flow.sh new file mode 100755 index 0000000..195c81e --- /dev/null +++ b/scripts/validate-graylog-flow.sh @@ -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 < 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 "$@"