fixes and improvemens
[distro-setup] / switch-mail-host
index 4a7ce3744a9cd3e20f81aa087fedf4bef26e927a..577d50058570dce5f98219f48a8f37a3a8bf598c 100644 (file)
@@ -10,6 +10,10 @@ Turn off mail receiving on OLD_HOST, run btrbk to move mail to NEW_HOST,
 turn on mail receiving on NEW_HOST.  Assumes we want to move all
 filesystems unless passing -o.
 
+-a         Avoid snapshot /a, /q, and similar. If we haven't
+           made any changes in the last hour, there is no
+           need to snapshot anything but /o, and we will
+           just do that once.
 -i         Disallow incremental backup.
 -o         Only btrbk /o, instead of all filesystems.
 --force    Run even though our local state does not say that MAIL_HOST is
@@ -41,7 +45,7 @@ err-cleanup() {
   fi
 }
 
-pre="$script_name:"
+pre="${SSH_CLIENT:+$HOSTNAME} $script_name:"
 m() { printf "$pre %s\n"  "$*"; "$@"; }
 e() { printf "$pre %s\n"  "$*"; }
 err() { echo "$pre ERROR: $*" >&2; }
@@ -57,11 +61,12 @@ fi
 mail_only=false
 host2_only=false
 force=false
-mp_args="-m /o,/q,/a"
-temp=$(getopt -l force,help ioh "$@") || usage 1
+mp_args="-m /o,/a,/ar,/q,/qr"
+temp=$(getopt -l force,help aioh "$@") || usage 1
 eval set -- "$temp"
 while true; do
   case $1 in
+    -a) snapshot_arg=resume ;;
     --force) force=true ;;
     -i) incremental_arg="-i" ;;
     -o)
@@ -141,15 +146,16 @@ elif $host2_only; then
   mp_args="-m /a,/ar,/q,/qr"
 fi
 
-
-if $host2_only; then
-  if [[ $old_hostname != "$HOST2" ]]; then
-    err "\$old_hostname($old_hostname) != \$HOST2($HOST2). Rerun with --force if you really want this."
+if ! $force; then
+  if $host2_only; then
+    if [[ $old_hostname != "$HOST2" ]]; then
+      err "\$old_hostname($old_hostname) != \$HOST2($HOST2). Rerun with --force if you really want this."
+      exit 1
+    fi
+  elif [[ $old_hostname != "$MAIL_HOST" ]]; then
+    err "\$old_hostname($old_hostname) != \$MAIL_HOST($MAIL_HOST). Rerun with --force if you really want this."
     exit 1
   fi
-elif [[ $old_hostname != "$MAIL_HOST" ]] && ! $force; then
-  err "\$old_hostname($old_hostname) != \$MAIL_HOST($MAIL_HOST). Rerun with --force if you really want this."
-  exit 1
 fi
 
 if [[ ! $new_host || ! $old_host ]]; then
@@ -204,11 +210,11 @@ if pgrep -G iank -u iank -f 'emacs --daemon' &>/dev/null; then
 fi
 EOF
   if ! $host2_only; then
-    cat <<'EOF'
+    cat <<EOF
 for dir in m o; do
-  if mountpoint -q /$dir; then
-    echo On $new_host: umount /$dir
-    umount /$dir
+  if mountpoint -q /\$dir; then
+    echo On $new_host: umount /\$dir
+    umount /\$dir
   fi
 done
 EOF
@@ -241,8 +247,8 @@ EOF
 
 
 e Running initial btrbk
-if ! m btrbk-run -v $bbk_args $incremental_arg $mp_args; then
-  ret=$?
+m btrbk-run -v $bbk_args $incremental_arg $mp_args $snapshot_arg || ret=$?
+if (( ret )); then
   err "failed initial btrbk"
   exit $ret
 fi
@@ -260,8 +266,8 @@ if $host2_only; then
   exit 0
 fi
 
-if ! m $old_shell /a/exe/primary-setup $new_hostname; then
-  ret=$?
+m $old_shell /a/exe/primary-setup $new_hostname || ret=$?
+if (( ret )); then
   err "failed \$old_shell primary-setup \$new_hostname. fix and rerun $script_name"
   exit $ret
 fi
@@ -271,7 +277,7 @@ fi
 m $new_shell killall -q emacs ||:
 
 e Running main btrbk
-m btrbk-run -v $bbk_args $incremental_arg -m /o || ret=$?
+m btrbk-run -v --fast $bbk_args $incremental_arg -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
@@ -279,6 +285,10 @@ if (( ret )); then
   exit $ret
 fi
 
+# new system is usable at this point
+printf "$(tput setaf 5 2>/dev/null ||:)█$(tput sgr0 2>/dev/null||:)%.0s" $(eval echo "{1..${COLUMNS:-60}}")
+echo
+
 # once I accidentally accepted incoming mail on old host. I used this script to copy over that mail:
 #
 # die=false; for d in o.leaf.2021-05-29T10:02:08-0400/m/{4e,md,4e2}/{,l/}!(*myarchive)/new; do if $die; then break; fi; find $d -type f -mtime -5 | while read -r f; do dir="${f%new/*}"; dir="btrbk/o.20210530T000011-0400/${dir#*/}"; fname="${f##*/}"; [[ -e $dir/new/$fname || -e $dir/cur/$fname ]] && continue; if ! e cp -a $f /${dir#*/*/}new; then echo failed cp; die=true; break; fi ; done; done
@@ -287,8 +297,8 @@ fi
 #
 # shopt -s nullglob; find . -type f -mtime -2 | while read -r f; do a=( /m/4e/Sent/cur/${f%,*}* ); if (( ${#a[@]} )); then e exists $a; else m cp -a $f /m/4e/Sent/cur; fi; done
 
-if ! m $new_shell /a/exe/primary-setup localhost; then
-  ret=$?
+m $new_shell /a/exe/primary-setup localhost || ret=$?
+if (( ret )); then
   err "failed final primary-setup, just fix and rerun: $new_shell /a/exe/primary-setup localhost"
   exit $ret
 fi