bash-scripts/backup-yunohost.sh

99 lines
3.4 KiB
Bash
Raw Normal View History

2024-06-10 21:00:59 +02:00
#!/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
2024-06-11 13:06:06 +02:00
# delete max. 3 old backups per run
2024-06-10 21:00:59 +02:00
for i in 1 2 3
do
NUMBACKUPS=`ssh ${HOST} sudo yunohost backup list | grep -- '-' | wc -l`
ERR=$?
2024-06-11 13:06:06 +02:00
if [ ${ERR} -ne 0 ]
2024-06-10 21:00:59 +02:00
then
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}
2024-06-11 13:06:06 +02:00
# keep 6 daily backups
for i in {0..5}; do ((keep[$(date +%Y%m%d -d "-$i day")]++)); done
# keep 3 weekly backups
for i in {0..2}; do ((keep[$(date +%Y%m%d -d "sunday-$((i+1)) week")]++)); done
# keep 11 monthly backups
for i in {0..10}; do
2024-06-10 21:00:59 +02:00
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
2024-06-10 21:00:59 +02:00
do
DATE=`echo $i | cut -c1-8`
echo ${!keep[@]} | grep $DATE >/dev/null
if [ $? -ne 0 ]
then
echo pwd `pwd`
2024-06-10 21:00:59 +02:00
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