#!/bin/ksh
#
# This script handles multi-layer backup rotation schem.
# 
# In level-0 rotation, which is to be used by the real
# physical backup process, the oldest backup directory
# is not deleted but updated as the newest backup directory.
#       % mv backup.3 backup.tmp	
#	% mv backup.2 backup.3
#	% mv backup.1 backup.2
#	% mv backup.0 backup.1
#	% mv backup.tmp backup.0
#	% cp -al backup.1 backup.0
#	% ... performing physical backup to backup.0 ....
# 
# In level-1,2,, rotation, the oldest backup is also
# reused as the base for newest backup. But the newest backup
# is not from performing physical backup but by copying
# from the the newest lower level backup.
#
#	% mv backup_1.3 backup_1.tmp
#	% mv backup_1.2 backup_1.3
#	% mv backup_1.1 backup_1.2
#	% mv backup_1.0 backup_1.1
#	% mv backup_1.tmp backup_1.0
#	% cp -al backup.0 backup_1.0
#	
#
# One way to use this script is to perform level-0 backup
# hourly (or every two hours)  and level-1 backup
# daily, level-2 backup weekly, and level-3 backup monthly.
#
#

# 
PATH=/bin:/usr/bin

prog=$(basename $0)

## echo $prog

usage() {
    echo "Usage: $prog backup_dir backup_base_name backup_level"
    echo "    backup_dir: absolute path"
    echo "    backup_level: 0, 1, 2, 3"
    exit 2
}

error() {
    echo "ERROR: $*" >& 2
    exit 1
}

# check parameters
[ "$#" != "3" ] && usage
dir=$1
base="$1/$2"
level=$3

case $level in
    0) suffix="" 
	cp_from_suffix=".1" 
	;;
    1) suffix="_L1"
	cp_from_suffix=".0" 
	;;
    2) suffix="_L2" 
	cp_from_suffix="_L1.0"
	;;
    3) suffix="_L3" 
	cp_from_suffix="_L2.0"
	;;
    *) usage ;;
esac


[ ! -d "$dir" ] && error "$dir is not a directory"

## rotate backup directories
rotate_backup()
{
	name=$base$suffix
	rm -rf "${name}.tmp"
	[ -d "${name}.3" ] && mv "${name}.3" "${name}.tmp"
	[ -d "${name}.2" ] && mv "${name}.2" "${name}.3"
	[ -d "${name}.1" ] && mv "${name}.1" "${name}.2"
	[ -d "${name}.0" ] && mv "${name}.0" "${name}.1"
	[ -d "${name}.tmp" ] && mv "${name}.tmp" "${name}.0"
	# in level-1,2,3 backup we always throw away oldest version
	# (in level-0 backup we reused the oldest version to build
	# the newest version)
	[ "$level" != "0" ] && rm -rf "${name}.0"	
	[ ! -d "${name}.0" ] && mkdir -p "${name}.0"

	cp_from=$base$cp_from_suffix
	[ -d "$cp_from" ] && cp -alf "$cp_from/." "${name}.0/"
}


rotate_backup
