78 lines
1.4 KiB
Bash
Executable File
78 lines
1.4 KiB
Bash
Executable File
#!/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 202.121.180.23 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 202.121.180.23 zfs recv -F backup/$FS
|
|
|
|
}
|
|
|
|
test_net() {
|
|
|
|
if ! ping -c 1 202.121.180.23; 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
|