126 lines
4.2 KiB
Bash
126 lines
4.2 KiB
Bash
|
|
#!/bin/bash
|
|||
|
|
# Auteur : BENE Maël
|
|||
|
|
# Version : 1.1
|
|||
|
|
# Description : Restauration interactive d’un dossier ou d’un fichier individuel (version améliorée avec journalisation)
|
|||
|
|
|
|||
|
|
set -euo pipefail
|
|||
|
|
|
|||
|
|
# Configuration
|
|||
|
|
DEST_USER="backup-user"
|
|||
|
|
DEST_HOST="stockage"
|
|||
|
|
DEST_BASE="/home/$DEST_USER/backup"
|
|||
|
|
BASE_RESTORE_DIR="/home/oclassroom/mairie"
|
|||
|
|
LOG_FILE="/home/oclassroom/backup-logs/restores_inc.log"
|
|||
|
|
|
|||
|
|
# Fonction de log
|
|||
|
|
log_header() {
|
|||
|
|
local type="$1" # "Dossier complet" ou "Fichier spécifique"
|
|||
|
|
{
|
|||
|
|
echo "====================================================="
|
|||
|
|
echo "[$START_DATE] ➤ DÉBUT DE LA RESTAURATION INCRÉMENTALE"
|
|||
|
|
echo "Dossier restauré : $DOSSIER"
|
|||
|
|
echo "Type : $type"
|
|||
|
|
echo "Horodatage de la sauvegarde : $BACKUP_TIMESTAMP"
|
|||
|
|
echo "====================================================="
|
|||
|
|
} >> "$LOG_FILE"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Liste des dossiers disponibles (hors MACHINES)
|
|||
|
|
DIR_LIST=$(ssh "$DEST_USER@$DEST_HOST" "ls -1 $DEST_BASE" | grep -v '^MACHINES$')
|
|||
|
|
if [ -z "$DIR_LIST" ]; then
|
|||
|
|
echo "Aucun dossier de sauvegarde trouvé."
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "Dossiers disponibles à la restauration :"
|
|||
|
|
DIR_ARRAY=()
|
|||
|
|
i=1
|
|||
|
|
while read -r line; do
|
|||
|
|
echo " $i) $line"
|
|||
|
|
DIR_ARRAY+=("$line")
|
|||
|
|
((i++))
|
|||
|
|
done <<< "$DIR_LIST"
|
|||
|
|
|
|||
|
|
read -rp "Numéro du dossier à restaurer : " DIR_NUM
|
|||
|
|
DOSSIER="${DIR_ARRAY[$((DIR_NUM - 1))]}"
|
|||
|
|
|
|||
|
|
# Liste des sauvegardes disponibles
|
|||
|
|
BACKUP_LIST=$(ssh "$DEST_USER@$DEST_HOST" "ls -1dt $DEST_BASE/$DOSSIER/20*_* 2>/dev/null")
|
|||
|
|
|
|||
|
|
if [ -z "$BACKUP_LIST" ]; then
|
|||
|
|
echo "Aucune sauvegarde trouvée pour $DOSSIER."
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "Sauvegardes disponibles pour '$DOSSIER' :"
|
|||
|
|
BACKUP_ARRAY=()
|
|||
|
|
i=1
|
|||
|
|
while read -r line; do
|
|||
|
|
SHORT=$(echo "$line" | sed "s|$DEST_BASE/||")
|
|||
|
|
echo " $i) $SHORT"
|
|||
|
|
BACKUP_ARRAY+=("$line")
|
|||
|
|
((i++))
|
|||
|
|
done <<< "$BACKUP_LIST"
|
|||
|
|
|
|||
|
|
read -rp "Numéro de la sauvegarde à restaurer (Entrée = latest) : " BACKUP_NUM
|
|||
|
|
if [ -z "$BACKUP_NUM" ]; then
|
|||
|
|
SELECTED_BACKUP=$(ssh "$DEST_USER@$DEST_HOST" "readlink -f '$DEST_BASE/$DOSSIER/latest'" || true)
|
|||
|
|
if [ -z "$SELECTED_BACKUP" ]; then
|
|||
|
|
echo "Aucun lien 'latest' trouvé pour ce dossier."
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
else
|
|||
|
|
SELECTED_BACKUP="${BACKUP_ARRAY[$((BACKUP_NUM - 1))]}"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "Sauvegarde sélectionnée : $(echo "$SELECTED_BACKUP" | sed "s|$DEST_BASE/||")"
|
|||
|
|
|
|||
|
|
# Horodatage pour les logs
|
|||
|
|
START_DATE=$(date '+%Y-%m-%d %H:%M:%S')
|
|||
|
|
BACKUP_TIMESTAMP=$(basename "$SELECTED_BACKUP")
|
|||
|
|
|
|||
|
|
# Choix entre restauration complète ou fichier spécifique
|
|||
|
|
echo "Que voulez-vous restaurer ?"
|
|||
|
|
select CHOIX in "Dossier complet" "Fichier spécifique"; do
|
|||
|
|
case $REPLY in
|
|||
|
|
1)
|
|||
|
|
RESTORE_PATH="$BASE_RESTORE_DIR/$DOSSIER"
|
|||
|
|
echo "➤ Restauration complète dans : $RESTORE_PATH"
|
|||
|
|
mkdir -p "$RESTORE_PATH"
|
|||
|
|
log_header "Dossier complet"
|
|||
|
|
rsync -av -e ssh "$DEST_USER@$DEST_HOST:$SELECTED_BACKUP/" "$RESTORE_PATH/" >> "$LOG_FILE" 2>&1
|
|||
|
|
echo "Dossier restauré avec succès."
|
|||
|
|
break
|
|||
|
|
;;
|
|||
|
|
2)
|
|||
|
|
echo "Liste des fichiers disponibles :"
|
|||
|
|
FILE_LIST=$(ssh "$DEST_USER@$DEST_HOST" "cd '$SELECTED_BACKUP' && find . -type f" | sed 's|^\./||')
|
|||
|
|
if [ -z "$FILE_LIST" ]; then
|
|||
|
|
echo "Aucun fichier trouvé dans la sauvegarde."
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
FILE_ARRAY=()
|
|||
|
|
i=1
|
|||
|
|
while read -r file; do
|
|||
|
|
echo " $i) $file"
|
|||
|
|
FILE_ARRAY+=("$file")
|
|||
|
|
((i++))
|
|||
|
|
done <<< "$FILE_LIST"
|
|||
|
|
|
|||
|
|
read -rp "Numéro du fichier à restaurer : " FILE_NUM
|
|||
|
|
FILE_TO_RESTORE="${FILE_ARRAY[$((FILE_NUM - 1))]}"
|
|||
|
|
DEST_PATH="$BASE_RESTORE_DIR/$DOSSIER/$(dirname "$FILE_TO_RESTORE")"
|
|||
|
|
mkdir -p "$DEST_PATH"
|
|||
|
|
log_header "Fichier spécifique"
|
|||
|
|
echo "➤ Restauration de '$FILE_TO_RESTORE' vers '$DEST_PATH'" >> "$LOG_FILE"
|
|||
|
|
rsync -av -e ssh "$DEST_USER@$DEST_HOST:$SELECTED_BACKUP/$FILE_TO_RESTORE" "$DEST_PATH/" >> "$LOG_FILE" 2>&1
|
|||
|
|
echo "Fichier restauré avec succès."
|
|||
|
|
break
|
|||
|
|
;;
|
|||
|
|
*)
|
|||
|
|
echo "Choix invalide."
|
|||
|
|
;;
|
|||
|
|
esac
|
|||
|
|
done
|