|
|
@@ -2,100 +2,163 @@ |
|
|
|
|
|
|
|
|
usage() |
|
|
usage() |
|
|
{ |
|
|
{ |
|
|
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 |
|
|
|
|
|
|
|
|
echo "Usage: $0 [ -z UUID ] [ -h hostname ] [ -p port ] [ -k KEY ] [ -n name ] [ -d dir ]" >&2 |
|
|
exit 1 |
|
|
exit 1 |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
while getopts "z:d:r:l:s:t:" opt; |
|
|
|
|
|
|
|
|
while getopts "z:h:p:k:n:d:" opt; |
|
|
do |
|
|
do |
|
|
case "$opt" in |
|
|
case "$opt" in |
|
|
z) |
|
|
z) |
|
|
UUID=$OPTARG |
|
|
|
|
|
;; |
|
|
|
|
|
|
|
|
UUID=$OPTARG |
|
|
|
|
|
;; |
|
|
|
|
|
h) |
|
|
|
|
|
HOSTNAME=$OPTARG |
|
|
|
|
|
;; |
|
|
|
|
|
n) |
|
|
|
|
|
NAME=$OPTARG |
|
|
|
|
|
;; |
|
|
|
|
|
p) |
|
|
|
|
|
PORT=$OPTARG |
|
|
|
|
|
;; |
|
|
|
|
|
k) |
|
|
|
|
|
KEY=$OPTARG |
|
|
|
|
|
;; |
|
|
d) |
|
|
d) |
|
|
DAYS=$OPTARG |
|
|
|
|
|
;; |
|
|
|
|
|
r) |
|
|
|
|
|
RFOLDER=$OPTARG |
|
|
|
|
|
;; |
|
|
|
|
|
l) |
|
|
|
|
|
LFOLDER=$OPTARG |
|
|
|
|
|
;; |
|
|
|
|
|
s) |
|
|
|
|
|
SERVER=$OPTARG |
|
|
|
|
|
;; |
|
|
|
|
|
t) |
|
|
|
|
|
TYPE=$OPTARG |
|
|
|
|
|
;; |
|
|
|
|
|
|
|
|
DIR=$OPTARG |
|
|
|
|
|
;; |
|
|
|
|
|
|
|
|
|
|
|
\?) |
|
|
|
|
|
echo "Error: Invalid Option: -${OPTARG}" >&2 |
|
|
|
|
|
usage |
|
|
|
|
|
;; |
|
|
|
|
|
:) |
|
|
|
|
|
echo "Error: -${OPTARG} requires an argument." |
|
|
|
|
|
usage |
|
|
|
|
|
;; |
|
|
*) |
|
|
*) |
|
|
usage |
|
|
|
|
|
;; |
|
|
|
|
|
|
|
|
usage |
|
|
|
|
|
;; |
|
|
esac |
|
|
esac |
|
|
done |
|
|
done |
|
|
|
|
|
|
|
|
shift $((OPTIND-1)) |
|
|
shift $((OPTIND-1)) |
|
|
|
|
|
|
|
|
if [ -z "${UUID}" || -z "${DAYS}" || -z "${RFOLDER}" || -z "${LFOLDER}" || -z "${SERVER}" && -z "${TYPE}" ]; then |
|
|
|
|
|
|
|
|
if [ -z "${UUID}" ] || [ -z "${HOSTNAME}" ] || [ -z ${PORT} ] || [ -z ${KEY} ] || [ -z "${NAME}" ] || [ -z "${DIR}" ]; then |
|
|
usage |
|
|
usage |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
BRAND=`/usr/sbin/vmadm get $UUID | json brand | tr -d '\n'` |
|
|
|
|
|
|
|
|
SSH="ssh -i $KEY -p ${PORT} -o StrictHostKeyChecking=no" |
|
|
|
|
|
DSTDIR="${DIR}/${NAME}" |
|
|
|
|
|
|
|
|
mkdir -p $LFOLDER |
|
|
|
|
|
|
|
|
################# |
|
|
|
|
|
# functions |
|
|
|
|
|
################# |
|
|
|
|
|
|
|
|
if [ $TYPE = "nfs" ]; then |
|
|
|
|
|
OVH="/export/ftpbackup/${RFOLDER}" |
|
|
|
|
|
|
|
|
|
|
|
mount $SERVER:$OVH $LFOLDER |
|
|
|
|
|
|
|
|
create_snap() |
|
|
|
|
|
{ |
|
|
|
|
|
DATASET=$1 |
|
|
|
|
|
echo "Creating snapshot of ${DATASET}..." |
|
|
|
|
|
/usr/sbin/zfs snapshot zones/${DATASET}@`date +%Y%m%d` |
|
|
|
|
|
check_err |
|
|
|
|
|
echo "...done." |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if [ $? != 0 ]; then |
|
|
|
|
|
echo "MOUNT FAILED." |
|
|
|
|
|
umount $LFOLDER |
|
|
|
|
|
exit |
|
|
|
|
|
fi |
|
|
|
|
|
elif [ $TYPE = "smb" ]; then |
|
|
|
|
|
mount -F smbfs //o6h.smartos5:c0c0l1s0@${SERVER}/${RFOLDER} $LFOLDER |
|
|
|
|
|
|
|
|
send_snap() |
|
|
|
|
|
{ |
|
|
|
|
|
DATASET=$1 |
|
|
|
|
|
echo "Sending snapshot of ${DATASET}..." |
|
|
|
|
|
|
|
|
if [ $? != 0 ]; then |
|
|
|
|
|
echo "MOUNT FAILED." |
|
|
|
|
|
exit |
|
|
|
|
|
|
|
|
# taking care for additional datasets |
|
|
|
|
|
SLASH=`echo ${DATASET} | grep -c '/'` |
|
|
|
|
|
|
|
|
|
|
|
if [ ${SLASH} -ne 0 ]; then |
|
|
|
|
|
RENAME=`echo ${DATASET} | sed 's/\//-/'` |
|
|
|
|
|
/usr/sbin/zfs send zones/${DATASET}@`date +%Y%m%d` | ${SSH} ${HOSTNAME} "dd of=${DSTDIR}/${UUID}/${RENAME}.zfs bs=4M" |
|
|
|
|
|
else |
|
|
|
|
|
/usr/sbin/zfs send zones/${DATASET}@`date +%Y%m%d` | ${SSH} ${HOSTNAME} "dd of=${DSTDIR}/${DATASET}/${DATASET}.zfs bs=4M" |
|
|
fi |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
mkdir -p $LFOLDER/$UUID |
|
|
|
|
|
|
|
|
check_err |
|
|
|
|
|
echo "...done." |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if [ $? != 0 ]; then |
|
|
|
|
|
echo "FAIL TO CREATE FOLDER $UUID." |
|
|
|
|
|
umount $LFOLDER |
|
|
|
|
|
exit |
|
|
|
|
|
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 |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
# mantain backups of the last N days |
|
|
|
|
|
#find $LFOLDER/$UUID -type f -mtime +$DAYS -delete |
|
|
|
|
|
|
|
|
check_err() |
|
|
|
|
|
{ |
|
|
|
|
|
STATUS=$? |
|
|
|
|
|
if [ ${STATUS} -ne 0 ]; then |
|
|
|
|
|
echo "Unexpected error: ${STATUS}" |
|
|
|
|
|
exit ${STATUS} |
|
|
|
|
|
fi |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
snapshot() |
|
|
|
|
|
|
|
|
send_config() |
|
|
{ |
|
|
{ |
|
|
/usr/sbin/zfs snapshot zones/$1@`date +%Y%m%d` |
|
|
|
|
|
/usr/sbin/zfs send zones/$1@`date +%Y%m%d` > $LFOLDER/$UUID/$1@`date +%Y%m%d` |
|
|
|
|
|
|
|
|
echo "Sending config to ${HOSTNAME}..." |
|
|
|
|
|
zonecfg -z ${UUID} export | ${SSH} ${HOSTNAME} "dd of=${DSTDIR}/${UUID}/${UUID}.cfg" |
|
|
|
|
|
check_err |
|
|
|
|
|
echo "...done." |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
snapshot $UUID |
|
|
|
|
|
|
|
|
create_dir() |
|
|
|
|
|
{ |
|
|
|
|
|
echo "Creating directory at ${HOSTNAME}..." |
|
|
|
|
|
${SSH} ${HOSTNAME} mkdir -p ${DSTDIR}/${UUID} |
|
|
|
|
|
check_err |
|
|
|
|
|
echo "...done." |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if [ $BRAND = "kvm" ] |
|
|
|
|
|
then |
|
|
|
|
|
snapshot ${UUID}-disk0 |
|
|
|
|
|
elif [ $BRAND = "bhyve" ] |
|
|
|
|
|
then |
|
|
|
|
|
snapshot ${UUID}/disk0 |
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
check_multidataset() |
|
|
|
|
|
{ |
|
|
|
|
|
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 |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/usr/sbin/zonecfg -z $UUID export > $LFOLDER/$UUID/$UUID.`date +%Y%m%d`.cfg |
|
|
|
|
|
|
|
|
################# |
|
|
|
|
|
# main |
|
|
|
|
|
################# |
|
|
|
|
|
|
|
|
if [ $TYPE = "nfs" ]; then |
|
|
|
|
|
umount $LFOLDER |
|
|
|
|
|
|
|
|
echo "--- |
|
|
|
|
|
BACKUP_SERVER: ${HOSTNAME} |
|
|
|
|
|
UUID to backup: ${UUID} |
|
|
|
|
|
---" |
|
|
|
|
|
|
|
|
|
|
|
create_dir ${UUID} |
|
|
|
|
|
|
|
|
|
|
|
check_snap ${UUID} |
|
|
|
|
|
|
|
|
|
|
|
if [ $? -ne 0 ]; then |
|
|
|
|
|
create_snap ${UUID} |
|
|
|
|
|
else |
|
|
|
|
|
echo "Snapshot of ${UUID} already available" |
|
|
|
|
|
echo "...done." |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
## TODO |
|
|
|
|
|
# smb: query for username |
|
|
|
|
|
# smb: query for password |
|
|
|
|
|
|
|
|
send_snap ${UUID} |
|
|
|
|
|
|
|
|
|
|
|
check_multidataset |
|
|
|
|
|
|
|
|
|
|
|
send_config |