#!/bin/bash # Script: Nettoyage des tests # Description: Nettoie les logs et rapports de tests anciens # Auteur: Assistant IA # Date: 2024-12-19 set -e # Configuration SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" LOG_DIR="$SCRIPT_DIR/logs" REPORT_DIR="$SCRIPT_DIR/reports" # Couleurs pour l'affichage RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Variables globales DAYS_TO_KEEP=7 CLEAN_LOGS=true CLEAN_REPORTS=false DRY_RUN=false VERBOSE=false # Fonctions utilitaires log() { local level="$1" shift local message="$*" local timestamp=$(date +%Y-%m-%d\ %H:%M:%S) case "$level" in "INFO") echo -e "${BLUE}[$timestamp] INFO:${NC} $message" ;; "SUCCESS") echo -e "${GREEN}[$timestamp] SUCCESS:${NC} $message" ;; "WARNING") echo -e "${YELLOW}[$timestamp] WARNING:${NC} $message" ;; "ERROR") echo -e "${RED}[$timestamp] ERROR:${NC} $message" ;; esac } # Afficher l'aide show_help() { cat << EOF Usage: $0 [OPTIONS] Options: -h, --help Afficher cette aide -d, --days N Nombre de jours à conserver (défaut: 7) --logs Nettoyer les logs (défaut: activé) --reports Nettoyer les rapports (défaut: désactivé) --all Nettoyer logs et rapports --dry-run Simulation sans suppression -v, --verbose Mode verbose Exemples: $0 # Nettoyer les logs de plus de 7 jours $0 --days 30 # Nettoyer les logs de plus de 30 jours $0 --all --dry-run # Simulation du nettoyage complet $0 --reports --days 1 # Nettoyer les rapports de plus d'1 jour EOF } # Nettoyer les logs cleanup_logs() { if [ "$CLEAN_LOGS" = false ]; then return 0 fi log "INFO" "Nettoyage des logs de plus de $DAYS_TO_KEEP jours..." if [ ! -d "$LOG_DIR" ]; then log "WARNING" "Répertoire de logs non trouvé: $LOG_DIR" return 0 fi local files_to_delete=() # Trouver les fichiers à supprimer while IFS= read -r -d '' file; do files_to_delete+=("$file") done < <(find "$LOG_DIR" -type f -mtime +$DAYS_TO_KEEP -print0 2>/dev/null) if [ ${#files_to_delete[@]} -eq 0 ]; then log "INFO" "Aucun log à supprimer" return 0 fi log "INFO" "Fichiers à supprimer (${#files_to_delete[@]}):" for file in "${files_to_delete[@]}"; do if [ "$VERBOSE" = true ]; then log "INFO" " - $(basename "$file") ($(stat -c %y "$file" 2>/dev/null || echo "date inconnue"))" else log "INFO" " - $(basename "$file")" fi done if [ "$DRY_RUN" = true ]; then log "INFO" "Mode simulation: aucun fichier supprimé" return 0 fi # Supprimer les fichiers local deleted_count=0 for file in "${files_to_delete[@]}"; do if rm "$file" 2>/dev/null; then deleted_count=$((deleted_count + 1)) if [ "$VERBOSE" = true ]; then log "SUCCESS" "Supprimé: $(basename "$file")" fi else log "ERROR" "Impossible de supprimer: $(basename "$file")" fi done log "SUCCESS" "Nettoyage des logs terminé: $deleted_count fichier(s) supprimé(s)" } # Nettoyer les rapports cleanup_reports() { if [ "$CLEAN_REPORTS" = false ]; then return 0 fi log "INFO" "Nettoyage des rapports de plus de $DAYS_TO_KEEP jours..." if [ ! -d "$REPORT_DIR" ]; then log "WARNING" "Répertoire de rapports non trouvé: $REPORT_DIR" return 0 fi local files_to_delete=() # Trouver les fichiers à supprimer while IFS= read -r -d '' file; do files_to_delete+=("$file") done < <(find "$REPORT_DIR" -type f -mtime +$DAYS_TO_KEEP -print0 2>/dev/null) if [ ${#files_to_delete[@]} -eq 0 ]; then log "INFO" "Aucun rapport à supprimer" return 0 fi log "INFO" "Fichiers à supprimer (${#files_to_delete[@]}):" for file in "${files_to_delete[@]}"; do if [ "$VERBOSE" = true ]; then log "INFO" " - $(basename "$file") ($(stat -c %y "$file" 2>/dev/null || echo "date inconnue"))" else log "INFO" " - $(basename "$file")" fi done if [ "$DRY_RUN" = true ]; then log "INFO" "Mode simulation: aucun fichier supprimé" return 0 fi # Supprimer les fichiers local deleted_count=0 for file in "${files_to_delete[@]}"; do if rm "$file" 2>/dev/null; then deleted_count=$((deleted_count + 1)) if [ "$VERBOSE" = true ]; then log "SUCCESS" "Supprimé: $(basename "$file")" fi else log "ERROR" "Impossible de supprimer: $(basename "$file")" fi done log "SUCCESS" "Nettoyage des rapports terminé: $deleted_count fichier(s) supprimé(s)" } # Afficher les statistiques show_statistics() { log "INFO" "=== Statistiques ===" # Statistiques des logs if [ -d "$LOG_DIR" ]; then local log_count=$(find "$LOG_DIR" -type f | wc -l) local log_size=$(du -sh "$LOG_DIR" 2>/dev/null | cut -f1 || echo "0") log "INFO" "Logs: $log_count fichier(s), $log_size" else log "INFO" "Logs: répertoire non trouvé" fi # Statistiques des rapports if [ -d "$REPORT_DIR" ]; then local report_count=$(find "$REPORT_DIR" -type f | wc -l) local report_size=$(du -sh "$REPORT_DIR" 2>/dev/null | cut -f1 || echo "0") log "INFO" "Rapports: $report_count fichier(s), $report_size" else log "INFO" "Rapports: répertoire non trouvé" fi } # Fonction principale main() { log "INFO" "=== Début du nettoyage des tests ===" log "INFO" "Répertoire de travail: $SCRIPT_DIR" log "INFO" "Jours à conserver: $DAYS_TO_KEEP" log "INFO" "Mode simulation: $DRY_RUN" # Afficher les statistiques avant nettoyage show_statistics # Nettoyer les logs cleanup_logs # Nettoyer les rapports cleanup_reports # Afficher les statistiques après nettoyage if [ "$DRY_RUN" = false ]; then log "INFO" "=== Statistiques après nettoyage ===" show_statistics fi log "SUCCESS" "=== Nettoyage terminé ===" } # Traitement des arguments while [[ $# -gt 0 ]]; do case $1 in -h|--help) show_help exit 0 ;; -d|--days) DAYS_TO_KEEP="$2" shift 2 ;; --logs) CLEAN_LOGS=true shift ;; --reports) CLEAN_REPORTS=true shift ;; --all) CLEAN_LOGS=true CLEAN_REPORTS=true shift ;; --dry-run) DRY_RUN=true shift ;; -v|--verbose) VERBOSE=true shift ;; *) log "ERROR" "Option inconnue: $1" show_help exit 1 ;; esac done # Validation des paramètres if ! [[ "$DAYS_TO_KEEP" =~ ^[0-9]+$ ]]; then log "ERROR" "Le nombre de jours doit être un entier positif" exit 1 fi if [ "$DAYS_TO_KEEP" -lt 0 ]; then log "ERROR" "Le nombre de jours ne peut pas être négatif" exit 1 fi # Exécution principale main "$@"