updates, especially for etiona
[distro-setup] / switch-mail-host
index 14a11f866ab3b03ea0d51eedf833e7782a38d848..df0b83605ee25fc8c7743504d18a5698278a2916 100644 (file)
@@ -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
@@ -38,16 +38,18 @@ errcatch-cleanup() {
 pre="${0##*/}:"
 m() { printf "$pre %s\n"  "$*"; "$@"; }
 e() { printf "$pre %s\n"  "$*"; }
-err() { echo "[$(date +'%Y-%m-%d %H:%M:%S%z')]: $pre: $*" >&2; }
-mexit() { echo "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 ;;
@@ -58,20 +60,28 @@ 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
@@ -79,12 +89,11 @@ case $1 in
     ;;
 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
@@ -92,8 +101,6 @@ if [[ ! $new_host || ! $old_host ]]; then
   mexit 1
 fi
 
-e $new_shell hostname
-new_hostname=$($new_shell hostname)
 
 ########### end initial processing, begin actually modifying things ##########
 
@@ -107,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
@@ -157,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