#!/bin/bash usage() { echo "Usage: $0 [ -n NODE ] [ -z UUID ] [ -h hostname ] [ -p port ] [ -k KEY ] [ -d dir ] [ -u user ]" >&2 exit 1 } while getopts "n:z:h:p:k:d:u:" opt; do case "$opt" in n) NODE=$OPTARG ;; z) UUID=$OPTARG ;; h) HOSTNAME=$OPTARG ;; p) PORT=$OPTARG ;; k) KEY=$OPTARG ;; d) DIR=$OPTARG ;; u) USER=$OPTARG ;; \?) echo "Error: Invalid Option: -${OPTARG}" >&2 usage ;; :) echo "Error: -${OPTARG} requires an argument." usage ;; *) usage ;; esac done shift $((OPTIND-1)) if [ -z "${UUID}" ] || [ -z "${NODE}" ] || [ -z ${HOSTNAME} ] || [ -z ${PORT} ] || [ -z ${KEY} ] || [ -z "${DIR}" ] || [ -z "${USER}" ]; then usage fi SSH="ssh -i $KEY -p ${PORT} -l ${USER} -o StrictHostKeyChecking=no" SCP="scp -q -i $KEY -P ${PORT} -o StrictHostKeyChecking=no" DSTDIR="${DIR}/${UUID}" ################# # functions ################# check_err() { STATUS=$? if [ ${STATUS} -ne 0 ]; then echo "Unexpected error: ${STATUS}" exit ${STATUS} fi } remove_vps() { VPS=$1 echo "Deleteing VPS ${VPS}..." vmadm destroy ${VPS} check_err echo "...done." } recover_dataset() { VPS=$1 echo "Recovering VPS ${VPS}..." ${SSH} ${HOSTNAME} "dd if=${DIR}/${NODE}/${VPS}/${VPS}.zfs bs=4M" | /usr/sbin/zfs receive zones/${VPS} check_err echo "...done." } recover_config() { VPS=$1 echo "Recovering config from backup..." ${SCP} ${USER}@${HOSTNAME}:${DIR}/${NODE}/${VPS}/${VPS}.cfg /zones/tools/descargas/ cat /zones/tools/descargas/${VPS}.cfg | zonecfg -z ${VPS} check_err echo "...done." } final_steps() { VPS=$1 echo "Attaching dataset..." zoneadm -z ${VPS} attach check_err echo "...done." echo "Booting VPS..." zoneadm -z ${VPS} boot check_err echo "...done." } ################# # main ################# echo "--- BACKUP_SERVER: ${HOSTNAME} UUID to restore: ${UUID} ---" remove_vps ${UUID} recover_config ${UUID} recover_dataset ${UUID} final_steps ${UUID}