#!/usr/bin/env rc

# Dbkp - Backup and restore denote directory
# Usage: Dbkp                    (create backup)
#        Dbkp YYYYMMddTHHmmss    (restore backup)

# Configuration
backupdir=$HOME/Dbkp


# get denotedir
denotedir=`{9p read denote/dir}
if(~ $#denotedir 0 || ~ $denotedir '') {
	echo 'error: could not read denote directory from server' >[1=2]
	echo 'ensure denote server is running' >[1=2]
	exit 1
}
denotebase=`{basename $denotedir}

# create backupdir
mkdir -p $backupdir

# parse args
if(~ $#* 0) { # backup mode
	timestamp=`{9 date | awk 'BEGIN {
		m["Jan"]=1; m["Feb"]=2; m["Mar"]=3; m["Apr"]=4
		m["May"]=5; m["Jun"]=6; m["Jul"]=7; m["Aug"]=8
		m["Sep"]=9; m["Oct"]=10; m["Nov"]=11; m["Dec"]=12
	}{
		split($4, t, ":")
		printf "%s%02d%02dT%s%s%s\n", $6, m[$2], $3, t[1], t[2], t[3]
	}'}

	backupfile=$backupdir/$timestamp'-'$denotebase'-dbkp.tar.gz'

	# create temporary directory and copy denote contents there
	timestampdir=$backupdir/$timestamp
	mkdir -p $timestampdir
	cp -rf $denotedir/* $timestampdir

	# build tarball and cleanup temp dir
	echo 'Creating backup:' $backupfile
	cd $backupdir
	9 tar cvzf $backupfile $timestamp
	rm -rf $timestampdir

	if(test -f $backupfile) {
		echo 'Backup created successfully'
	}
	if not {
		echo 'error: backup failed' >[1=2]
		exit 1
	}
}

if not if(~ $#* 1) { # restore or list mode

	# check for list mode
	if(~ $1 l) {
		ls $backupdir | awk -F'[-.]' '{print $1}' | awk -F'/' '{print $NF}'
		exit 0
	}

	# validate timestamp argument
	timestamp=$1
	if(! echo $timestamp | 9 grep '^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]T[0-9][0-9][0-9][0-9][0-9][0-9]$' >/dev/null >[2=1]) {
		echo 'error: invalid timestamp format (expected YYYYMMddTHHmmss)' >[1=2]
		exit 1
	}

	backupfile=$backupdir/$timestamp'-'$denotebase'-dbkp.tar.gz'
	if(! test -f $backupfile) {
		echo 'error: backup file not found:' $backupfile >[1=2]
		echo 'available backups:' >[1=2]
		ls $backupdir/*-$denotebase-dbkp.tar.gz >[1=2]
		exit 1
	}

	# extract tarball to restore directory
	restoredir=$denotedir/restore
	mkdir -p $restoredir
	echo 'Restoring backup to:' $restoredir
	cd $restoredir
	9 tar xvzf $backupfile

	if(test -d $restoredir/$timestamp) {
		echo 'Backup restored successfully to:' $restoredir/$timestamp
	}
	if not {
		echo 'error: restore failed' >[1=2]
		exit 1
	}
}

if not {
	echo 'usage: Dbkp                   (create backup)' >[1=2]
	echo '       Dbkp l                 (list backups)' >[1=2]
	echo '       Dbkp YYYYMMddTHHmmss   (restore backup)' >[1=2]
	exit 1
}
