diff --git a/.gitignore b/.gitignore index 3958b7c..3c87c1f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ datasets.txt -rootzfs.txt -hosts.txt -user.txt +nodes.txt +old-snapshot.txt diff --git a/backup.sh b/backup.sh index 8072b4d..7deb499 100755 --- a/backup.sh +++ b/backup.sh @@ -1,18 +1,11 @@ #!/usr/bin/env sh -## Data Format - -### user.txt -# - -### hosts.txt -# -# +### nodes.txt +# localhost 22 +# +# # ... -### rootzfs.txt -# - ### datasets.txt (Only required for aggregator setup.) # # / @@ -22,21 +15,19 @@ # # ... -if [ ! -f user.txt ]; then echo "No user specified."; exit 2; fi -if [ ! -f hosts.txt ]; then echo "No hosts specified."; exit 2; fi -if [ ! -f rootzfs.txt ]; then echo "No rootzfs specified."; exit 2; fi +if [ ! -f nodes.txt ]; then echo "No nodes specified."; exit 2; fi -BAKRNG_ROOT=`cat rootzfs.txt` +read BR_HOST BR_PORT BR_ROOT BR_USER < nodes.txt list_filesets() { - zfs list | tail -n +2 | cut -d' ' -f1|grep ${BAKRNG_ROOT} + zfs list | tail -n +2 | cut -d' ' -f1|grep ${BR_ROOT} } get_latest_snapshot() { zfs list -t snapshot | - grep ${BAKRNG_ROOT} | + grep ${BR_ROOT} | tail -n1 | cut -d'@' -f2 | cut -d' ' -f 1 @@ -44,7 +35,7 @@ get_latest_snapshot() setup_aggregator() { - zfs allow -u `cat user.txt` send,snapshot,hold ${BAKRNG_ROOT} + zfs allow -u ${BR_USER} send,snapshot,hold ${BR_ROOT} for dataset in `cat datasets.txt`; do zfs create $dataset done @@ -52,43 +43,43 @@ setup_aggregator() setup_mirror() { - zfs allow -u `cat user.txt` send,snapshot,hold ${BAKRNG_ROOT} - zfs allow -du `cat user.txt` \ - compression,mountpoint,receive,create,mount ${BAKRNG_ROOT} + zfs allow -u ${BR_USER} send,snapshot,hold ${BR_ROOT} + zfs allow -du ${BR_USER} \ + compression,mountpoint,receive,create,mount ${BR_ROOT} } create_snapshot() { id="`date -I`-`date +%s`" - zfs snapshot -r ${BAKRNG_ROOT}@${id} + zfs snapshot -r ${BR_ROOT}@${id} } send_single_snapshot() { - BAKRNG_SEND_SNAPSHOT=`get_latest_snapshot` - while read BAKRNG_REMOTE_ADDR BAKRNG_REMOTE_PORT BAKRNG_REMOTE_ROOT; do - zfs send -R ${BAKRNG_ROOT}@${BAKRNG_SEND_SNAPSHOT} | - ssh -i ~/.ssh/id_rsa \ - -o port=${BAKRNG_REMOTE_PORT} ${BAKRNG_REMOTE_ADDR} \ - zfs receive -dvu ${BAKRNG_REMOTE_ROOT}@${BAKRNG_SEND_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 ${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 $BAKRNG_SEND_SNAPSHOT > "last-snapshot.txt" + echo $BR_NEW_SNAPSHOT > "old-snapshot.txt" } send_incremental_snapshop() { - BAKRNG_SEND_SNAPSHOT=`get_latest_snapshot` - while read BAKRNG_REMOTE_ADDR BAKRNG_REMOTE_PORT BAKRNG_REMOTE_ROOT; do - zfs send -R -i `cat last-snapshot.txt` \ - ${BAKRNG_ROOT}@${BAKRNG_SEND_SNAPSHOT} | ssh -i ~/.ssh/id_rsa \ - -o port=${BAKRNG_REMOTE_PORT} ${BAKRNG_REMOTE_ADDR} \ - zfs receive -dvu ${BAKRNG_REMOTE_ROOT}@${BAKRNG_SEND_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 $BAKRNG_SEND_SNAPSHOT > "last-snapshot.txt" + echo $BR_NEW_SNAPSHOT > "old-snapshot.txt" } -if [ -f "last-snapshot.txt" ]; then +if [ -f "old-snapshot.txt" ]; then send_incremental_snapshop else send_single_snapshot