diff --git a/zonebackuptozone.sh b/zonebackuptozone.sh new file mode 100644 index 0000000..652ea02 --- /dev/null +++ b/zonebackuptozone.sh @@ -0,0 +1,85 @@ +#!/usr/bin/bash + +usage() +{ + echo "Usage: $0 [ -s hostname ] [ -z UUID ] [ -b backupzone ] [ -i idbackupzone ]" >&2 + exit 1 +} + +check_err() +{ + STATUS=$? + if [ ${STATUS} -ne 0 ]; then + echo "Unexpected error: ${STATUS}" + exit ${STATUS} + fi +} + +check_snap() +{ + ZONE=$1 + zfs list -t snapshot zones/${ZONE}@`date +%Y%m%d` 2&>/dev/null 1>&2 +} + +create_snap() +{ + ZONE=$1 + echo "Creating snapshot of ${ZONE}..." + zfs snapshot zones/${ZONE}@`date +%Y%m%d` + check_err + echo "done." +} + +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 + +echo "Checking for snapshot of ${UUID}" +check_snap ${UUID} +if [ $? -ne 0 ]; then + create_snap ${UUID} +else + echo "Snapshot of ${UUID} already available..." + echo "done." +fi + +echo "Sending snapshot to ${BACKUPZ}..." +zfs send zones/${UUID}@`date +%Y%m%d` | ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ zfs receive zones/${IDBACKUPZ}/data/${SOURCEGZ}/${UUID} +check_err +echo "done." + +echo "Sending config to ${BACKUPZ}..." +zonecfg -z ${UUID} export | ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ "cat >/data/${SOURCEGZ}/${UUID}.cfg" +check_err +echo "done."