various fixes and updates
[distro-setup] / switch-mail-host
index eafe1044c0816c19aa7522b94445d6a3de7cec78..df0b83605ee25fc8c7743504d18a5698278a2916 100644 (file)
@@ -38,16 +38,18 @@ err-cleanup() {
 pre="${0##*/}:"
 m() { printf "$pre %s\n"  "$*"; "$@"; }
 e() { printf "$pre %s\n"  "$*"; }
-err() { echo "$pre: ERROR: $*" >&2; }
-mexit() { echo "$pre: exiting with status $1"; exit $1; }
+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 ;;
@@ -66,8 +68,9 @@ 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"
     new_hostname=$($new_shell hostname)
     ;;
@@ -75,11 +78,10 @@ case $1 in
     old_host=$2
     new_host=$HOSTNAME
     new_hostname=$HOSTNAME
-    bbk_args="-t $new_host"
     bbk_args="-s $old_host"
     old_shell="ssh $old_host"
-    # test ssh connection
-    $old_shell :
+    # tests ssh connection
+    old_hostname=$($old_shell hostname)
     ;;
   *)
     err invalid first argument
@@ -89,9 +91,9 @@ esac
 
 source /a/bin/bash_unpublished/source-state
 
-if [[ $old_host != "$MAIL_HOST" ]]; then
-  e "WARNING: \$old_host != \$MAIL_HOST. Sleeping for 5 seconds in case you want to reconsider"
-  sleep 5
+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
@@ -112,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
@@ -162,8 +168,8 @@ fi
 m $old_shell /a/exe/primary-setup $new_hostname
 
 e Running main btrbk
-if ! m btrbk-run -v $bbk_args -m /o; then
-  ret=$?
+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