#!/usr/bin/bash DATE=`date +%Y%m%d` usage() { echo "Usage: $0 [ -s hostname ] [ -z UUID ] [ -b backupzone ] [ -i idbackupzone ]" >&2 exit 1 } while getopts ":s:z:b:i:" opt; do case "$opt" in s) SOURCEGZ=$OPTARG ;; z) UUID=$OPTARG ;; b) BACKUPZ=$OPTARG ;; i) IDBACKUPZ=$OPTARG ;; \?) echo "Error: Invalid Option: -${OPTARG}" >&2 usage ;; :) echo "Error: -${OPTARG} requires an argument." usage ;; *) usage ;; esac done shift $((OPTIND -1 )) if [ -z ${SOURCEGZ} ] || [ -z "${UUID}" ] || [ -z ${BACKUPZ} ] || [ -z ${IDBACKUPZ} ]; then usage fi # functions check_err() { STATUS=$? if [ ${STATUS} -ne 0 ]; then echo "Unexpected error: ${STATUS}" exit ${STATUS} fi } check_snap() { ZONE=$1 echo "Checking for local snapshot of ${ZONE}..." zfs list -t snapshot zones/${ZONE}@${DATE} 2>/dev/null 1>&2 } check_remote_snap() { DATASET=$1 echo "Checking for an existing remote snapshot of ${DATASET}..." ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ zfs list zones/${IDBACKUPZ}/data/${SOURCEGZ}/${DATASET}@${DATE} 2>/dev/null 1>&2 } check_remote_dataset() { DATASET=$1 echo "Checking for an existing remote dataset of ${DATASET}..." ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ zfs list zones/${IDBACKUPZ}/data/${SOURCEGZ}/${DATASET} 2>/dev/null 1>&2 } create_snap() { DS=$1 echo "Creating snapshot of ${DS}..." zfs snapshot zones/${DS}@${DATE} check_err echo "done." } delete_local_snap() { DATASET=$1 echo "Deleting local snapshot zones/${DATASET}@${DATE}..." zfs destroy zones/${DATASET}@${DATE} check_err echo "done." } delete_remote_dataset() { DATASET=$1 echo "Deleting remote dataset ${DATASET} on ${BACKUPZ}..." ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ zfs destroy -r zones/${IDBACKUPZ}/data/${SOURCEGZ}/${DATASET} 2>/dev/null 1>&2 check_err echo "done." } delete_remote_snap() { DATASET=$1 echo "Deleting remote snapshot zones/${DATASET}@${DATE} on ${BACKUPZ}..." ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ zfs destroy -r zones/${IDBACKUPZ}/data/${SOURCEGZ}/${DATASET}@${DATE} 2>/dev/null 1>&2 check_err echo "done." } send_snap () { DATASET=$1 echo "Sending snapshot to ${BACKUPZ}..." zfs send zones/${DATASET}@${DATE} | ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ zfs receive -F zones/${IDBACKUPZ}/data/${SOURCEGZ}/${DATASET} check_err echo "done." } # main echo "--- BACKUP_ZONE: ${IDBACKUPZ} BACKUP_ZONE_IP: ${BACKUPZ} UUID to backup: ${UUID} DATE of backup: ${DATE} ---" check_snap ${UUID} if [ $? -ne 0 ]; then echo "There is no snapshot available of ${UUID}" create_snap ${UUID} else echo "Snapshot of ${UUID} already available" echo "done." fi check_remote_dataset ${UUID} if [ $? -eq 0 ]; then delete_remote_dataset ${UUID} else echo "There is no remote dataset of ${UUID}" echo "done." fi send_snap ${UUID} check_remote_snap ${UUID} if [ $? -eq 0 ]; then delete_remote_snap ${UUID} else echo "There is no remote snapshot of ${UUID}" echo "done." fi check_snap ${UUID} if [ $? -eq 0 ]; then delete_local_snap ${UUID} fi # we check this UUID for additional datasets echo "Looking for addtional children datasets in ${UUID}..." DATASET=`vmadm get ${UUID} | json datasets.0 | sed 's/zones\///' | tr -d '\n'` echo "done." if [ ! -z "${DATASET}" ]; then echo "Finded children dataset: ${DATASET}" check_snap ${DATASET} if [ $? -ne 0 ]; then create_snap ${DATASET} else echo "Snapshot of ${DATASET} already available" echo "Skipping create snapshot..." fi send_snap ${DATASET} else echo "No children datasets finded." fi # we send the config echo "Sending config to ${BACKUPZ}..." zonecfg -z ${UUID} export | ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ "cat >/data/${SOURCEGZ}/${UUID}/${UUID}.cfg" check_err echo "done."