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 _errcatch_cleanup
=cleanup
104 restore_new_btrbk
=true
106 if $old_shell systemctl is-active btrbk.timer
; then
107 m
$old_shell sudo systemctl stop btrbk.timer
108 _errcatch_cleanup
=cleanup
109 restore_old_btrbk
=true
112 btrbk_test
="systemctl is-active btrbk.service"
114 for shell
in "$new_shell" "$old_shell"; do
116 status
=$
($shell $btrbk_test) ||
:
118 inactive|failed
) : ;;
120 e
"btrbk active on shell:$shell, status:$status, sleeping 8 seconds"
129 # ensure these are unused before doing anything
131 e
"umounting /m and /o via $new_shell"
132 $new_shell bash
-xs <<'EOF'
134 if mountpoint -q /m; then sudo umount /m; fi
135 if mountpoint -q /o; then sudo umount /o; fi
138 # previously, I was checking to see if the new mail host
139 # is on my home network, then changing my home dns
140 # to resolve on the local network, so that I didnt
141 # have to send traffic out to the internet or rely
142 # on that. However, that breaks for a laptop that roams.
143 # So, we could have a cronjob that updates that dns,
144 # however, another solution is to just use ipv6,
147 # TODO: enable ipv6 for email. exim config setting disables it.
148 # need to add vpn support. need to add firewall / routing.
149 # I think exim will try ipv6 first, so no need to disable
154 m
$old_shell /a
/exe
/primary-setup
$new_hostname
156 if ! m btrbk-run
-v $bbk_args $mp_args; then
158 bang
="$(printf "$
(tput setaf
5)█$
(tput sgr0
)%.0s
" 1 2 3 4 5 6 7)"
159 e
$bang failed btrbk. restoring old
host as primary
160 m
$old_shell /a
/exe
/primary-setup localhost
164 m
$new_shell /a
/exe
/primary-setup localhost