#
# rdiff-backup handler script for backupninja
# requires rdiff-backup
#

getconf options
getconf testconnect yes
getconf nicelevel 0

setsection source
getconf type; sourcetype=$type
getconf label
getconf keep 60
getconf include
getconf vsinclude
getconf exclude

### DESTINATION ###

setsection dest
getconf directory; destdir=$directory
# strip trailing /
destdir=${destdir%/}
getconf type; desttype=$type
getconf user; destuser=$user
getconf host; desthost=$host

# See if vservers are configured
if [ "$vservers" = "yes" ]
then
	if [ ! -d $VROOTDIR ]
	then
		fatal "vservers enabled, but $VROOTDIR does not exist!"
	else
		info "vserver method enabled"
		usevserver=1
	fi
fi

[ "$destdir" != "" ] || fatal "Destination directory not set"

if [ "$desttype" == "remote" ]; then
	# see if we can login
	if [ "$testconnect" == "yes" ]; then
		hostalive=0
	    debug "ssh -o PreferredAuthentications=publickey $desthost -l $destuser 'echo -n 1'"
		ret=`ssh -o PreferredAuthentications=publickey $desthost -l $destuser 'echo -n host is alive'`
		if echo $ret | grep "host is alive"; then
			debug "Connected to $desthost as $destuser successfully"
		else
			fatal "Can't connect to $desthost as $destuser."
		fi
	fi
	# see that rdiff-backup has the same version as here
	debug "ssh -o PreferredAuthentications=publickey $desthost -l $destuser '$RDIFFBACKUP -V'\""
	remoteversion=`ssh -o PreferredAuthentications=publickey $desthost -l $destuser "$RDIFFBACKUP -V | grep rdiff-backup"`
	localversion=`$RDIFFBACKUP -V`
	if [ "$remoteversion" != "$localversion" ]; then
		fatal "rdiff-backup does not have the same version on this computer and the backup server."
	fi
	execstr_serverpart="$destuser@$desthost::$destdir/$label"
else
	execstr_serverpart="$destdir/$label"
fi

### SOURCE ###

[ "$sourcetype" == "local" ] || fatal "Only local source type supported"
[ "$include" != "" -o "$vsinclude" != "" ] || fatal "No source includes specified"
#TODO should I test for vsinclude if usevservers=1?

execstr_clientpart="/"
	
## REMOVE OLD BACKUPS

if [ "`echo $keep | tr -d 0-9`" == "" ]; then
	keep="${keep}D"
fi

removestr="rdiff-backup --force --remove-older-than $keep "
if [ "$desttype" == "remote" ]; then
	removestr="${removestr}${destuser}@${desthost}::"
fi
removestr="${removestr}${destdir}/${label}";

debug "$removestr"
if [ ! $test ]; then
	output=`$removestr 2>&1`
	code=$?
	if [ "$code" == "0" ]; then
		debug $output
		info "Removing backups older than $keep days succeeded."
	else
		warning $output
		warning "Failed removing backups older than $keep."
	fi
fi

## EXECUTE ##

execstr="$RDIFFBACKUP $options --print-statistics "

# TODO: order the includes and excludes

# excludes
for i in $exclude; do
	str="${i//__star__/*}"
	execstr="${execstr}--exclude '$str' "
done
	
# includes 
for i in $include; do
	str="${i//__star__/*}"
	execstr="${execstr}--include '$str' "
done

# vsinclude
if [ $usevserver ] 
then
	for vserver in `ls $VROOTDIR | grep -E -v "lost+found|ARCHIVES"`
	do
		for vi in $vsinclude
		do
			str="${vi//__star__/*}"
			execstr="${execstr}--include '$VROOTDIR/$vserver$str' "
		done
	done
fi

# exclude everything else
execstr="${execstr}--exclude '/*' "
		
# include client-part and server-part
execstr="${execstr}$execstr_clientpart $execstr_serverpart"

debug "$execstr"
if [ ! $test ]; then
	output=`nice -n $nicelevel su -c "$execstr" 2>&1`
	code=$?
	if [ "$code" == "0" ]; then
		debug $output
		info "Successfully finished backing up source $label"
	else
		warning $output
		warning "Failed backup up source $label"
	fi
fi	

return 0