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 "$pre ERROR: $*" >&2; }
42 mexit
() { echo "$pre exiting with status $1"; exit $1; }
44 ##### begin command line parsing ########
48 temp
=$
(getopt
-l force
,help owh
"$@") || usage
1
52 --force) force
=true
;;
53 -o) mp_args
="-m /o"; shift ;;
56 *) echo "$0: Internal error! unexpected args: $*" ; mexit
1 ;;
61 (( $# == 2 )) || usage
1
63 if [[ ! $HOSTNAME ]]; then
64 err
'$HOSTNAME is unset'
71 old_hostname
=$HOSTNAME
73 bbk_args
="-t $new_host"
74 new_shell
="ssh $new_host"
75 new_hostname
=$
($new_shell hostname
)
80 new_hostname
=$HOSTNAME
81 bbk_args
="-s $old_host"
82 old_shell
="ssh $old_host"
83 # tests ssh connection
84 old_hostname
=$
($old_shell hostname
)
87 err invalid first argument
92 source /a
/bin
/bash_unpublished
/source-state
94 if [[ $old_hostname != "$MAIL_HOST" ]] && ! $force; then
95 err
"\$old_hostname($old_hostname) != \$MAIL_HOST($MAIL_HOST). Rerun with --force if you really want this."
99 if [[ ! $new_host ||
! $old_host ]]; then
100 echo "$0: bad args. see script"
105 ########### end initial processing, begin actually modifying things ##########
107 if $new_shell systemctl is-active btrbk.timer
; then
108 m
$new_shell sudo systemctl stop btrbk.timer
109 restore_new_btrbk
=true
111 if $old_shell systemctl is-active btrbk.timer
; then
112 m
$old_shell sudo systemctl stop btrbk.timer
113 restore_old_btrbk
=true
116 btrbk_test
="systemctl is-active btrbk.service"
120 for shell
in "$new_shell" "$old_shell"; do
122 status
=$
($shell $btrbk_test) ||
:
124 inactive|failed
) : ;;
126 # This covers conditions like "activating", which still return 3 from
127 # systemctl is-active.
129 e
"btrbk active on shell:$shell, status:$status, sleeping 8 seconds"
137 # ensure these are unused before doing anything
139 e
"umounting /m and /o via $new_shell"
140 $new_shell bash
-xs <<'EOF'
142 if mountpoint -q /m; then sudo umount /m; fi
143 if mountpoint -q /o; then sudo umount /o; fi
146 # previously, I was checking to see if the new mail host
147 # is on my home network, then changing my home dns
148 # to resolve on the local network, so that I didnt
149 # have to send traffic out to the internet or rely
150 # on that. However, that breaks for a laptop that roams.
151 # So, we could have a cronjob that updates that dns,
152 # however, another solution is to just use ipv6,
155 # TODO: enable ipv6 for email. exim config setting disables it.
156 # need to add vpn support. need to add firewall / routing.
157 # I think exim will try ipv6 first, so no need to disable
161 e Running initial btrbk
162 if ! m btrbk-run
-v $bbk_args $mp_args; then
164 err
"failed initial btrbk"
168 m
$old_shell /a
/exe
/primary-setup
$new_hostname
171 m btrbk-run
-v $bbk_args -m /o || ret
=$?
173 bang
="$(printf "$
(tput setaf
5)█$
(tput sgr0
)%.0s
" 1 2 3 4 5 6 7)"
174 e
$bang failed btrbk of
/o. restoring old
host as primary
175 m
$old_shell /a
/exe
/primary-setup localhost
179 m
$new_shell /a
/exe
/primary-setup localhost