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