Updates up to first successful send.

This commit is contained in:
Otho 2022-11-20 03:33:44 -05:00
parent cc9357d43a
commit 36caad4ba5
Signed by: Otho
GPG Key ID: 16C720CD3BBE21D9

85
backup.sh Executable file → Normal file
View File

@ -1,9 +1,9 @@
#!/usr/bin/env sh #!/usr/bin/env sh
### nodes.txt ### nodes.txt
# localhost 22 <this host's root zfs> <this host's user> # <local hostname> <local ssh port> <this host's root zfs> <this host's user>
# <remote host 1 address> <host 1 port> <host 1 root zfs> # <remote host 1 address> <host 1 ssh port> <host 1 root zfs>
# <remote host 2 address> <host 2 port> <host 2 root zfs> # <remote host 2 address> <host 2 ssh port> <host 2 root zfs>
# ... # ...
### datasets.txt (Only required for aggregator setup.) ### datasets.txt (Only required for aggregator setup.)
@ -15,11 +15,7 @@
# <dataset 3> # <dataset 3>
# ... # ...
if [ ! -f nodes.txt ]; then echo "No nodes specified."; exit 2; fi list_datasets()
read BR_HOST BR_PORT BR_ROOT BR_USER < nodes.txt
list_filesets()
{ {
zfs list | tail -n +2 | cut -d' ' -f1|grep ${BR_ROOT} zfs list | tail -n +2 | cut -d' ' -f1|grep ${BR_ROOT}
} }
@ -44,7 +40,7 @@ setup_aggregator()
setup_mirror() setup_mirror()
{ {
zfs allow -u ${BR_USER} send,snapshot,hold ${BR_ROOT} 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} compression,mountpoint,receive,create,mount ${BR_ROOT}
} }
@ -57,31 +53,78 @@ create_snapshot()
send_single_snapshot() send_single_snapshot()
{ {
BR_NEW_SNAPSHOT=`get_latest_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 while read BR_REMOTE_ADDR BR_REMOTE_PORT BR_REMOTE_ROOT BR_REMOTE_USER; do
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} | zfs send -R ${BR_ROOT}@${BR_NEW_SNAPSHOT} |
ssh -i ~/.ssh/id_rsa -o port=${BR_REMOTE_PORT} \ ssh -i ~/.ssh/id_rsa -o port=${BR_REMOTE_PORT} \
${BR_REMOTE_USER}@${BR_REMOTE_ADDR} \ ${BR_REMOTE_USER}@${BR_REMOTE_ADDR} \
zfs receive -dvu ${BR_REMOTE_ROOT}@${BR_NEW_SNAPSHOT} zfs receive -dvu ${BR_REMOTE_ROOT}
done fi
done < sendnodes.tmp
rm sendnodes.tmp
if [ $BR_TEST_MODE = "TRUE" ]; then
:
else
echo $BR_NEW_SNAPSHOT > "old-snapshot.txt" echo $BR_NEW_SNAPSHOT > "old-snapshot.txt"
fi
} }
send_incremental_snapshot() send_incremental_snapshot()
{ {
BR_NEW_SNAPSHOT=`get_latest_snapshot` BR_NEW_SNAPSHOT=`get_latest_snapshot`
while read BR_REMOTE_ADDR BR_REMOTE_PORT BR_REMOTE_ROOT BR_REMOTE_USER; do echo Will send $BR_NEW_SNAPSHOT
zfs send -R -i `cat old-snapshot.txt` ${BR_ROOT}@${BR_NEW_SNAPSHOT} | #while read BR_REMOTE_ADDR BR_REMOTE_PORT BR_REMOTE_ROOT BR_REMOTE_USER; do
ssh -i ~/.ssh/id_rsa -o port=${BR_REMOTE_PORT} \ # zfs send -R -i `cat old-snapshot.txt` ${BR_ROOT}@${BR_NEW_SNAPSHOT} |
${BR_REMOTE_USER}@${BR_REMOTE_ADDR} \ # ssh -i ~/.ssh/id_rsa -o port=${BR_REMOTE_PORT} \
zfs receive -dvu ${BR_REMOTE_ROOT}@${BR_NEW_SNAPSHOT} # ${BR_REMOTE_USER}@${BR_REMOTE_ADDR} \
done # zfs receive -dvu ${BR_REMOTE_ROOT}@${BR_NEW_SNAPSHOT}
#done
echo $BR_NEW_SNAPSHOT > "old-snapshot.txt" echo $BR_NEW_SNAPSHOT > "old-snapshot.txt"
} }
create_snapshot
if [ -f "old-snapshot.txt" ]; then ################################### 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 send_incremental_snapshot
else else
send_single_snapshot send_single_snapshot
fi fi
;;
esac