mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2025-06-28 12:16:53 +00:00
114 lines
3.9 KiB
Bash
114 lines
3.9 KiB
Bash
|
#!/usr/bin/env bash
|
||
|
|
||
|
# ==============================================
|
||
|
# ProxMenux - Menú de Restauración de Backups
|
||
|
# ==============================================
|
||
|
|
||
|
BACKUP_DIR="/root/backups"
|
||
|
PBS_REPO="root@pbs@192.168.100.10:host-backups"
|
||
|
HOSTNAME=$(hostname)
|
||
|
|
||
|
main_menu() {
|
||
|
OPTION=$(whiptail --title "Restaurar Backup del Host" --menu "¿Desde dónde quieres restaurar?" 15 60 5 \\
|
||
|
"1" "Restaurar desde archivo local (.tar.gz)" \\
|
||
|
"2" "Restaurar desde PBS (.pxar)" \\
|
||
|
"3" "Salir" 3>&1 1>&2 2>&3)
|
||
|
|
||
|
case "$OPTION" in
|
||
|
"1") restore_from_local ;;
|
||
|
"2") restore_from_pbs ;;
|
||
|
"3") clear; exit 0 ;;
|
||
|
esac
|
||
|
}
|
||
|
|
||
|
restore_from_local() {
|
||
|
mapfile -t TAR_FILES < <(find "$BACKUP_DIR" -name "*.tar.gz" 2>/dev/null)
|
||
|
|
||
|
if [ ${#TAR_FILES[@]} -eq 0 ]; then
|
||
|
whiptail --msgbox "No se encontraron archivos .tar.gz en $BACKUP_DIR" 10 60
|
||
|
return
|
||
|
fi
|
||
|
|
||
|
MENU_ITEMS=()
|
||
|
for f in "${TAR_FILES[@]}"; do
|
||
|
MENU_ITEMS+=("$f" "")
|
||
|
done
|
||
|
|
||
|
SELECTED_TAR=$(whiptail --title "Selecciona backup local" --menu "Elige el archivo a restaurar:" 20 70 10 "${MENU_ITEMS[@]}" 3>&1 1>&2 2>&3) || return
|
||
|
|
||
|
mapfile -t FILE_CONTENT < <(tar -tzf "$SELECTED_TAR")
|
||
|
MENU_CONTENT=()
|
||
|
for item in "${FILE_CONTENT[@]}"; do
|
||
|
MENU_CONTENT+=("$item" "OFF")
|
||
|
done
|
||
|
|
||
|
SELECTED_DIRS=$(whiptail --title "Contenido del backup" --checklist "Selecciona qué restaurar (Espacio = seleccionar):" 20 80 15 \\
|
||
|
"ALL" "Restaurar todo el contenido" OFF \\
|
||
|
"${MENU_CONTENT[@]}" 3>&1 1>&2 2>&3) || return
|
||
|
|
||
|
if echo "$SELECTED_DIRS" | grep -q "ALL"; then
|
||
|
tar -xzf "$SELECTED_TAR" -C /
|
||
|
whiptail --msgbox "Restauración completa realizada con éxito." 10 60
|
||
|
else
|
||
|
for item in $SELECTED_DIRS; do
|
||
|
item_cleaned=$(echo "$item" | tr -d '"')
|
||
|
tar -xzf "$SELECTED_TAR" -C / "$item_cleaned"
|
||
|
done
|
||
|
whiptail --msgbox "Restauración parcial realizada con éxito." 10 60
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
restore_from_pbs() {
|
||
|
mapfile -t BACKUPS < <(proxmox-backup-client list --repository "$PBS_REPO" | grep "$HOSTNAME" | awk '{print $3}')
|
||
|
|
||
|
if [ ${#BACKUPS[@]} -eq 0 ]; then
|
||
|
whiptail --msgbox "No se encontraron backups de $HOSTNAME en PBS." 10 60
|
||
|
return
|
||
|
fi
|
||
|
|
||
|
MENU_ITEMS=()
|
||
|
for backup in "${BACKUPS[@]}"; do
|
||
|
MENU_ITEMS+=("$backup" "")
|
||
|
done
|
||
|
|
||
|
SELECTED_BACKUP=$(whiptail --title "Seleccionar backup en PBS" --menu "Elige un snapshot para restaurar:" 20 70 10 "${MENU_ITEMS[@]}" 3>&1 1>&2 2>&3) || return
|
||
|
|
||
|
mapfile -t FILES < <(proxmox-backup-client catalog --repository "$PBS_REPO" --backup-id "$HOSTNAME" --backup-time "$SELECTED_BACKUP" | awk '{print $1}' | grep ".pxar")
|
||
|
|
||
|
if [ ${#FILES[@]} -eq 0 ]; then
|
||
|
whiptail --msgbox "No se encontraron archivos .pxar en ese snapshot." 10 60
|
||
|
return
|
||
|
fi
|
||
|
|
||
|
FILE_OPTIONS=("ALL" "Restaurar todos los archivos" OFF)
|
||
|
for file in "${FILES[@]}"; do
|
||
|
FILE_OPTIONS+=("$file" "OFF")
|
||
|
done
|
||
|
|
||
|
SELECTED_FILES=$(whiptail --title "Contenido del snapshot PBS" --checklist "Selecciona qué restaurar:" 20 80 15 "${FILE_OPTIONS[@]}" 3>&1 1>&2 2>&3) || return
|
||
|
|
||
|
RESTORE_DIR="/tmp/pbs-restore-${SELECTED_BACKUP}"
|
||
|
mkdir -p "$RESTORE_DIR"
|
||
|
|
||
|
if echo "$SELECTED_FILES" | grep -q "ALL"; then
|
||
|
for file in "${FILES[@]}"; do
|
||
|
proxmox-backup-client restore "$file" "$RESTORE_DIR/$(basename "$file" .pxar)" --repository "$PBS_REPO" --backup-id "$HOSTNAME" --backup-time "$SELECTED_BACKUP"
|
||
|
done
|
||
|
whiptail --msgbox "Restauración completa a $RESTORE_DIR." 10 60
|
||
|
else
|
||
|
for file in $SELECTED_FILES; do
|
||
|
file_cleaned=$(echo "$file" | tr -d '"')
|
||
|
proxmox-backup-client restore "$file_cleaned" "$RESTORE_DIR/$(basename "$file_cleaned" .pxar)" --repository "$PBS_REPO" --backup-id "$HOSTNAME" --backup-time "$SELECTED_BACKUP"
|
||
|
done
|
||
|
whiptail --msgbox "Restauración parcial a $RESTORE_DIR." 10 60
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
# Lanzar menú principal
|
||
|
while true; do main_menu; done
|
||
|
""")
|
||
|
|
||
|
unified_script_path = Path("/mnt/data/restore-unified-menu.sh")
|
||
|
unified_script_path.write_text(unified_restore_script)
|
||
|
unified_script_path.chmod(0o755)
|
||
|
unified_script_path
|