pre="${0##*/}: "
m() { if $verbose; then printf "$pre%s\n" "$*"; fi; "$@"; }
e() { printf "$pre%s\n" "$*"; }
-die() { printf "$pre%s\n" "$*" >&2; exit 1; }
+die() { printf "$pre%s\n" "$*" >&2; echo "exiting with status 1" >&2; exit 1; }
+mexit() { echo "$pre: exiting with status $1"; exit $1; }
# latest $MAIL_HOST
if [[ -e /b/bash_unpublished/source-state ]]; then
rsync_mountpoint=/q
+ret=0
# default options
conf_only=false
dry_run=false # mostly for testing
rate_limit=no
verbose=true; verbose_arg=-v
progress_arg="--progress"
+incremental_strict=true
pull_reexec=false
default_args_file=/etc/btrbk-run.conf
cron=false
orig_args=("$@")
-temp=$(getopt -l cron,pull-reexec,help cl:m:npqs:t:vh "$@") || usage 1
+temp=$(getopt -l cron,pull-reexec,help cil:m:npqs:t:vh "$@") || usage 1
eval set -- "$temp"
while true; do
case $1 in
;;
# only creates the config file, does not run btrbk
-c) conf_only=true; shift ;;
+ -i) incremental_strict=false; shift ;;
# bytes per second, suffix k m g
-l) rate_limit=$2; shift 2 ;;
# Comma separated mountpoints to backup. This has defaults set below.
fi
### end options parsing
+if ! btrbk --version |& grep 0.29.0 >/dev/null; then
+ cd /a/opt/btrbk
+ m sudo make install
+fi
+
# TODO: i wonder if there should be an option to send to the default
# targets, plus any given on the command line.
if [[ ! -v targets && ! $source ]]; then
if [[ $HOSTNAME != "$MAIL_HOST" ]] && $cron ; then
echo "MAIL_HOST=$MAIL_HOST, nothing to do"
- exit 0
+ mexit 0
fi
+
+ at_work=false
+
case $HOSTNAME in
- kw|x2)
- if ping -q -c1 -w1 iank.vpn.office.fsf.org &>/dev/null; then
+ kw)
+ at_work=true
+ ;;&
+ x2|x3)
+ if ping -q -c1 -w1 hal.office.fsf.org \
+ && ip n show 192.168.0.26 | grep . &>/dev/null; then
+ at_work=true
+ fi
+ ;;&
+ kw|x2|x3)
+ if $at_work && ping -q -c1 -w1 iank.vpn.office.fsf.org &>/dev/null; then
home=iank.vpn.office.fsf.org
else
home=b8.nz
fi
;;&
kw)
- targets=($home x2)
+ targets=($home x3)
;;
- x2)
+ x2|x3)
targets=($home kw)
;;
tp)
# kd disabled temporarily while its hot and i plan to work on it.
#targets=(frodo kd)
- targets=(frodo x3.b8.nz)
+ #targets=(frodo x2.b8.nz)
+ targets=(frodo)
# might not be connected to the vpn
- if timeout -s 9 10 ssh kw :; then
+ if timeout -s 9 6 ssh kw :; then
targets+=(kw)
fi
;;
kd)
targets=(frodo tp)
# might not be connected to the vpn
- if timeout -s 9 10 ssh kw :; then
+ if timeout -s 9 6 ssh kw :; then
targets+=(kw)
fi
;;
if [[ $source ]]; then
if [[ $(ssh $source systemctl is-active btrbk.service) != inactive ]]; then
echo "$0: error: cron btrbk is running on source. exiting out of caution"
- exit 1
+ mexit 1
fi
fi
e "found newer version on host $source. reexecing"
install -T $tmpf /usr/local/bin/btrbk-run
m /usr/local/bin/btrbk-run --pull-reexec "${orig_args[@]}"
- exit
+ mexit 0
fi
fi
-
if ! which btrbk &>/dev/null; then
die "error: no btrbk binary found"
fi
for h in ${targets[@]}; do
if zone=$(ssh root@$h "mkdir -p /mnt/root/btrbk && date +%z"); then
# This is a separate ssh because xprintidle can fail and thats ok.
- if $cron && idle_ms=$(ssh $h DISPLAY=:0 xprintidle); then
+ if $cron && idle_ms=$(timeout -s 9 6 ssh $h DISPLAY=:0 xprintidle); then
if (( idle_ms < min_idle_ms )); then
# Ignore this host. i sometimes use a non-main machine for
rate_limit $rate_limit
EOF
-
-
-
+if $incremental_strict; then
+ cat >>/etc/btrbk.conf <<EOF
+incremental strict
+EOF
+fi
vol=/mnt/root
for m in ${mountpoints[@]}; do
if $conf_only; then
- exit
+ mexit 0
fi
if $dry_run; then
m btrbk -v -n $cmd_arg
- exit 0
+ mexit 0
elif [[ $cmd_arg == archive ]]; then
if [[ $source ]]; then
m btrbk $verbose_arg $progress_arg $cmd_arg ssh://$source$vol $vol
m btrbk $verbose_arg $progress_arg $cmd_arg $vol ssh://$tg$vol
done
fi
- exit 0
+ mexit 0
fi
# -q and just using the syslog option seemed nice,
# but it doesn't show when a send has a parent and when it doesn't.
fi
if [[ $source ]]; then
- m mount-latest-subvol $verbose_arg
+ m mount-latest-subvol
else
m /a/exe/mount-latest-remote ${targets[@]}
fi
-exit $ret
+mexit $ret
# todo: move variable data we don't care about backing up
# to /nocow and symlink it.