diff --git a/duplicacy.sh b/duplicacy.sh new file mode 100644 index 0000000..4334535 --- /dev/null +++ b/duplicacy.sh @@ -0,0 +1,87 @@ +#!/bin/sh + +lockfile="/tmp/duplicacy.lock" +LOGFILE="/var/log/duplicacy/duplicacy_$(date +%Y%m%d-%H%M%S).log" +LATEST_DUPLICACY_VERSION="ls -lha $(dirname "$0")/binaries/ | awk '/-rw/{print substr($9,length($9)-4);exit}'" +LATEST_DUPLICACY_VERSION="2.7.2" + +# make log directory +if [ ! -d $(dirname ${LOGFILE}) ]; then + mkdir $(dirname ${LOGFILE}) > /dev/null +fi + +if [ -e ${lockfile} ] && kill -0 `cat ${lockfile}`; then + echo "duplicacy backup already running" >> ${LOGFILE} + exit +fi + +# make sure the lockfile is removed when we exit and then claim it +trap "rm -f ${lockfile}; exit" INT TERM EXIT +echo $$ > ${lockfile} + +# self update +cd $(dirname "$0") +git pull > /dev/null + +# Duplicacy version update +INSTALLED_DUPLICACY_VERSION=$(duplicacy -h | awk '/VERSION:/{getline; print $1}') +if [ ${LATEST_DUPLICACY_VERSION} != ${INSTALLED_DUPLICACY_VERSION} ] || [ ! -e '/usr/bin/duplicacy' ]; then + # Determine the Kernel and Architecture + KERNEL=$(uname) + ARCH=$(uname -m) + if [ ${KERNEL} == 'Linux' ]; then + if [ ${ARCH} == 'x86_64' ]; then + curl -sSL -o /usr/bin/duplicacy https://github.com/gilbertchen/duplicacy/releases/download/v${LATEST_DUPLICACY_VERSION}/duplicacy_linux_x64_${LATEST_DUPLICACY_VERSION} + chmod +x /usr/bin/duplicacy >> ${LOGFILE} + elif [ ${ARCH} == 'aarch64' ]; then + curl -sSL -o /usr/bin/duplicacy https://github.com/gilbertchen/duplicacy/releases/download/v${LATEST_DUPLICACY_VERSION}/duplicacy_linux_arm64_${LATEST_DUPLICACY_VERSION} + chmod +x /usr/bin/duplicacy >> ${LOGFILE} + else + echo "Kernel Type: ${KERNEL}" + echo "Arch: ${ARCH}" + echo "Arch not supported." + exit + fi + elif [ ${KERNEL} == 'FreeBSD' ]; then + if [ ${ARCH} == 'amd64' ]; then + curl -sSL -o /usr/bin/duplicacy https://github.com/gilbertchen/duplicacy/releases/download/v${LATEST_DUPLICACY_VERSION}/duplicacy_freebsd_x64_${LATEST_DUPLICACY_VERSION} + chmod +x /usr/bin/duplicacy >> ${LOGFILE} + else + echo "Kernel Type: ${KERNEL}" + echo "Arch: ${ARCH}" + echo "Arch not supported." + exit + fi + else + echo "Kernel Type: ${KERNEL}" + echo "Arch: ${ARCH}" + echo "Kernel not supported." + exit + fi +fi + +# check if the /.duplicacy/preferences file exists before continuing +if [ ! -e "/.duplicacy/preferences" ] || [ ! -e "/.duplicacy/filters" ]; then + echo "ERROR: Duplicacy not yet configured. Please refer to readme file" + exit +fi + +# run the backup +cd / +duplicacy -verbose -log backup -stats >> ${LOGFILE} 2>&1 + +# prune the backup +duplicacy -verbose -log prune -keep 0:360 -keep 30:180 -keep 7:30 -keep 1:7 >> ${LOGFILE} 2>&1 + +# copy the backup to offsite but only if the backup id as passed in +if [ "${1}" == "--copyOffsite" ] || [ "${1}" == "-c" ]; then + BACKUP_ID=$(awk '/"id"/{print substr($2,2,length($2)-3);exit}' /.duplicacy/preferences) + duplicacy -verbose -log copy -to GauntBackupCRO -id ${BACKUP_ID} >> ${LOGFILE} 2>&1 + duplicacy -verbose -log copy -to GauntBackupGail -id ${BACKUP_ID} >> ${LOGFILE} 2>&1 +fi + +# compress the logs +gzip $(dirname ${LOGFILE})/*.log + +# clean up lockfile +rm -f ${lockfile} \ No newline at end of file