X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=switch-mail-host;h=df0b83605ee25fc8c7743504d18a5698278a2916;hb=77917a8fbf2032a8b2634a1b3de0879ec45cf213;hp=8f0912f7246e1e9fd62af985c8365215f999bda1;hpb=7d5e9e87105fafa2243603f958c8b41cdaa7f0ad;p=distro-setup diff --git a/switch-mail-host b/switch-mail-host old mode 100755 new mode 100644 index 8f0912f..df0b836 --- a/switch-mail-host +++ b/switch-mail-host @@ -24,7 +24,7 @@ EOF restore_new_btrbk=false restore_old_btrbk=false -errcatch-cleanup() { +err-cleanup() { if $restore_new_btrbk; then e WARNING: due to failure, btrbk.timer may need manual restoration: e $new_shell sudo systemctl start btrbk.timer @@ -34,67 +34,73 @@ errcatch-cleanup() { e $old_shell sudo systemctl start btrbk.timer fi } -b + pre="${0##*/}:" m() { printf "$pre %s\n" "$*"; "$@"; } e() { printf "$pre %s\n" "$*"; } -err() { echo "[$(date +'%Y-%m-%d %H:%M:%S%z')]: $pre: $*" >&2; } +err() { echo "$pre ERROR: $*" >&2; } +mexit() { echo "$pre exiting with status $1"; exit $1; } ##### begin command line parsing ######## -temp=$(getopt -l help owh "$@") || usage 1 +force=false mp_args="-m /o,/q,/a" +temp=$(getopt -l force,help owh "$@") || usage 1 eval set -- "$temp" while true; do case $1 in + --force) force=true ;; -o) mp_args="-m /o"; shift ;; -h|--help) usage ;; --) shift; break ;; - *) echo "$0: Internal error! unexpected args: $*" ; exit 1 ;; + *) echo "$0: Internal error! unexpected args: $*" ; mexit 1 ;; esac done (( $# == 2 )) || usage 1 +if [[ ! $HOSTNAME ]]; then + err '$HOSTNAME is unset' + mexit 1 +fi case $1 in push) + old_host=$HOSTNAME + old_hostname=$HOSTNAME new_host=$2 - bbk_args="-s $old_host" + bbk_args="-t $new_host" new_shell="ssh $new_host" - old_host=$HOSTNAME + new_hostname=$($new_shell hostname) ;; pull) old_host=$2 - bbk_args="-t $new_host" - bbk_args="-s $old_host" new_host=$HOSTNAME + new_hostname=$HOSTNAME + bbk_args="-s $old_host" old_shell="ssh $old_host" + # tests ssh connection + old_hostname=$($old_shell hostname) ;; *) err invalid first argument - exit 1 + mexit 1 ;; esac - source /a/bin/bash_unpublished/source-state -if [[ $old_host != "$MAIL_HOST" ]]; then - read -r -p "warning: \$old_host != \$MAIL_HOST: $old_host != $MAIL_HOST, proceed? y/N " - if [[ $REPLY != [yY] ]]; then - exit 1 - fi +if [[ $old_hostname != "$MAIL_HOST" ]] && ! $force; then + err "\$old_hostname($old_hostname) != \$MAIL_HOST($MAIL_HOST). Rerun with --force if you really want this." + mexit 1 fi if [[ ! $new_host || ! $old_host ]]; then echo "$0: bad args. see script" - exit 1 + mexit 1 fi -e $new_shell hostname -new_hostname=$($new_shell hostname) ########### end initial processing, begin actually modifying things ########## @@ -108,20 +114,24 @@ if $old_shell systemctl is-active btrbk.timer; then fi btrbk_test="systemctl is-active btrbk.service" -while true; do +active=true +while $active; do + active=false for shell in "$new_shell" "$old_shell"; do e $shell $btrbk_test status=$($shell $btrbk_test) ||: case $status in inactive|failed) : ;; *) + # This covers conditions like "activating", which still return 3 from + # systemctl is-active. + active=true e "btrbk active on shell:$shell, status:$status, sleeping 8 seconds" sleep 8 - continue + break ;; esac done - break done # ensure these are unused before doing anything @@ -148,21 +158,24 @@ EOF # ipv6 i think. +e Running initial btrbk if ! m btrbk-run -v $bbk_args $mp_args; then ret=$? err "failed initial btrbk" - exit $ret + mexit $ret fi - m $old_shell /a/exe/primary-setup $new_hostname -if ! m btrbk-run -v $bbk_args -m /o; then - ret=$? +e Running main btrbk +m btrbk-run -v $bbk_args -m /o || ret=$? +if (( ret )); then bang="$(printf "$(tput setaf 5)█$(tput sgr0)%.0s" 1 2 3 4 5 6 7)" e $bang failed btrbk of /o. restoring old host as primary m $old_shell /a/exe/primary-setup localhost - exit $ret + mexit $ret fi m $new_shell /a/exe/primary-setup localhost + +mexit 0