diff --git a/mount_restore.sh b/mount_restore.sh new file mode 100755 index 0000000..4dab8a7 --- /dev/null +++ b/mount_restore.sh @@ -0,0 +1,96 @@ +#!/bin/bash +# Script to help restore a virtual machine disk with Borg (plan B) +# +# Copyright (C) 2023 Adrien 'neox' Bourmault +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +# Exit on error +set -e + +# Enable quitting properly +trap clean_exit INT + +function clean_exit() { + echo "Exiting..." + umount -q /mnt/${vm} + umount -q /mnt/${vm}-remote + sync + + if [ ! -z ${loopdisk} ]; then + losetup -d ${loopdisk} + fi + sleep 3 + rm -r /mnt +} + + +vm=$1 +dest=$2 +backuphost=$3 + +generic_image="/srv/vmverse/installation/generic.a-lec.org.raw" + +if [[ $# != 3 ]] +then + echo "ERROR: 3 parameters required : vm domain, destination path, backup host" + exit 1 +fi + +# Checking saves +echo -e "Checking backups...\n" +export BORG_PASSPHRASE=$(ssh root@${backuphost} cat /srv/borg/.borg-passphrase) +DATES=$(borg list --short root@${backuphost}:/var/backups/borg/${vm}.repo) +IFS=$'\n' DATES=(${DATES}) + +echo "* BACKUPS AVAILABLE *" +echo "---------------------" +echo " " + +i=0 +while [ $i -lt ${#DATES[@]} ] +do + echo -e "\t${i}) ${DATES[i]}" + i=$((i+1)) +done + +# Asking for save to restore +read -p "Please choose a backup to restore: " backupdate +echo -e "\nOK\n" + +# Preparing path +echo "Preparing path..." +mkdir -p /mnt/${vm} +mkdir -p /mnt/${vm}-remote +mkdir -p $(dirname ${dest}) + +# Creating new disk +echo "Creating new disk..." +cp --reflink ${generic_image} ${dest} + +# Mounting +echo "Mounting devices..." +loopdisk=$(losetup -fPL ${dest} --show) +mount ${loopdisk}p1 /mnt/${vm} +borg mount root@${backuphost}:/var/backups/borg/${vm}.repo::${DATES[backupdate]} /mnt/${vm}-remote + +# Syncing +echo "[Please sync now and press enter when finished]" +sleep 1 +#rsync -ar --progress --sparse /mnt/${vm}-remote/. /mnt/${vm} +read + +# Cleaning up +echo -e "\nOK\n" +clean_exit diff --git a/restore.sh b/restore.sh index 7102c53..a36b4dd 100755 --- a/restore.sh +++ b/restore.sh @@ -24,14 +24,15 @@ trap clean_exit INT function clean_exit() { echo "Exiting..." + umount -q /mnt/${vm} + umount -q /mnt/${vm}-remote sync - umount -q /tmp/mnt/${vm} - umount -q /tmp/mnt/${vm}-remote if [ ! -z ${loopdisk} ]; then losetup -d ${loopdisk} fi - rm -r /tmp/mnt + sleep 3 + rm -r /mnt } @@ -70,8 +71,8 @@ echo -e "\nOK\n" # Preparing path echo "Preparing path..." -mkdir -p /tmp/mnt/${vm} -mkdir -p /tmp/mnt/${vm}-remote +mkdir -p /mnt/${vm} +mkdir -p /mnt/${vm}-remote mkdir -p $(dirname ${dest}) # Creating new disk @@ -81,13 +82,13 @@ cp --reflink ${generic_image} ${dest} # Mounting echo "Mounting devices..." loopdisk=$(losetup -fPL ${dest} --show) -mount ${loopdisk}p1 /tmp/mnt/${vm} -borg mount root@${backuphost}:/var/backups/borg/${vm}.repo::${DATES[backupdate]} /tmp/mnt/${vm}-remote +mount ${loopdisk}p1 /mnt/${vm} +borg mount root@${backuphost}:/var/backups/borg/${vm}.repo::${DATES[backupdate]} /mnt/${vm}-remote # Syncing echo "Syncing now !" sleep 1 -rsync -ar --progress --sparse /tmp/mnt/${vm}-remote/. /tmp/mnt/${vm} +rsync -ar --progress --sparse /mnt/${vm}-remote/. /mnt/${vm} # Cleaning up echo -e "\nOK\n"