updates, especially for etiona
[distro-setup] / switch-mail-host
old mode 100755 (executable)
new mode 100644 (file)
index a0c590d..df0b836
@@ -24,7 +24,7 @@ EOF
 
 restore_new_btrbk=false
 restore_old_btrbk=false
-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,96 +34,104 @@ 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 ##########
 
 if $new_shell systemctl is-active btrbk.timer; then
   m $new_shell sudo systemctl stop btrbk.timer
-  _errcatch_cleanup=cleanup
   restore_new_btrbk=true
 fi
 if $old_shell systemctl is-active btrbk.timer; then
   m $old_shell sudo systemctl stop btrbk.timer
-  _errcatch_cleanup=cleanup
   restore_old_btrbk=true
 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
@@ -150,15 +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"
+  mexit $ret
+fi
 
 m $old_shell /a/exe/primary-setup $new_hostname
 
-if ! m btrbk-run -v $bbk_args $mp_args; 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. restoring old host as primary
+  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