3 source /usr
/local
/lib
/err
7 Usage: ${0##*/} push|pull HOST
9 Turn off mail receiving on OLD_HOST, run btrbk to move mail to NEW_HOST,
10 turn on mail receiving on NEW_HOST. Assumes we want to move all
11 filesystems unless passing -o.
13 -o Only btrbk /o, instead of all filesystems.
14 -h|--help Print help and exit.
16 I used to adjust home network dns so NEW_HOST resolves locally if it is
17 on the local network, but its simpler just not to and just rely
18 on the internet. Email can wait.
20 Note: Uses GNU getopt options parsing style
25 restore_new_btrbk
=false
26 restore_old_btrbk
=false
28 if $restore_new_btrbk; then
29 e WARNING
: due to failure
, btrbk.timer may need manual restoration
:
30 e
$new_shell sudo systemctl start btrbk.timer
32 if $restore_old_btrbk; then
33 e WARNING
: due to failure
, btrbk.timer may need manual restoration
:
34 e
$old_shell sudo systemctl start btrbk.timer
39 m
() { printf "$pre %s\n" "$*"; "$@"; }
40 e
() { printf "$pre %s\n" "$*"; }
41 err
() { echo "[$(date +'%Y-%m-%d %H:%M:%S%z')]: $pre: $*" >&2; }
43 ##### begin command line parsing ########
45 temp
=$
(getopt
-l help owh
"$@") || usage
1
50 -o) mp_args
="-m /o"; shift ;;
53 *) echo "$0: Internal error! unexpected args: $*" ; exit 1 ;;
58 (( $# == 2 )) || usage
1
64 bbk_args
="-s $old_host"
65 new_shell
="ssh $new_host"
70 bbk_args
="-t $new_host"
71 bbk_args
="-s $old_host"
73 old_shell
="ssh $old_host"
76 err invalid first argument
82 source /a
/bin
/bash_unpublished
/source-state
84 if [[ $old_host != "$MAIL_HOST" ]]; then
85 read -r -p "warning: \$old_host != \$MAIL_HOST: $old_host != $MAIL_HOST, proceed? y/N "
86 if [[ $REPLY != [yY
] ]]; then
91 if [[ ! $new_host ||
! $old_host ]]; then
92 echo "$0: bad args. see script"
97 new_hostname
=$
($new_shell hostname
)
99 ########### end initial processing, begin actually modifying things ##########
101 if $new_shell systemctl is-active btrbk.timer
; then
102 m
$new_shell sudo systemctl stop btrbk.timer
103 restore_new_btrbk
=true
105 if $old_shell systemctl is-active btrbk.timer
; then
106 m
$old_shell sudo systemctl stop btrbk.timer
107 restore_old_btrbk
=true
110 btrbk_test
="systemctl is-active btrbk.service"
112 for shell
in "$new_shell" "$old_shell"; do
114 status
=$
($shell $btrbk_test) ||
:
116 inactive|failed
) : ;;
118 e
"btrbk active on shell:$shell, status:$status, sleeping 8 seconds"
127 # ensure these are unused before doing anything
129 e
"umounting /m and /o via $new_shell"
130 $new_shell bash
-xs <<'EOF'
132 if mountpoint -q /m; then sudo umount /m; fi
133 if mountpoint -q /o; then sudo umount /o; fi
136 # previously, I was checking to see if the new mail host
137 # is on my home network, then changing my home dns
138 # to resolve on the local network, so that I didnt
139 # have to send traffic out to the internet or rely
140 # on that. However, that breaks for a laptop that roams.
141 # So, we could have a cronjob that updates that dns,
142 # however, another solution is to just use ipv6,
145 # TODO: enable ipv6 for email. exim config setting disables it.
146 # need to add vpn support. need to add firewall / routing.
147 # I think exim will try ipv6 first, so no need to disable
151 if ! m btrbk-run
-v $bbk_args $mp_args; then
153 err
"failed initial btrbk"
158 m
$old_shell /a
/exe
/primary-setup
$new_hostname
160 if ! m btrbk-run
-v $bbk_args -m /o
; then
162 bang
="$(printf "$
(tput setaf
5)█$
(tput sgr0
)%.0s
" 1 2 3 4 5 6 7)"
163 e
$bang failed btrbk of
/o. restoring old
host as primary
164 m
$old_shell /a
/exe
/primary-setup localhost
168 m
$new_shell /a
/exe
/primary-setup localhost