From 41b0266eb94d37f2264256897956ba4c1c6a04d6 Mon Sep 17 00:00:00 2001 From: Ian Kelling Date: Thu, 1 Aug 2019 23:43:23 -0400 Subject: [PATCH] more verbose and robust btrbk wrappers --- btrbk-run | 2 +- switch-mail-host | 129 ++++++++++++++++++++++++++++------------------- 2 files changed, 79 insertions(+), 52 deletions(-) diff --git a/btrbk-run b/btrbk-run index f6570a1..5c14398 100644 --- a/btrbk-run +++ b/btrbk-run @@ -85,6 +85,7 @@ rsync-dirs() { } +pre="${0##*/}:" m() { if $verbose; then printf "$pre %s\n" "$*"; fi; "$@"; } die() { printf "$pre %s\n" "$*" >&2; exit 1; } @@ -116,7 +117,6 @@ if [[ -s $default_args_file ]]; then sleep 5 fi -pre="${0##*/}:" cron=false orig_args=("$@") temp=$(getopt -l cron,pull-reexec,help cl:m:npqs:t:vh "$@") || usage 1 diff --git a/switch-mail-host b/switch-mail-host index 2d74ceb..e52abdb 100644 --- a/switch-mail-host +++ b/switch-mail-host @@ -1,35 +1,95 @@ #!/bin/bash -set -x -set -eE -o pipefail -trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR + +err-bash-trace() { + local -i argc_index=0 frame i start=${1:-0} max_indent=8 indent + local source + local extdebug=false + if [[ $(shopt -p extdebug) == *-s* ]]; then + extdebug=true + fi + for ((frame=0; frame < ${#FUNCNAME[@]}-1; frame++)); do + argc=${BASH_ARGC[frame]} + argc_index+=$argc + ((frame < start)) && continue + if (( ${#BASH_SOURCE[@]} > 1 )); then + source="${BASH_SOURCE[frame+1]}:${BASH_LINENO[frame]}:" + fi + indent=$((frame-start + 1)) + indent=$((indent < max_indent ? indent : max_indent)) + printf "%${indent}s↳%sin \`%s" '' "$source" "${FUNCNAME[frame]}" + if $extdebug; then + for ((i=argc_index-1; i >= argc_index-argc; i--)); do + printf " %s" "${BASH_ARGV[i]}" + done + fi + echo \' + done + return 0 +} + + +err-catch() { + set -E; shopt -s extdebug + _err-trap() { + err=$? + exec >&2 + set +x + echo "${BASH_SOURCE[1]}:${BASH_LINENO[0]}: \`$BASH_COMMAND' returned $err" + err-bash-trace 2 + set -e # err trap does not work within an error trap + "${_errcatch_cleanup[@]:-:}" # note :-: is to be compatible with set -u + echo "$0: exiting with code $err" + exit $err + } + trap _err-trap ERR + set -o pipefail +} +err-catch usage() { cat </dev/null | grep -qFx '[10.0.0.1]:2220 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCH+/h1dGEfKEusBblndU2e6QT4wLCm5+yqr/sqh/0X9YfjR7BfWWm8nNmuP55cYc+Wuf5ljB1H1acXEcsl1y8e0j3agHfF0V74FE1N1zz5nn2Ep8NHnmqgEhza38ZxMPh+4p3X7zklEKU7+3SzybKBi8sg0wLzlS2LM0JaUN80zR2sK11Kye3dURUXPk78u5wodOkgcEYRwSYaDMJlUzWP+poRXIDJwFaMQnwmxbl/c84yOyaU0x/d6hFwoRscWecihX+vvBNeSyxR4xr2HDOyUWwJkctyAgt2p7w3tfkXOKcCRzTAjGVIMQLTvo0sG/yJbcyHoEFdFybCsgDvfyYn'; then - at_home=true -fi -echo "$0: at_home = $at_home" source /a/bin/bash_unpublished/source-state -#### begin convert private hostnames to public hostnames #### -#if ! $at_home; then -# for var in old_host new_host; do -# case ${!var} in -# tp) -# eval $var=$HOME_DOMAIN -# ;; -# esac -# done -#fi -#### end convert private hostnames to public hostnames #### - - -# because our port forward is not robust enough, we can't use proxy command, -# todo: setup vpn so this is all taken care of. -if ! $update_wrt; then - wrt_shell=: -else - wrt_shell="ssh wrt.b8.nz" -fi + new_hostname=$($new_shell hostname) ########### end initial processing, begin actually modifying things ########## -restore_new_btrbk=false if $new_shell systemctl is-active btrbk.timer; then - $new_shell sudo systemctl stop btrbk.timer - echo "$0: note: stopped btrbk.timer on $new_host" + m $new_shell sudo systemctl stop btrbk.timer restore_new_btrbk=true fi -restore_old_btrbk=false if $old_shell systemctl is-active btrbk.timer; then - $old_shell sudo systemctl stop btrbk.timer - echo "$0: note: stopped btrbk.timer on $old_host" + m $old_shell sudo systemctl stop btrbk.timer restore_old_btrbk=true fi @@ -121,7 +153,9 @@ while [[ $($new_shell $btrbk_test) != inactive ]] || [[ $($old_shell $btrbk_test sleep 2 done +# ensure these are unused before doing anything +e "umounting /m and /o via $new_shell" $new_shell bash -xs <<'EOF' set -eE if mountpoint -q /m; then sudo umount /m; fi @@ -142,19 +176,12 @@ EOF # I think exim will try ipv6 first, so no need to disable # ipv6 i think. -$old_shell /a/exe/primary-setup $new_hostname +m $old_shell /a/exe/primary-setup $new_hostname if $localhost_new; then - btrbk-run -s $old_host $mp_args + m btrbk-run -v -s $old_host $mp_args else - btrbk-run -t $new_host $mp_args + m btrbk-run -v -t $new_host $mp_args fi -$new_shell /a/exe/primary-setup $new_hostname - -if $restore_new_btrbk; then - $new_shell sudo systemctl start btrbk.timer -fi -if $restore_old_btrbk; then - $old_shell sudo systemctl start btrbk.timer -fi +m $new_shell /a/exe/primary-setup $new_hostname -- 2.30.2