+
+if [[ $mountpoints ]]; then
+ for mp in ${mountpoints[@]}; do # default mountpoints to sync
+ if [[ -e /nocow/btrfs-stale/$mp ]]; then
+ die "error: $mp is stale, mount-latest-subvol first"
+ fi
+ done
+else
+ # set default mountpoints
+ case $HOSTNAME in
+ # no remote backups atm. note, if we do enable this, configuration below will need some changes.
+ # frodo)
+ # prospective_mps=(/i)
+ # ;;
+ *)
+ prospective_mps=(/a /q)
+ if [[ $source ]]; then
+ source_state="$(ssh $source cat /a/bin/bash_unpublished/source-state)"
+ eval "$source_state"
+ source_host="$(ssh $source cat /etc/hostname)"
+ if [[ $source_host == "$MAIL_HOST" ]]; then
+ prospective_mps+=(/o)
+ fi
+ else
+ if [[ $HOSTNAME == "$MAIL_HOST" ]]; then
+ prospective_mps+=(/o)
+ fi
+ fi
+ ;;
+ esac
+ for mp in ${prospective_mps[@]}; do # default mountpoints to sync
+ if [[ -e /nocow/btrfs-stale/$mp ]]; then
+ e "warning: $mp stale, not adding to default mountpoints"
+ continue
+ fi
+ if awk '{print $2}' /etc/fstab | grep -xF $mp &>/dev/null; then
+ mountpoints+=($mp)
+ fi
+ done
+fi
+
+echo "mountpoints: ${mountpoints[*]}"
+
+##### end command line parsing ########
+
+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
+ fi
+fi
+
+# 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
+ 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
+ fi
+fi
+
+
+
+
+
+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
+ # This is a separate ssh because xprintidle can fail and thats ok.
+ if $cron && idle_ms=$(ssh $h DISPLAY=:0 xprintidle); then
+ if (( idle_ms < min_idle_ms )); then
+
+ # 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.
+ e "warning: $h: active X session in the last 15 minutes, skipping for now"
+ continue
+ fi
+ 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
+ e "error: failed to ssh to ${sshfail[*]} but continuing with other hosts"
+ fi
+ targets=(${sshable[@]})
+ fi
+fi
+
+
+cat >/etc/btrbk.conf <<EOF
+ssh_identity /root/.ssh/home
+# Just a guess that local7 is a good facility to pick.
+# It's a bit odd that the transaction log has to be logged to
+# a file or syslog, while other output is sent to std out.
+# The man does not mention a way for them to be together, but
+# I dunno if setting a log level like warn might also output
+# transaction info.
+transaction_syslog local7
+
+# note, i had this because man said 20% speedup, but ran into
+# this issue, https://github.com/digint/btrbk/issues/275
+#stream_buffer 512m