Compare commits

...

2 Commits

Author SHA1 Message Date
db06336e67 feat: container backup script 2025-09-28 18:41:11 +08:00
d92b574528 docs: clarifications 2025-09-28 17:16:32 +08:00
2 changed files with 79 additions and 2 deletions

View File

@ -1,8 +1,8 @@
# Admin scripts
- deploy: create new container on host
- preconfig: lxc hook
- config: complete guest setup
- preconfig: lxc hook (part of jtc)
- config: complete guest setup (part of jtc)
## Todo

View File

@ -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