From 87db388880b0e78e090f148f3d024b7d728d14b6 Mon Sep 17 00:00:00 2001 From: Pablo Sarria Date: Mon, 31 Dec 2018 11:23:25 +0100 Subject: [PATCH 1/4] =?UTF-8?q?a=C3=B1ado=20soporte=20para=20bhyve?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zonebackuptofile.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zonebackuptofile.sh b/zonebackuptofile.sh index d03e603..234cac2 100755 --- a/zonebackuptofile.sh +++ b/zonebackuptofile.sh @@ -58,7 +58,7 @@ snapshot() snapshot $UUID -if [ $BRAND = "kvm" ]; then +if [ $BRAND = "kvm" ] || [ $BRAND = "bhyve" ] ; then snapshot $UUID-disk0 fi From 28378ec31f20bf54cce017d8d465991209adb94c Mon Sep 17 00:00:00 2001 From: Pablo Sarria Date: Wed, 9 Jan 2019 18:38:05 +0100 Subject: [PATCH 2/4] =?UTF-8?q?a=C3=B1ado=20soporte=20para=20argumento=20d?= =?UTF-8?q?e=20dias=20a=20borrar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zonebackuptofile.sh | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/zonebackuptofile.sh b/zonebackuptofile.sh index 234cac2..09bf391 100755 --- a/zonebackuptofile.sh +++ b/zonebackuptofile.sh @@ -2,16 +2,19 @@ usage() { - echo "Usage: $0 -z UUID" >&2 + echo "Usage: $0 -z UUID -d days" >&2 exit 1 } -while getopts "z:" opt; +while getopts "z:d:" opt; do case "$opt" in z) UUID=$OPTARG ;; + d) + DAYS=$OPTARG + ;; *) usage ;; @@ -24,6 +27,10 @@ if [ -z "${UUID}" ]; then usage fi +if [ -z "${DAYS}" ]; then + usage +fi + BRAND=`/usr/sbin/vmadm get $UUID | json brand | tr -d '\n'` RUTADESTINO="/zones/tools/mounts" @@ -47,8 +54,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() { From dd8fdf289a9592a85f237456c741a4f397c93c88 Mon Sep 17 00:00:00 2001 From: Pablo Sarria Date: Wed, 9 Jan 2019 18:59:38 +0100 Subject: [PATCH 3/4] cambio folder y server a parametros en lugar de hardcodearlos --- zonebackuptofile.sh | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/zonebackuptofile.sh b/zonebackuptofile.sh index 09bf391..85bf0a2 100755 --- a/zonebackuptofile.sh +++ b/zonebackuptofile.sh @@ -2,11 +2,11 @@ usage() { - echo "Usage: $0 -z UUID -d days" >&2 + echo "Usage: $0 -z UUID -d days -r folder -s server" >&2 exit 1 } -while getopts "z:d:" opt; +while getopts "z:d:r:s:" opt; do case "$opt" in z) @@ -15,6 +15,12 @@ do d) DAYS=$OPTARG ;; + r) + FOLDER=$OPTARG + ;; + s) + SERVER=$OPTARG + ;; *) usage ;; @@ -23,19 +29,15 @@ done shift $((OPTIND-1)) -if [ -z "${UUID}" ]; then - usage -fi - -if [ -z "${DAYS}" ]; 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 From 51ae92b3d90f4bf0c04d29739fb0d487821ad3f2 Mon Sep 17 00:00:00 2001 From: Pablo Sarria Date: Wed, 9 Jan 2019 19:48:51 +0100 Subject: [PATCH 4/4] =?UTF-8?q?a=C3=B1ado=20el=20zonemigrate.sh=20al=20rep?= =?UTF-8?q?o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zonemigrate.sh | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 zonemigrate.sh 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