#!/usr/bin/env sh ## Data Format ### user.txt # ### hosts.txt # # # ... ### rootzfs.txt # ### datasets.txt (Only required for aggregator setup.) # # / # / # # / # # ... 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 BAKRNG_ROOT=`cat rootzfs.txt` 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