#!/bin/bash ####6b) Créer le service d'exécution de la sauvegarde avec logging ###script de base geole modifié par iznobe et Watael de remplacement (plus simple) merci à eux ###voir https://forum.kubuntu-fr.org/viewtopic.php?id=2091380&p=5 ### modifier les 2 premières variables du script # Configuration des logs LOG_DIR="/var/log/backup-script" LOG_FILE="$LOG_DIR/backup_$(date +%Y%m%d).log" DEBUG_FILE="$LOG_DIR/debug_$(date +%Y%m%d).log" ERROR_FILE="$LOG_DIR/error_$(date +%Y%m%d).log" # Création du répertoire de logs s'il n'existe pas mkdir -p "$LOG_DIR" 2>/dev/null || { # Si création échoue (pas de droits root), utiliser le home de l'utilisateur LOG_DIR="$HOME/.logs/backup-script" mkdir -p "$LOG_DIR" LOG_FILE="$LOG_DIR/backup_$(date +%Y%m%d).log" DEBUG_FILE="$LOG_DIR/debug_$(date +%Y%m%d).log" ERROR_FILE="$LOG_DIR/error_$(date +%Y%m%d).log" } # Mode debug (mettre à 1 pour activer le debug verbeux) DEBUG_MODE=0 # Fonctions de logging log_info() { local message="$1" local timestamp=$(date '+%Y-%m-%d %H:%M:%S') echo "[$timestamp] [INFO] $message" | tee -a "$LOG_FILE" } log_error() { local message="$1" local timestamp=$(date '+%Y-%m-%d %H:%M:%S') echo "[$timestamp] [ERROR] $message" | tee -a "$LOG_FILE" | tee -a "$ERROR_FILE" } log_debug() { local message="$1" local timestamp=$(date '+%Y-%m-%d %H:%M:%S') if [ "$DEBUG_MODE" -eq 1 ]; then echo "[$timestamp] [DEBUG] $message" | tee -a "$DEBUG_FILE" fi } log_warning() { local message="$1" local timestamp=$(date '+%Y-%m-%d %H:%M:%S') echo "[$timestamp] [WARNING] $message" | tee -a "$LOG_FILE" } # Fonction pour nettoyer les anciens logs (garde les 30 derniers jours) cleanup_old_logs() { log_debug "Nettoyage des anciens logs (> 30 jours)" find "$LOG_DIR" -name "*.log" -type f -mtime +30 -delete 2>/dev/null } # Gestion des erreurs et interruptions trap 'log_error "Script interrompu par signal"; exit 130' INT TERM # Début du script log_info "=== DÉBUT DE LA SAUVEGARDE ===" log_debug "Répertoire des logs: $LOG_DIR" log_debug "Mode debug: $DEBUG_MODE" # Nettoyage des anciens logs cleanup_old_logs ###Paramètres MountPoint="/media/$USER/JEUX8T" PartitionUID="35bb9ca2-2022-4dfa-a201-1a2dde7ce1aa" date=$(date +%F_%Hh%M) log_info "Configuration:" log_info " - Point de montage: $MountPoint" log_info " - UUID partition: $PartitionUID" log_info " - Date: $date" log_debug "Utilisateur: $USER" ###controle validité disque solution#125 Watael log_info "Vérification du disque externe..." ctrlID=$(findmnt -n --output UUID $MountPoint) ### controle si le disque est monté log_debug "UUID trouvé: '$ctrlID'" log_debug "UUID attendu: '$PartitionUID'" #controle validité disque ancienne version if [[ "$ctrlID" != "$PartitionUID" ]] then log_error "Disque non reconnu ou éteint" log_error "UUID trouvé: '$ctrlID'" log_error "UUID attendu: '$PartitionUID'" echo échec echo "ctrlID" $ctrlID echo "partition"$PartitionUID kdialog --error "Aucun disque reconnu ou disque éteint \n ALLUMER LE DISQUE EXTERNE \n AVANT de sélectionner «OK»" log_info "Attente du montage du disque..." sleep 5 # conditions de détection disque non monté (ctrlID vide) attempt=1 while [[ "$ctrlID" != "$PartitionUID" ]] do log_debug "Tentative $attempt - Vérification du montage..." sleep 2 #si le montage est reconnu mettre ctrlID à la bonne valeur ctrlID=$(findmnt -n --output UUID $MountPoint) sleep 1 log_debug "Ligne $LINENO" echo "ctrlID" $ctrlID echo "partition" $PartitionUID log_debug "UUID vérifié: '$ctrlID'" sleep 1 ((attempt++)) if [ $attempt -gt 60 ]; then log_error "Timeout: Disque non monté après 60 tentatives" kdialog --error "Timeout: Impossible de détecter le disque" exit 1 fi done log_info "Disque monté avec succès après $attempt tentatives" else log_info "Disque correctement monté" echo réussite echo "ctrlID" $ctrlID echo "partition" $PartitionUID kdialog --error " le disque est monté \n la sauvegarde peut être faite maintenant " fi ### choix des sauvegardes log_info "Affichage de la boîte de dialogue de sélection..." resultats=$(kdialog --separate-output --checklist "Selection liste:" 1 "Sauvegarde Photos" on 2 "Sauvegarde Images" on 4 "Sauvegarde Musiques" on 8 "Sauvegarde DocumentsCommuns" off 16 "Sauvegarde DocumentsEricFanou" off) if [ $? -ne 0 ]; then log_warning "Utilisateur a annulé la sélection" exit 0 fi log_info "Sélections utilisateur: $resultats" backup_count=0 successful_backups=0 failed_backups=0 for i in $resultats ###choix façon Watael do backup_count=$((backup_count + 1)) log_info "=== TRAITEMENT SAUVEGARDE $backup_count ===" log_debug "Valeur sélectionnée: $i" case $i in 1) log_info "Sauvegarde Photos sélectionnée" echo Photos user=Multimedias ip=192.168.1.128 src=/home/Multimedias/MultimediasCommuns/Photos dst=/media/kubu/JEUX8T/SAUVEGARDES/ bkp=incremental-Photos/$date/ backup_name="Photos" ;; 2) log_info "Sauvegarde Images sélectionnée" echo Images user=Multimedias ip=192.168.1.128 src=/home/Multimedias/MultimediasCommuns/Images dst=/media/kubu/JEUX8T/SAUVEGARDES/ bkp=incremental-Images/$date/ backup_name="Images" ;; 4) log_info "Sauvegarde Musiques sélectionnée" echo Musiques user=Multimedias ip=192.168.1.128 src=/home/Multimedias/MultimediasCommuns/Musiques dst=/media/kubu/JEUX8T/SAUVEGARDES/ bkp=incremental-Musiques/$date/ backup_name="Musiques" ;; 8) log_info "Sauvegarde DocumentsCommuns sélectionnée" echo DocumentsCommuns user=Multimedias ip=192.168.1.128 src=/home/Multimedias/DocumentsPartages dst=/media/kubu/JEUX8T/SauvegardesDocumentsCommuns/ bkp=incremental-DocumentsPartages/$date/ backup_name="DocumentsCommuns" ;; 16) log_info "Sauvegarde DocumentsEricFanou sélectionnée" echo DocumentsEricFanou # Première partie - sauvegarde locale log_debug "Sauvegarde locale Documents kubu" if rsync --progress -a -v --delete-after /home/kubu/Documents/ /home/kubu/VMSauvegardesDocuments/ --backup --backup-dir="incremental-DocumentsEric/$date/" >> "$LOG_FILE" 2>> "$ERROR_FILE"; then log_info "Sauvegarde locale Documents kubu réussie" else log_error "Échec sauvegarde locale Documents kubu" fi user=fanou ip=192.168.1.60 src=/home/fanou/Documents dst=/home/kubu/VMSauvegardesDocuments/VMSauvegardesDocumentsFanou/ bkp=incremental-DocumentsFanou/$date/ backup_name="DocumentsEricFanou" ;; *) log_warning "Valeur inconnue ignorée: $i" continue ;; esac log_info "Configuration sauvegarde $backup_name:" log_info " - Source: $user@$ip:$src" log_info " - Destination: $dst" log_info " - Répertoire de sauvegarde: $bkp" # Test SSH avant rsync pour les sauvegardes distantes if [ "$i" != "16" ] || [ "$backup_name" == "DocumentsEricFanou" ]; then log_debug "Test de connexion SSH vers $user@$ip..." if timeout 10 ssh -o ConnectTimeout=5 -o BatchMode=yes "$user@$ip" exit 2>/dev/null; then log_info "Connexion SSH vers $user@$ip: OK" else log_error "Connexion SSH vers $user@$ip: ÉCHEC" failed_backups=$((failed_backups + 1)) continue fi fi # Vérification de l'existence du répertoire de destination if [ ! -d "$dst" ]; then log_warning "Répertoire destination n'existe pas: $dst" log_info "Tentative de création..." if mkdir -p "$dst" 2>> "$ERROR_FILE"; then log_info "Répertoire créé avec succès: $dst" else log_error "Impossible de créer le répertoire: $dst" failed_backups=$((failed_backups + 1)) continue fi fi kdialog --passivepopup "Sauvegarde $backup_name en cours..." 10 & popup_pid=$! log_info "Début de la sauvegarde $backup_name..." start_time=$(date +%s) # Exécution de rsync avec capture des logs if rsync --progress -a -v --delete-after -e ssh $user@$ip:"$src" "$dst" --backup --backup-dir="$bkp" >> "$LOG_FILE" 2>> "$ERROR_FILE"; then end_time=$(date +%s) duration=$((end_time - start_time)) log_info "Sauvegarde $backup_name réussie en ${duration}s" successful_backups=$((successful_backups + 1)) else end_time=$(date +%s) duration=$((end_time - start_time)) log_error "Échec sauvegarde $backup_name après ${duration}s" failed_backups=$((failed_backups + 1)) fi done # Résumé final log_info "=== RÉSUMÉ FINAL ===" log_info "Sauvegardes traitées: $backup_count" log_info "Réussites: $successful_backups" log_info "Échecs: $failed_backups" if [ $failed_backups -eq 0 ]; then log_info "Toutes les sauvegardes ont réussi !" kdialog --msgbox "FIN des sauvegardes $resultats - TOUTES RÉUSSIES !" else log_warning "Certaines sauvegardes ont échoué. Consultez les logs." kdialog --msgbox "FIN des sauvegardes $resultats - $failed_backups échec(s) détecté(s)\nConsultez les logs: $LOG_FILE" fi log_info "=== FIN DE LA SAUVEGARDE ===" log_info "Logs disponibles dans: $LOG_DIR"