diff --git a/backup.sh b/backup.sh old mode 100755 new mode 100644 index c37ac90..ffc6758 --- a/backup.sh +++ b/backup.sh @@ -1,9 +1,9 @@ #!/usr/bin/env sh ### nodes.txt -# localhost 22 -# -# +# +# +# # ... ### datasets.txt (Only required for aggregator setup.) @@ -15,11 +15,7 @@ # # ... -if [ ! -f nodes.txt ]; then echo "No nodes specified."; exit 2; fi - -read BR_HOST BR_PORT BR_ROOT BR_USER < nodes.txt - -list_filesets() +list_datasets() { zfs list | tail -n +2 | cut -d' ' -f1|grep ${BR_ROOT} } @@ -44,7 +40,7 @@ setup_aggregator() setup_mirror() { zfs allow -u ${BR_USER} send,snapshot,hold ${BR_ROOT} - zfs allow -du ${BR_USER} \ + zfs allow -u ${BR_USER} \ compression,mountpoint,receive,create,mount ${BR_ROOT} } @@ -57,31 +53,78 @@ create_snapshot() send_single_snapshot() { BR_NEW_SNAPSHOT=`get_latest_snapshot` + tail -n +2 nodes.txt > sendnodes.tmp while read BR_REMOTE_ADDR BR_REMOTE_PORT BR_REMOTE_ROOT BR_REMOTE_USER; do - zfs send -R ${BR_ROOT}@${BR_NEW_SNAPSHOT} | - ssh -i ~/.ssh/id_rsa -o port=${BR_REMOTE_PORT} \ - ${BR_REMOTE_USER}@${BR_REMOTE_ADDR} \ - zfs receive -dvu ${BR_REMOTE_ROOT}@${BR_NEW_SNAPSHOT} - done - echo $BR_NEW_SNAPSHOT > "old-snapshot.txt" + case $BR_REMOTE_ADDR in + \#*) continue;; + esac + if [ $BR_TEST_MODE = "TRUE" ]; then + echo zfs send -R ${BR_ROOT}@${BR_NEW_SNAPSHOT} + echo ssh -i ~/.ssh/id_rsa -o port=${BR_REMOTE_PORT} \ + ${BR_REMOTE_USER}@${BR_REMOTE_ADDR} \ + zfs receive -vu ${BR_REMOTE_ROOT}@${BR_NEW_SNAPSHOT} + else + zfs send -R ${BR_ROOT}@${BR_NEW_SNAPSHOT} | + ssh -i ~/.ssh/id_rsa -o port=${BR_REMOTE_PORT} \ + ${BR_REMOTE_USER}@${BR_REMOTE_ADDR} \ + zfs receive -dvu ${BR_REMOTE_ROOT} + fi + done < sendnodes.tmp + rm sendnodes.tmp + if [ $BR_TEST_MODE = "TRUE" ]; then + : + else + echo $BR_NEW_SNAPSHOT > "old-snapshot.txt" + fi } send_incremental_snapshot() { BR_NEW_SNAPSHOT=`get_latest_snapshot` - while read BR_REMOTE_ADDR BR_REMOTE_PORT BR_REMOTE_ROOT BR_REMOTE_USER; do - zfs send -R -i `cat old-snapshot.txt` ${BR_ROOT}@${BR_NEW_SNAPSHOT} | - ssh -i ~/.ssh/id_rsa -o port=${BR_REMOTE_PORT} \ - ${BR_REMOTE_USER}@${BR_REMOTE_ADDR} \ - zfs receive -dvu ${BR_REMOTE_ROOT}@${BR_NEW_SNAPSHOT} - done + echo Will send $BR_NEW_SNAPSHOT + #while read BR_REMOTE_ADDR BR_REMOTE_PORT BR_REMOTE_ROOT BR_REMOTE_USER; do + # zfs send -R -i `cat old-snapshot.txt` ${BR_ROOT}@${BR_NEW_SNAPSHOT} | + # ssh -i ~/.ssh/id_rsa -o port=${BR_REMOTE_PORT} \ + # ${BR_REMOTE_USER}@${BR_REMOTE_ADDR} \ + # zfs receive -dvu ${BR_REMOTE_ROOT}@${BR_NEW_SNAPSHOT} + #done echo $BR_NEW_SNAPSHOT > "old-snapshot.txt" } -create_snapshot -if [ -f "old-snapshot.txt" ]; then - send_incremental_snapshot -else - send_single_snapshot -fi \ No newline at end of file +################################### MAIN #################################### + +### Options +set -- `getopt "tl:" "$@"` || { + echo "Usage: `basename $0` [-tl] [command]" 1>&2 + exit 1 +} +BR_TEST_MODE=FALSE +while :; do + case "$1" in + -t) + BR_TEST_MODE=TRUE + echo Test mode. + ;; + --) shift; break ;; + esac + shift +done + +read BR_HOST BR_PORT BR_ROOT BR_USER < nodes.txt + +if [ ! -f nodes.txt ]; then echo "No nodes specified."; exit 2; fi + +### Command +case "$1" in + list) list_datasets ;; + create) create_snapshot ;; + setup-mirror) setup_mirror ;; + send) + if [ -f "old-snapshot.txt" ]; then + send_incremental_snapshot + else + send_single_snapshot + fi + ;; +esac