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
2024-06-10 21:08:52 +02:00
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
2024-06-10 21:08:52 +02:00
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