#!/bin/bash # Script to 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 rmdir /mnt/${vm}* } 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 "Syncing now !" sleep 1 rsync -ar --progress --sparse /mnt/${vm}-remote/. /mnt/${vm} # Cleaning up echo -e "\nOK\n" clean_exit