-# umount first to ensure we don't have any errors
-# todo: do some kill fuser stuff to make umount more reliable
-# todo: setup sync systemd timer on $primary, once per hour.
-# todo: setup lock so that if this is already running, we exit out, so
-# that manual runs don't interfere with cronjobs.
-if [[ $primary ]] && ! $dry_run; then
- for m in ${mountpoints[@]}; do
- # note, this won't work for /i, due to path being /mnt/iroot
- # todo: include /i for treetowl/frodo
- btrfs property set -ts /mnt/root$m ro true
- ssh root@$primary bash <<EOF
-set -ex
-umount $m
-[[ -e /mnt/root$m ]] || exit 0
-btrfs sub del /mnt/root$m
-EOF
- done
+
+
+# pull_reexec stops us from getting into an infinite loop if there is some
+# kind of weird problem
+pulla=false
+for m in "${mountpoints[@]}"; do
+ if [[ $m == /a ]]; then
+ pulla=true
+ break
+ fi
+done
+if ! $pull_reexec && [[ $source ]] && $pulla ; then
+ tmpf=$(mktemp)
+ scp $source:/a/bin/distro-setup/btrbk-run $tmpf
+ if ! diff -q $tmpf $BASH_SOURCE; then
+ echo "$pre 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
+ fi
+fi
+
+
+##### end command line parsing ########
+
+
+
+if ! which btrbk &>/dev/null; then
+ die "error: no btrbk binary found"
+fi
+# if our mountpoints are from stale snapshots,
+# it doesn't make sense to do a backup.
+check-subvol-stale ${mountpoints[@]} || die "found stale mountpoints in ${mountpoints[*]}"
+
+# for an initial run, btrbk requires the dir to exist.
+mkdir -p /mnt/root/btrbk
+local_zone=$(date +%z)
+
+if [[ $source ]]; then
+ if ! zone=$(ssh root@$source date +%z); then
+ die failed to ssh to root@$source
+ fi
+ if [[ $zone != $local_zone ]]; then
+ die "error: dont confuse yourself with multiple time zones. $h has different timezone than localhost"
+ fi
+
+else
+
+ sshable=()
+ sshfail=()
+ min_idle_ms=$((1000 * 60 * 15))
+ for h in ${targets[@]}; do
+ if zone=$(ssh root@$h "mkdir -p /mnt/root/btrbk && date +%z"); then
+ if $cron && DISPLAY=:0 xprintidle; then
+ # This is a separate ssh because xprintidle can fail and thats ok.
+ # Ignore this host. i sometimes use a non-main machine for testing or web browsing, knowing that
+ # everything will be wiped by the next backup, but I dont want it to happen as Im using
+ # it from cronjob.
+ continue
+ fi
+ sshable+=($h)
+ if [[ $zone != $local_zone ]]; then
+ die "error: dont confuse yourself with multiple time zones. $h has different timezone than localhost"
+ fi
+ else
+ sshfail+=($h)
+ fi
+ done
+ if [[ ! $sshable ]] || { ! $cron && [[ $sshfail ]]; }; then
+ die "failed to ssh to hosts: ${sshfail[*]}"
+ else
+ if [[ $sshfail ]]; then
+ ret=1
+ echo "$pre error: failed to ssh to ${sshfail[*]} but continuing with other hosts"
+ fi
+ targets=(${sshable[@]})
+ fi