#!/bin/bash

#######################################
# BCKROOT=   # Backup root
# SRCDIR=    # Source dir
# BCKDIR=    # Backupdir
# KEEPDAYS=  # Keep days
# BCKOPTS="" # Rsync options
#######################################

function dircheck() {

    #exit if backup root doesn't exist
    [ -d $BCKROOT ] || exit 21
    #exit if backup dir is /
    [ "x$BCKDIR" == "x" ] && exit 23
    #exit if source doesn't exist
    [ -d $BCKSRC ] || exit 25

    #make dirs
    [ -d $BCKDIR ] || mkdir $BCKDIR
    [ -d $BCKDIR/daily ] || mkdir $BCKDIR/daily
    [ -d $BCKDIR/weekly ] || mkdir $BCKDIR/weekly

}

function makebackup() {

    # check backup dirs
    dircheck

    DAY=`date +%u-%a`
    DAYY=`date +%u-%a -d "yesterday"`

    [ -d $BCKDIR/daily/$DAY ] || mkdir $BCKDIR/daily/$DAY
    [ -d $BCKDIR/daily/$DAYY ] || mkdir $BCKDIR/daily/$DAYY

    # get last successful backup
    if [ -L $BCKDIR/current ]; then
	blast=`readlink $BCKDIR/current`
	if [ "x$blast" == "xdaily/$DAY" ]; then
	    blast="daily/$DAYY"
	    echo "- A backup was already done today, regenerating."
	fi
    else
	blast="daily/$DAYY"
    fi

    bsrc=$BCKSRC
    bdst=$BCKDIR/daily/$DAY

    #sync with current
    rsync -a -r -q -E --delete --delete-excluded --force --link-dest=../../$blast $BCKOPTS $bsrc/ $bdst/ # 2>/dev/null

    touch $bdst

    # create current link
    [ -L $BCKDIR/current ] && rm $BCKDIR/current
    ln -s daily/$DAY $BCKDIR/current

}

function rotatebackup() {

    if [ "`date +%u`" == "7" ]; then

	# check backup dirs
	dircheck

	TS=`date +%Y-%m-%d`
	DAY=`date +%u-%a`

	[ -d $BCKDIR/daily/$DAY ] || exit 27

	# Run with low IO
	if [ -x /usr/bin/ionice ] && /usr/bin/ionice -c3 true 2>/dev/null; then
	    IONICE="/usr/bin/ionice -c3"
	fi

	# create weekly
	src=$BCKDIR/daily/$DAY
	dst=$BCKDIR/weekly/$TS
	[ -d $dst ] || mkdir $dst
	$IONICE cp -a -l $src/* $dst/

	$IONICE find $BCKDIR/weekly/ -mindepth 1 -maxdepth 1 -mtime +$KEEPDAYS -exec rm -r {} \;
    fi
}

function backuproute() {

    # The originating script name should be backup-* or rotate-*

    sn=${0##*/}
    func=${sn%%-*}

    echo -n "$func start: "
    date '+%T'

    [ "$func" == "backup" ] && makebackup
    [ "$func" == "rotate" ] && rotatebackup

    echo -n "$func end: "
    date '+%T'

}
