diff --git a/delete-cores.sh b/delete-cores.sh new file mode 100755 index 0000000..6bb0663 --- /dev/null +++ b/delete-cores.sh @@ -0,0 +1,2 @@ +#!/usr/bin/bash +zfs list -H | grep "cores$" | grep -v "global" | awk '$2 ~ /G/ { print "find",$5,"-type f -delete"}' | /usr/bin/sh diff --git a/zonebackuptofile.sh b/zonebackuptofile.sh index e3a8e98..9595629 100755 --- a/zonebackuptofile.sh +++ b/zonebackuptofile.sh @@ -2,100 +2,163 @@ 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 } -while getopts "z:d:r:l:s:t:" opt; +while getopts "z:h:p:k:n:d:" opt; do case "$opt" in z) - UUID=$OPTARG - ;; + UUID=$OPTARG + ;; + h) + HOSTNAME=$OPTARG + ;; + n) + NAME=$OPTARG + ;; + p) + PORT=$OPTARG + ;; + k) + KEY=$OPTARG + ;; 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 done 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 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 -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 -## TODO -# smb: query for username -# smb: query for password +send_snap ${UUID} + +check_multidataset + +send_config