#!/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 "$@"