Преглед изворни кода

Merge pull request 'fusiono master con develop' (#1) from develop into master

Reviewed-on: https://gitea.open6hosting.com/Open6Hosting/smartos-bin/pulls/1
master
psarria пре 5 година
родитељ
комит
a56c2c53a5
4 измењених фајлова са 348 додато и 23 уклоњено
  1. +32
    -0
      perl_fastcgi.xml
  2. +57
    -23
      zonebackuptofile.sh
  3. +135
    -0
      zonebackuptozone.sh
  4. +124
    -0
      zonemigrate.sh

+ 32
- 0
perl_fastcgi.xml Прегледај датотеку

@@ -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>

+ 57
- 23
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

+ 135
- 0
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."

+ 124
- 0
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

Loading…
Откажи
Сачувај