#!/bin/bash
# /usr/local/bin/darlimit.fey
# http://crystalfaeries.net/posix/bin/darlimit.fey
# celeste:crystalfaery DARLIMIT.FEY 2016-10-05 11:03:36+00:00
# darlimit deletes old diskarchive (dar) backups to prevent disk full condition
cd /var/cache/dar/ # where are the .dar backups we delete?
cd -P . # convert from symbolic to physical path
backuppartition="/dev/mapper/fey--vg-var" # with more code we could compute this in a future version
limit=/etc/darlimit # 1st line of darlimit config file has the number percent disk partition fullness permitted (e.g. "90")
log=/var/log/darchive.log # combined darchive log
touch /tmp/darlimit$$ # one-shot e-mail flag to prevent runaway e-mail notices
let sleep=1; while sleep "$sleep"m
do
let darlimit=`head -n 1 "$limit" | cut -f 1` # re-fetch from config file in case administrator changed it while we are running
let percent=$(/usr/local/bin/df -P -T -l | /bin/grep $backuppartition | sed 's/\%.*$// ; s/^.* //') || exit 2
let sleep=100-$percent # sleep less the fuller we are
if [[ $percent -gt $darlimit ]]
then # we have exceeded our disk usage limit
oldest=`ls -rt $(find . -iname '*.dar' -print) | head -n 1` || exit 3
if [ "$oldest" = "" ]
then # we have no more .dar files left to remove, what else can we free up?
# uncomment this if /var/cache/rsnapshot does not have it's own partition, but shares with the system
# /usr/local/bin/thumbnail_expire "$sleep" & # spawn background task to free diskspace in general
if [ -f /tmp/darlimit$$ ]
then # one shot e-mail flag exists, this is our one shot to notify administrator
rm /tmp/darlimit$$
echo "Process $$ Disk Usage: $percent \ntouch /tmp/darlimit$$ to reenable e-mail notification." | mail -s "$(hostname):$(basename $0) OUT OF DISK SPACE" root &
aptitude autoclean # first level package cleaning
#apt-get autoclean # first level package cleaning
aptitude clean # second level package cleaning
#apt-get clean # second level package cleaning
else # one shot e-mail flag is gone, we already notified the administrator
# we are now out of disk space and are out of ways to free up space
# at this point our only remaining option is to kill the darchive process eating disk
pkill dar # so long, farewell, goodbye
echo "`/usr/local/bin/now` $0 killing dar for lack of diskspace" >> $log
echo "`/usr/local/bin/now` $0 killing dar for lack of diskspace" |& mail -s "$(hostname):$(basename $0) darchive killed." root &
touch /tmp/darlimit$$ # one shot e-mail flag re-enabled for next dar execution
fi
else # we have .dar files we can remove
rm "$oldest"
echo "removed $oldest" | mail -s "$(hostname):$(basename $0) removed $oldest" root &
fi
fi
if [[ $sleep -lt 1 ]]
then
let sleep=1 # minimum sleep time so somebody besides me can also run
fi
done
syntax highlighted by Code2HTML, v. 0.9.1