#!/usr/bin/bash usage() { echo "Usage: $0 -z UUID -h hostname" >&2 exit 1 } while getopts "z:h:" opt; do case "$opt" in z) UUID=$OPTARG ;; h) SERVER=$OPTARG ;; *) usage ;; esac done shift $((OPTIND-1)) if [ -z "${UUID}" ] || [ -z "${SERVER}" ]; then usage fi KEYFILE="/usbkey/ssh/id_rsa" DESTINYPORT="2221" SSH="ssh -i $KEYFILE -p $DESTINYPORT" SCP="scp -P $DESTINYPORT -i $KEYFILE" CFG="/zones/tools/cfg" BRAND=`/usr/sbin/vmadm get ${UUID} | json brand | tr -d '\n'` ZONEPATH=`vmadm get ${UUID} | json zonepath | tr -d '\n' | sed 's/\///'` # chequeamos la existencia del archivo llave if [ ! -f $KEYFILE ]; then echo "ssh $KEYFILE inexistent!" echo "Create it please" exit 1 fi check() { if [ $1 != 0 ]; then echo "exiting ... $1" exit $1 else echo "done." fi } snapshot() { echo "creando snapshot de $1 ..." zfs snapshot $1@`date +%Y%m%d` check $? echo "enviando snapshot de $1 a $SERVER ..." zfs send $1@`date +%Y%m%d` | $SSH $SERVER zfs receive $1 check $? echo "creando snapshot incremental de $1 ..." zfs snapshot $1@`date +%Y%m%d`.incremental check $? echo "enviando snapshot incremental de $1 a $SERVER ..." zfs send -i $1@`date +%Y%m%d` $1@`date +%Y%m%d`.incremental | $SSH $SERVER zfs receive $1 check $? } # capturamos el alias que vmadm usa en base64 y que da problemas con el mitico zonecfg ALIAS=`vmadm get ${UUID} | json alias | tr -d '\n'` zonecfg -z ${UUID} "select attr name=alias; set value=temporal; end" # creamos snapshot, lo enviamos, creamos incremental y la enviamos snapshot ${ZONEPATH} # verificamos si estamos tratando con una bhyve/kvm y si es asi la respaldamos echo "verificamos filesystems (bhyve|kvm) adicionales..." if [ $BRAND = "kvm" ] || [ $BRAND = "bhyve" ] ; then FILESYSTEM=`vmadm get ${UUID} | json disks.0.zfs_filesystem | tr -d '\n'` snapshot ${FILESYSTEM} fi # verificamos si tenemos datasets adicionales y los enviamos echo "verificamos datasets adicionales..." DATASET=`vmadm get ${UUID} | json datasets.0 | tr -d '\n'` if [ -n "${DATASET}" ]; then snapshot ${DATASET} fi # exportamos configuracion echo "exportamos configuracion..." zonecfg -z ${UUID} export > $CFG/${UUID}.cfg $SCP $CFG/${UUID}.cfg $SERVER:$CFG/${UUID}.cfg # destino echo "enviamos config a destino..." $SSH $SERVER zonecfg -z ${UUID} < $CFG/${UUID}.cfg $SSH $SERVER zoneadm -z ${UUID} attach $SSH $SERVER zoneadm -z ${UUID} halt # reestablecemos el alias que usa vmadm $SSH $SERVER vmadm update ${UUID} alias=${ALIAS} vmadm update ${UUID} alias=${ALIAS} # detenemos la zona en local zoneadm -z ${UUID} halt # iniciamos la zona en remoto $SSH $SERVER zoneadm -z ${UUID} boot # TODO: # - puede haber mas de un FILESYSTEM en la zona, necesitamos iterar por el array y lanzar la funcion snapshot sobre cada uno de ellos # - puede haber mas de un DATASET en la zona, necesitamos iterar por el array y lanzar la funcion snapshot sobre cada uno