#!/usr/bin/env bash #set -euo pipefail #trap 's=$?; echo >&2 "$0: Error on line "$LINENO": $BASH_COMMAND"; exit $s' ERR TARGET=/yunohost-backups HOST=yunohost TODAY_DATE=`date '+%F'` LOGFILE=${TARGET}/$TODAY_DATE.$$.log ERR=0 NUMRETAINBACKUPS=10 echo "yunohost backup begin:" >$LOGFILE date >>$LOGFILE for i in 1 2 3 do NUMBACKUPS=`ssh ${HOST} sudo yunohost backup list | grep -- '-' | wc -l` ERR=$? if [ ${ERR} == 0 ] then echo number of backups on yunohost ${NUMBACKUPS} >>$LOGFILE echo number of backups to keep ${NUMRETAINBACKUPS} >>$LOGFILE else echo yunohost could not list backups >>$LOGFILE date >>$LOGFILE exit 1 fi if [ ${NUMBACKUPS} -gt ${NUMRETAINBACKUPS} ] then BACKTODEL=`ssh ${HOST} sudo yunohost backup list | grep -- '-' | head -1 | cut -d" " -f4` echo 'the following backup will be deleted:' >>$LOGFILE 2>&1 ssh ${HOST} sudo yunohost backup info ${BACKTODEL} >>$LOGFILE 2>&1 ssh ${HOST} "sudo yunohost backup delete ${BACKTODEL}" >>$LOGFILE 2>&1 fi done ssh ${HOST} sudo yunohost backup create >>$LOGFILE 2>&1 ERR=$? if [ ${ERR} == 0 ] then echo yunohost backup successfully created >>$LOGFILE else echo yunohost backup did NOT complete >>$LOGFILE fi echo "yunohost backup ended:" >>$LOGFILE date >>$LOGFILE BACKUPFILE=`ssh ${HOST} sudo yunohost backup list --with-info -H | grep -A 3 $TODAY_DATE | grep 'path:' | cut -d":" -f2 | tr -d " " | tail -1` scp ${HOST}:${BACKUPFILE} ${TARGET} && echo ${BACKUPFILE} successfully copied to ${TARGET}! >>$LOGFILE 2>&1 ls -lisah ${TARGET}/`basename ${BACKUPFILE}` >>$LOGFILE gzip -9 ${TARGET}/`basename ${BACKUPFILE}` >>$LOGFILE 2>&1 # algo to create the "keep"-array copied from https://serverfault.com/questions/575163/how-to-keep-daily-backups-for-a-week-weekly-for-a-month-monthly-for-a-year-a # it keeps 8 daily backups and 5 weekly (every sunday) backups # in addition 13 monthly backups (first sunday of every month) and 6 yearly backups (first sunday of every year) cd ${TARGET} # keep 8 daily backups for i in {0..7}; do ((keep[$(date +%Y%m%d -d "-$i day")]++)); done # keep 5 weekly backups for i in {0..4}; do ((keep[$(date +%Y%m%d -d "sunday-$((i+1)) week")]++)); done # keep 13 monthly backups for i in {0..12}; do DW=$(($(date +%-W)-$(date -d $(date -d "$(date +%Y-%m-15) -$i month" +%Y-%m-01) +%-W))) for (( AY=$(date -d "$(date +%Y-%m-15) -$i month" +%Y); AY < $(date +%Y); AY++ )); do ((DW+=$(date -d $AY-12-31 +%W))) done ((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++)) done # keep 6 yearly backups for i in {0..5}; do DW=$(date +%-W) for (( AY=$(($(date +%Y)-i)); AY < $(date +%Y); AY++ )); do ((DW+=$(date -d $AY-12-31 +%W))) done ((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++)) done #echo ${!keep[@]} echo space in filesys of ${TARGET} before pruning backups >>$LOGFILE 2>&1 df -h ${TARGET} >>$LOGFILE 2>&1 for i in *.tar.gz do DATE=`echo $i | cut -c1-8` echo ${!keep[@]} | grep $DATE >/dev/null if [ $? -ne 0 ] then echo pwd `pwd` echo deleting $DATE >>$LOGFILE 2>&1 rm ${DATE}*.tar.* >>$LOGFILE 2>&1 rm ${DATE}*.log.* >>$LOGFILE 2>&1 fi done echo space in filesys of ${TARGET} after pruning backups >>$LOGFILE 2>&1 df -h ${TARGET} >>$LOGFILE 2>&1 echo "$0 on `hostname` ended:" >>$LOGFILE date >>$LOGFILE # Achtung, hier wird es kompliziert :) nach diesem Kommando keine Umleitung in $LOGFILE mehr mv ${LOGFILE} ${TARGET}/`basename ${BACKUPFILE} .tar`.log gzip -9 ${TARGET}/`basename ${BACKUPFILE} .tar`.log