script_name="${BASH_SOURCE[0]}"
script_name="${script_name##*/}"
-pre="${SSH_CLIENT:+$HOSTNAME} $script_name:"
-m() { if $verbose; then printf "$pre%s\n" "$*"; fi; "$@"; }
-e() { printf "$pre%s\n" "$*"; }
-die() { printf "$pre%s\n" "$*" >&2; echo "exiting with status 1" >&2; exit 1; }
-mexit() { echo "$pre: exiting with status $1"; exit $1; }
+m() { if $verbose; then printf "%s\n" "$*"; fi; "$@"; }
+e() { printf "%s\n" "$*"; }
+die() { printf "%s\n" "$*" >&2; echo "exiting with status 1" >&2; exit 1; }
+mexit() { echo ": exiting with status $1"; exit $1; }
# latest $MAIL_HOST
if [[ -e /b/bash_unpublished/source-state ]]; then
targets=()
early=false
-cron=false
fast=false
kd_spread=false
orig_args=("$@")
-temp=$(getopt -l cron,fast,pull-reexec,help 23cefikl:m:npqrs:t:vh "$@") || usage 1
+temp=$(getopt -l fast,pull-reexec,help 23cefikl:m:npqrs:t:vh "$@") || usage 1
eval set -- "$temp"
while true; do
case $1 in
- # some behaviors specific to running under cron:
- # - skip hosts where xprintidle haven't been idle recently
- # - if we can't ssh to 1 or more hosts, still do the rest
- # - if we aren't MAIL_HOST and no -m or -s, just exit
- --cron)
- cron=true
- pre=
- ;;
# for the rare case we want to run multiple instances at the same time
-2) conf_suf=2 ;;
-3) conf_suf=3 ;;
-c) conf_only=true ;;
# quit early, just btrbk, no extra remounting etc.
-e) early=true ;;
+ # avoids some default behaviors:
+ # - no skipping hosts where xprintidle haven't been idle recently
+ # - exit if we can't ssh to 1 or more hosts
+ # - still set default hosts despite MAIL_HOST status
-f) force=true ;;
# skip various checks. when we run twice in a row for
# switch mail-host, no need to repeat the same checks again.
--fast) fast=true ;;
-i) incremental_strict=true ;;
- # note this implies resume, cron and -p
+ # note this implies resume and -p
-k) kd_spread=true ;;
# bytes per second, suffix k m g
-l) rate_limit=$2; shift ;;
if [[ $HOSTNAME == "$MAIL_HOST" ]]; then
die "something went wrong, -k not meant to be run on MAIL_HOST"
fi
+ if [[ $HOSTNAME != kd ]]; then
+ die "something went wrong, -k only meant to run on kd"
+ fi
cmd_arg=resume
preserve_arg=-p
- cron=true
+ h=sy
+ add-wireless-target-h
fi
if [[ ! $cmd_arg ]]; then
# targets, plus any given on the command line.
-# set default targets
-if [[ ! -v targets && ! $source ]]; then
- if $cron && ! $kd_spread && [[ $HOSTNAME != "$MAIL_HOST" ]]; then
- echo "MAIL_HOST=$MAIL_HOST, nothing to do"
- mexit 0
- fi
+at_work=false
+at_home=false
- at_work=false
- at_home=false
-
- case $HOSTNAME in
- kw|kd|frodo|x2|x3|sy) : ;;
- *)
- die "error: no default targets for this host, use -t"
- ;;
- esac
+set-location() {
case $HOSTNAME in
kw)
at_work=true
- ;;&
+ ;;
kd|frodo)
at_home=true
- ;;&
+ ;;
x2|x3|sy)
if [[ $(dig +short @10.2.0.1 -x 10.2.0.2 2>&1 ||:) == kd.b8.nz. ]] \
&& ip n show 10.2.0.1 | grep . &>/dev/null; then
&& ip n show 192.168.0.26 | grep . &>/dev/null; then
at_work=true
fi
- ;;&
+ ;;
+ esac
+}
+
+exit-if-no-default-targets() {
+ if ! $force && [[ $HOSTNAME != "$MAIL_HOST" ]]; then
+ echo "MAIL_HOST=$MAIL_HOST, nothing to do"
+ mexit 0
+ fi
+ case $HOSTNAME in
+ kw|kd|frodo|x2|x3|sy) : ;;
*)
- if $at_home; then
- if ! $kd_spread && [[ $HOSTNAME != x3 ]]; then
- # main work machine
- if ping -q -c1 -w1 x3.office.fsf.org &>/dev/null; then
- targets+=(x3.office.fsf.org)
- elif ping -q -c1 -w1 $h.b8.nz &>/dev/null; then
- # in case we took it home
- targets+=(x3.b8.nz)
- else
- targets+=(x3wg.b8.nz)
- fi
- fi
- if [[ $HOSTNAME != kd ]]; then
- targets+=(kd.b8.nz)
- fi
- wireless_home_hosts=(
- x2
- sy
- )
- for h in ${wireless_home_hosts[@]}; do
- if [[ $HOSTNAME != "$h" ]]; then
- if ping -q -c1 -w1 $h.b8.nz &>/dev/null; then
- targets+=($h.b8.nz)
- elif ping -q -c1 -w1 ${h}w.b8.nz &>/dev/null; then
- targets+=(${h}w.b8.nz)
- fi
- fi
- done
- elif $at_work; then
- targets+=(i.b8.nz)
- for h in x2 x3 kw; do
- if [[ $HOSTNAME == "$h" ]]; then
- continue
- fi
- if ping -q -c1 -w1 $h.office.fsf.org &>/dev/null; then
- targets+=($h.office.fsf.org)
- fi
- done
- else
- targets+=(i.b8.nz)
- fi
+ die "error: no default targets for this host, use -t"
;;
esac
+}
+
+add-x3-target() {
+ # main work machine
+ if ping -q -c1 -w1 x3.office.fsf.org &>/dev/null; then
+ targets+=(x3.office.fsf.org)
+ elif ping -q -c1 -w1 $h.b8.nz &>/dev/null; then
+ # in case we took it home
+ targets+=(x3.b8.nz)
+ else
+ targets+=(x3wg.b8.nz)
+ fi
+}
+
+add-wireless-target-h() {
+ if ping -q -c1 -w1 $h.b8.nz &>/dev/null; then
+ targets+=($h.b8.nz)
+ elif ping -q -c1 -w1 ${h}w.b8.nz &>/dev/null; then
+ targets+=(${h}w.b8.nz)
+ fi
+}
+
+
+# set default targets
+if [[ ! -v targets && ! $source ]]; then
+ exit-if-no-default-targets
+ set-location
+ if $at_home; then
+ if ! $kd_spread && [[ $HOSTNAME != x3 ]]; then
+ add-x3-target
+ fi
+ if [[ $HOSTNAME != kd ]]; then
+ targets+=(kd.b8.nz)
+ fi
+ wireless_home_hosts=(
+ x2
+ sy
+ )
+ for h in ${wireless_home_hosts[@]}; do
+ if [[ $HOSTNAME != "$h" ]]; then
+ add-wireless-target-h
+ fi
+ done
+ elif $at_work; then
+ targets+=(i.b8.nz)
+ for h in x2 x3 kw; do
+ if [[ $HOSTNAME == "$h" ]]; then
+ continue
+ fi
+ if ping -q -c1 -w1 $h.office.fsf.org &>/dev/null; then
+ targets+=($h.office.fsf.org)
+ fi
+ done
+ else
+ targets+=(i.b8.nz)
+ fi
fi
if [[ ${mountpoints[0]} ]]; then
case $status in
inactive|failed) : ;;
*)
- echo "$0: error: cron btrbk is running on source. exiting out of caution"
+ echo "$0: error: btrbk is running on source. exiting out of caution"
mexit 1
esac
fi
if $verbose; then
- printf "$pre options: conf_only=%s\ndry_run=%s\nrate_limit=%s\nverbose=%s\ncmd_arg=%s" "$conf_only" "$dry_run" "$rate_limit" "$verbose" "$cmd_arg"
+ printf " options: conf_only=%s\ndry_run=%s\nrate_limit=%s\nverbose=%s\ncmd_arg=%s" "$conf_only" "$dry_run" "$rate_limit" "$verbose" "$cmd_arg"
fi
if [[ -v targets ]]; then
# which is good enough.
#
# This is a separate ssh because the command can fail and thatis ok.
- if $cron && ! $force; then
+ if ! $force; then
locked=false
if lock_info=$(timeout -s 9 6 ssh $h DISPLAY=:0 xscreensaver-command -time); then
if [[ $lock_info != *non-blanked* ]]; then
die "error: dont confuse yourself with multiple time zones. $h has different timezone than localhost"
fi
done
- if [[ ! ${sshable[*]} ]] || { ! $cron && [[ ${sshfail[*]} ]]; }; then
+ if [[ ! ${sshable[*]} ]] || { $force && [[ ${sshfail[*]} ]]; }; then
die "failed to ssh to hosts: ${sshfail[*]}"
else
if [[ ${sshfail[*]} ]]; then