From db06336e67e433d007541cb9dd4e2a2ed8b97d24 Mon Sep 17 00:00:00 2001 From: manuel Date: Sun, 28 Sep 2025 18:41:11 +0800 Subject: [PATCH] feat: container backup script --- admin/scripts/joj-container-backup | 77 ++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100755 admin/scripts/joj-container-backup diff --git a/admin/scripts/joj-container-backup b/admin/scripts/joj-container-backup new file mode 100755 index 0000000..8d4dd27 --- /dev/null +++ b/admin/scripts/joj-container-backup @@ -0,0 +1,77 @@ +#!/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