#!/bin/bash

DATE=$(date +"%y%m%d")

bck_list() {

	zfs list -t snapshot
}

bck_update() {

	LIST=($(zfs list -j -t snapshot | jq -rc '[ .datasets | .[] | {dataset: .dataset, version: .snapshot_name} ] | group_by(.dataset) | map({(.[0].dataset): .[-1].version}) | .[]' | tr "\n" " " | sed 's/[{}:"]/ /g'))
	for((i=0; i < ${#LIST[@]}; i+=2)); do 
		zfs snapshot ${LIST[i]}@$DATE
		zfs send -v -i ${LIST[i]}@${LIST[$((i+1))]} ${LIST[i]}@$DATE | ssh grothendieck.nabla.li zfs recv -F backup/${LIST[i]/joj\/}
	done

}

bck_prune() {
	
	LIST=($(zfs list -j -t snapshot | jq -rc '[ .datasets | .[] | {dataset: .dataset, version: .snapshot_name} ] | group_by(.dataset) | map({(.[0].dataset): .[-3].version}) | .[]' | tr "\n" " " | sed 's/[{}:"]/ /g'))

	for((i=0; i < ${#LIST[@]}; i+=2)); do 
		[ "${LIST[$((i+1))]}" != "null" ] && zfs destroy ${LIST[i]}@%${LIST[$((i+1))]}
	done

}

bck_init() {

	zfs snapshot joj/$FS
	zfs send -v joj/$FS | ssh grothendieck.nabla.li zfs recv -F backup/$FS

}

test_net() {
	
	if ! ping -c 1 grothendieck.nabla.li; then
		echo "Error: backup server cannot be reached."
		exit 20
	fi

}

case $1 in

	list) 
		bck_list 
		;;

	update) 
		test_net
		bck_update 
		;;

	prune) 
		bck_prune
		;;

	init) 
		test_net
		shift
		if [ -z "$1" ]; then
			echo "Error: specificy the course code"
			exit 10
		else
			FS=$1@$DATE
			bck_init 
		fi
		;;

	*) 
		echo "Usage: $0 [list|init FSname|update|prune]"
		;;

esac
