From 2632836241e21fb97fa826b64a1886353bacd84f Mon Sep 17 00:00:00 2001 From: Ian Kelling Date: Tue, 25 Jul 2023 02:34:23 -0400 Subject: [PATCH] fix btrbk, simplify. cron mode was a bad idea, only have force --- btrbk-run | 172 ++++++++++-------- .../etc/systemd/system/btrbk.service | 2 +- .../etc/systemd/system/btrbk-spread.service | 10 - mount-latest-subvol | 5 +- 4 files changed, 97 insertions(+), 92 deletions(-) delete mode 100644 machine_specific/kd/filesystem/etc/systemd/system/btrbk-spread.service diff --git a/btrbk-run b/btrbk-run index f861880..c33ed66 100644 --- a/btrbk-run +++ b/btrbk-run @@ -42,11 +42,10 @@ EOF 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 @@ -88,22 +87,13 @@ fi 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 ;; @@ -111,12 +101,16 @@ while true; do -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 ;; @@ -159,9 +153,13 @@ if $kd_spread; then 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 @@ -219,30 +217,18 @@ fi # 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 @@ -251,51 +237,77 @@ if [[ ! -v targets && ! $source ]]; 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 @@ -364,7 +376,7 @@ if ! $fast && [[ $source ]]; 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 @@ -387,7 +399,7 @@ exec &> >(ts "%F %T" | tee -a $log_path) 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 @@ -495,7 +507,7 @@ else # 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 @@ -518,7 +530,7 @@ else 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 diff --git a/machine_specific/btrbk/filesystem/etc/systemd/system/btrbk.service b/machine_specific/btrbk/filesystem/etc/systemd/system/btrbk.service index 67fcd21..831af4b 100644 --- a/machine_specific/btrbk/filesystem/etc/systemd/system/btrbk.service +++ b/machine_specific/btrbk/filesystem/etc/systemd/system/btrbk.service @@ -5,6 +5,6 @@ After=multi-user.target [Service] Type=oneshot ExecStartPre=/a/exe/install-my-scripts -ExecStart=/usr/local/bin/sysd-mail-once -t daylert@iankelling.org btrbk /usr/local/bin/btrbk-run --cron +ExecStart=/usr/local/bin/sysd-mail-once -t daylert@iankelling.org btrbk /usr/local/bin/btrbk-run ExecStartPost=/bin/sleep 1 ExecStartPost=/a/exe/install-my-scripts diff --git a/machine_specific/kd/filesystem/etc/systemd/system/btrbk-spread.service b/machine_specific/kd/filesystem/etc/systemd/system/btrbk-spread.service deleted file mode 100644 index b1b3f96..0000000 --- a/machine_specific/kd/filesystem/etc/systemd/system/btrbk-spread.service +++ /dev/null @@ -1,10 +0,0 @@ -[Unit] -Description=Btrbk spread backup -After=multi-user.target - -[Service] -Type=oneshot -ExecStartPre=/a/exe/install-my-scripts -ExecStart=/usr/local/bin/sysd-mail-once -t daylert@iankelling.org btrbk /usr/local/bin/btrbk-run -k -ExecStartPost=/bin/sleep 1 -ExecStartPost=/a/exe/install-my-scripts diff --git a/mount-latest-subvol b/mount-latest-subvol index bfe99f9..0e456a2 100644 --- a/mount-latest-subvol +++ b/mount-latest-subvol @@ -382,7 +382,10 @@ for vol in ${all_vols[@]}; do ### end getting root_dir cd $root_dir - if [[ -e $vol && $vol != qd ]]; then + if [[ -e $vol ]]; then + if [[ $vol == qd ]]; then + m btrfs sub del qd + fi leaf=$vol.leaf.$(date +%Y-%m-%dT%H:%M:%S%z) m mv $vol $leaf m btrfs property set -ts $leaf ro true -- 2.30.2