diff --git a/perl_fastcgi.xml b/perl_fastcgi.xml new file mode 100644 index 0000000..968a968 --- /dev/null +++ b/perl_fastcgi.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zonebackuptofile.sh b/zonebackuptofile.sh index d03e603..e3a8e98 100755 --- a/zonebackuptofile.sh +++ b/zonebackuptofile.sh @@ -2,16 +2,32 @@ usage() { - echo "Usage: $0 -z UUID" >&2 + echo "Usage: $0 -z UUID -d days -r remote_folder -l local_folder -s server -t type" >&2 + echo "ex: $0 -z bbba5ecb-5bda-47a5-e103-a6bfa368bf68 -d 1 -r remote_folder -l /zone/tools/nfsshare -s 192.168.5.243 -t nfs" >&2 exit 1 } -while getopts "z:" opt; +while getopts "z:d:r:l:s:t:" opt; do case "$opt" in z) UUID=$OPTARG ;; + d) + DAYS=$OPTARG + ;; + r) + RFOLDER=$OPTARG + ;; + l) + LFOLDER=$OPTARG + ;; + s) + SERVER=$OPTARG + ;; + t) + TYPE=$OPTARG + ;; *) usage ;; @@ -20,48 +36,66 @@ done shift $((OPTIND-1)) -if [ -z "${UUID}" ]; then +if [ -z "${UUID}" || -z "${DAYS}" || -z "${RFOLDER}" || -z "${LFOLDER}" || -z "${SERVER}" && -z "${TYPE}" ]; 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" - -mkdir -p $RUTADESTINO -mount $SERVIDOR:$RUTAORIGEN $RUTADESTINO - -if [ $? != 0 ]; then - echo "MOUNT FAILED." - umount $RUTADESTINO - exit +mkdir -p $LFOLDER + +if [ $TYPE = "nfs" ]; then + OVH="/export/ftpbackup/${RFOLDER}" + + mount $SERVER:$OVH $LFOLDER + + if [ $? != 0 ]; then + echo "MOUNT FAILED." + umount $LFOLDER + exit + fi +elif [ $TYPE = "smb" ]; then + mount -F smbfs //o6h.smartos5:c0c0l1s0@${SERVER}/${RFOLDER} $LFOLDER + + if [ $? != 0 ]; then + echo "MOUNT FAILED." + exit + fi fi -mkdir -p $RUTADESTINO/$UUID +mkdir -p $LFOLDER/$UUID if [ $? != 0 ]; then echo "FAIL TO CREATE FOLDER $UUID." - umount $RUTADESTINO + umount $LFOLDER 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 $LFOLDER/$UUID -type f -mtime +$DAYS -delete snapshot() { /usr/sbin/zfs snapshot zones/$1@`date +%Y%m%d` - /usr/sbin/zfs send zones/$1@`date +%Y%m%d` > $RUTADESTINO/$UUID/$1@`date +%Y%m%d` + /usr/sbin/zfs send zones/$1@`date +%Y%m%d` > $LFOLDER/$UUID/$1@`date +%Y%m%d` } snapshot $UUID -if [ $BRAND = "kvm" ]; then - snapshot $UUID-disk0 +if [ $BRAND = "kvm" ] +then + snapshot ${UUID}-disk0 +elif [ $BRAND = "bhyve" ] +then + snapshot ${UUID}/disk0 fi -/usr/sbin/zonecfg -z $UUID export > $RUTADESTINO/$UUID/$UUID.`date +%Y%m%d`.cfg +/usr/sbin/zonecfg -z $UUID export > $LFOLDER/$UUID/$UUID.`date +%Y%m%d`.cfg + +if [ $TYPE = "nfs" ]; then + umount $LFOLDER +fi -umount $RUTADESTINO +## TODO +# smb: query for username +# smb: query for password diff --git a/zonebackuptozone.sh b/zonebackuptozone.sh new file mode 100755 index 0000000..523effa --- /dev/null +++ b/zonebackuptozone.sh @@ -0,0 +1,135 @@ +#!/usr/bin/bash + +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 snapshot of ${ZONE}..." + zfs list -t snapshot zones/${ZONE}@`date +%Y%m%d` 2>/dev/null 1>&2 +} + +create_snap() +{ + DS=$1 + echo "Creating snapshot of ${DS}..." + zfs snapshot zones/${DS}@`date +%Y%m%d` + check_err + echo "done." +} + +send_snap () +{ + DATASET=$1 + echo "Sending snapshot to ${BACKUPZ}..." + zfs send zones/${DATASET}@`date +%Y%m%d` | ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ zfs receive -F zones/${IDBACKUPZ}/data/${SOURCEGZ}/${DATASET} + check_err + echo "done." + echo "Deleting snapshot on ${BACKUPZ}..." + ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ zfs destroy zones/${IDBACKUPZ}/data/${SOURCEGZ}/${DATASET}@`date +%Y%m%d` + check_err + echo "done." + echo "deleting local snapshot zones/${DATASET}@`date +%Y%m%d`..." + zfs destroy zones/${DATASET}@`date +%Y%m%d` + check_err + echo "done." +} + +# main + +echo "--- +BACKUP_ZONE: ${IDBACKUPZ} +BACKUP_ZONE_IP: ${BACKUPZ} +UUID to backup: ${UUID} +---" + +check_snap ${UUID} + +if [ $? -ne 0 ]; then + create_snap ${UUID} +else + echo "Snapshot of ${UUID} already available" + echo "done." +fi + +send_snap ${UUID} + +# 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." diff --git a/zonemigrate.sh b/zonemigrate.sh new file mode 100755 index 0000000..1a9b69d --- /dev/null +++ b/zonemigrate.sh @@ -0,0 +1,124 @@ +#!/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