diff --git a/zonebackuptofile.sh b/zonebackuptofile.sh index a50404c..8d3b107 100755 --- a/zonebackuptofile.sh +++ b/zonebackuptofile.sh @@ -2,16 +2,25 @@ usage() { - echo "Usage: $0 -z UUID" >&2 + echo "Usage: $0 -z UUID -d days -r folder -s server" >&2 exit 1 } -while getopts "z:" opt; +while getopts "z:d:r:s:" opt; do case "$opt" in z) UUID=$OPTARG ;; + d) + DAYS=$OPTARG + ;; + r) + FOLDER=$OPTARG + ;; + s) + SERVER=$OPTARG + ;; *) usage ;; @@ -20,15 +29,15 @@ done shift $((OPTIND-1)) -if [ -z "${UUID}" ]; then +if [ -z "${UUID}" ] || [ -z "${DAYS}" ] || [ -z "${FOLDER}" ] || [ -z "${SERVER}" ]; then usage fi BRAND=`/usr/sbin/vmadm get $UUID | json brand | tr -d '\n'` RUTADESTINO="/zones/tools/mounts" -RUTAORIGEN="/export/ftpbackup/ns3043697.ip-164-132-169.eu" -SERVIDOR="ftpback-rbx3-470.ovh.net" +RUTAORIGEN="/export/ftpbackup/${FOLDER}" +SERVIDOR="${SERVER}" mkdir -p $RUTADESTINO mount $SERVIDOR:$RUTAORIGEN $RUTADESTINO @@ -47,8 +56,8 @@ if [ $? != 0 ]; then exit fi -# mantenemos los backups de los ultimos dos dias -find $RUTADESTINO/$UUID -type f -mtime +3 -delete +# mantain backups of the last N days +find $RUTADESTINO/$UUID -type f -mtime +$DAYS -delete snapshot() { @@ -58,7 +67,7 @@ snapshot() snapshot $UUID -if [ $BRAND = "kvm" ]; then +if [ $BRAND = "kvm" ] || [ $BRAND = "bhyve" ] ; then snapshot $UUID-disk0 elif [ $BRAND = "bhyve" ]; then snapshot $UUID-disk0 diff --git a/zonemigrate.sh b/zonemigrate.sh new file mode 100644 index 0000000..f566869 --- /dev/null +++ b/zonemigrate.sh @@ -0,0 +1,90 @@ +#!/usr/bin/bash + +if [ "$#" -ne 2 ]; then + echo "Illegal number of parameters" + echo "Usage: $0 {UUID} {DESTINYNODE}" + exit 1 +fi + +UUID=$1 +NODODESTINO=$2 + +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 + +snapshot() +{ + zfs snapshot $1@`date +%Y%m%d` + zfs send $1@`date +%Y%m%d` | $SSH $NODODESTINO zfs receive $1 + zfs snapshot $1@`date +%Y%m%d`.incremental + zfs send -i $1@`date +%Y%m%d` $1@`date +%Y%m%d`.incremental | $SSH $NODODESTINO zfs receive $1 +} + +# 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 kvm y si es asi la respaldamos +echo "verificamos filesystems (kvm) adicionales..." + +if [ $BRAND = "kvm" ]; 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 $NODODESTINO:$CFG/${UUID}.cfg + +# destino +echo "enviamos config a destino..." + +$SSH $NODODESTINO zonecfg -z ${UUID} < $CFG/${UUID}.cfg +$SSH $NODODESTINO zoneadm -z ${UUID} attach +$SSH $NODODESTINO zoneadm -z ${UUID} halt + +# reestablecemos el alias que usa vmadm + +$SSH $NODODESTINO 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 $NODODESTINO 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