Reviewed-on: https://gitea.open6hosting.com/Open6Hosting/smartos-bin/pulls/1master
| @@ -0,0 +1,32 @@ | |||||
| <?xml version='1.0'?> | |||||
| <!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'> | |||||
| <service_bundle type='manifest' name='export'> | |||||
| <service name='perl/fastcgi' type='service' version='0'> | |||||
| <create_default_instance enabled='true'/> | |||||
| <single_instance/> | |||||
| <dependency name='network' grouping='require_all' restart_on='error' type='service'> | |||||
| <service_fmri value='svc:/milestone/network:default'/> | |||||
| </dependency> | |||||
| <dependency name='filesystem-local' grouping='require_all' restart_on='none' type='service'> | |||||
| <service_fmri value='svc:/system/filesystem/local:default'/> | |||||
| </dependency> | |||||
| <exec_method name='start' type='method' exec='%{app} -l %{address}:%{port} -n %{procs} -p %{pidfile} -e -d' timeout_seconds='60'/> | |||||
| <exec_method name='stop' type='method' exec='kill `cat %{pidfile}`' timeout_seconds='60'/> | |||||
| <property_group name='application' type='application'> | |||||
| <propval name='app' type='astring' value='/data/www/open6hosting.com/web/o6h/script/o6h_fastcgi.pl'/> | |||||
| <propval name='address' type='astring' value='127.0.0.1'/> | |||||
| <propval name='port' type='astring' value='8986'/> | |||||
| <propval name='procs' type='astring' value='5'/> | |||||
| <propval name='pidfile' type='astring' value='/var/run/o6h_fastcgi.pid'/> | |||||
| </property_group> | |||||
| <template> | |||||
| <common_name> | |||||
| <loctext xml:lang='C'>Open6Hosting WEBAPP daemon</loctext> | |||||
| </common_name> | |||||
| </template> | |||||
| </service> | |||||
| </service_bundle> | |||||
| @@ -2,16 +2,32 @@ | |||||
| usage() | 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 | exit 1 | ||||
| } | } | ||||
| while getopts "z:" opt; | |||||
| while getopts "z:d:r:l:s:t:" opt; | |||||
| do | do | ||||
| case "$opt" in | case "$opt" in | ||||
| z) | z) | ||||
| UUID=$OPTARG | UUID=$OPTARG | ||||
| ;; | ;; | ||||
| d) | |||||
| DAYS=$OPTARG | |||||
| ;; | |||||
| r) | |||||
| RFOLDER=$OPTARG | |||||
| ;; | |||||
| l) | |||||
| LFOLDER=$OPTARG | |||||
| ;; | |||||
| s) | |||||
| SERVER=$OPTARG | |||||
| ;; | |||||
| t) | |||||
| TYPE=$OPTARG | |||||
| ;; | |||||
| *) | *) | ||||
| usage | usage | ||||
| ;; | ;; | ||||
| @@ -20,48 +36,66 @@ done | |||||
| shift $((OPTIND-1)) | shift $((OPTIND-1)) | ||||
| if [ -z "${UUID}" ]; then | |||||
| if [ -z "${UUID}" || -z "${DAYS}" || -z "${RFOLDER}" || -z "${LFOLDER}" || -z "${SERVER}" && -z "${TYPE}" ]; then | |||||
| usage | usage | ||||
| fi | fi | ||||
| BRAND=`/usr/sbin/vmadm get $UUID | json brand | tr -d '\n'` | 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 | fi | ||||
| mkdir -p $RUTADESTINO/$UUID | |||||
| mkdir -p $LFOLDER/$UUID | |||||
| if [ $? != 0 ]; then | if [ $? != 0 ]; then | ||||
| echo "FAIL TO CREATE FOLDER $UUID." | echo "FAIL TO CREATE FOLDER $UUID." | ||||
| umount $RUTADESTINO | |||||
| umount $LFOLDER | |||||
| exit | exit | ||||
| fi | 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() | snapshot() | ||||
| { | { | ||||
| /usr/sbin/zfs snapshot zones/$1@`date +%Y%m%d` | /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 | snapshot $UUID | ||||
| if [ $BRAND = "kvm" ]; then | |||||
| snapshot $UUID-disk0 | |||||
| if [ $BRAND = "kvm" ] | |||||
| then | |||||
| snapshot ${UUID}-disk0 | |||||
| elif [ $BRAND = "bhyve" ] | |||||
| then | |||||
| snapshot ${UUID}/disk0 | |||||
| fi | 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 | |||||
| @@ -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." | |||||
| @@ -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 | |||||