#!/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