commit 64e49bcf4df43337f1cf0a4032aeade0f15ab8e5 Author: Otho Date: Sat Nov 19 03:34:22 2022 -0500 Initialize with first draft. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3958b7c --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +datasets.txt +rootzfs.txt +hosts.txt +user.txt diff --git a/backup.sh b/backup.sh new file mode 100755 index 0000000..cfc0188 --- /dev/null +++ b/backup.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env sh + +BAKRNG_ROOT=`cat rootzfs.txt` + +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 + +list_filesets() +{ + zfs list | tail -n +2 | cut -d' ' -f1|grep ${BAKRNG_ROOT} +} + +get_latest_snapshot() +{ + zfs list -t snapshot | + grep ${BAKRNG_ROOT} | + tail -n1 | + cut -d'@' -f2 | + cut -d' ' -f 1 +} + +setup_aggregator() +{ + zfs allow -u `cat user.txt` send,snapshot,hold ${BAKRNG_ROOT} + for dataset in `cat datasets.txt`; do + zfs create $dataset + done +} + +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} +} + +create_snapshot() +{ + id="`date -I`-`date +%s`" + echo zfs snapshot -r ${BAKRNG_ROOT}@${id} +} + +send_single_snapshot() +{ + BAKRNG_SEND_SNAPSHOT=`get_latest_snapshot` + while read BAKRNG_REMOTE_ADDR BAKRNG_REMOTE_PORT BAKRNG_REMOTE_ROOT; do + echo "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}" + done + # echo $BAKRNG_SEND_SNAPSHOT > "last-snapshot.txt" +} + +send_incremental_snapshop() +{ + BAKRNG_SEND_SNAPSHOT=`get_latest_snapshot` + while read BAKRNG_REMOTE_ADDR BAKRNG_REMOTE_PORT BAKRNG_REMOTE_ROOT; do + echo "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}" + done + # echo $BAKRNG_SEND_SNAPSHOT > "last-snapshot.txt" +} + + +if [ -f "last-snapshot.txt" ]; then + send_incremental_snapshop +else + send_single_snapshot +fi \ No newline at end of file