Marty Oehme
78b47a35b2
Fixed script to only ask for password once before understanding that the user does not want to provide it. Since gpg seems to not differentiate between a *wrongly* entered password and one entered not at all, we have to assume the user canceled the password prompt and not bug him again until the next time the script is invoked. It will, however, at least notify the user that the process is aborted in a quick notification message, so that if it was done on accident the user will still know what's up.
142 lines
3.4 KiB
Bash
Executable file
142 lines
3.4 KiB
Bash
Executable file
#!/usr/bin/env sh
|
|
# runs mbsync, with pre-hooks and post-hooks
|
|
# by default, first runs imapfilter
|
|
# and after indexes with notmuch
|
|
#
|
|
# To run without invoking any hooks or retry attempts,
|
|
# run `checkmail raw`
|
|
# this will simply invoke a single isync run on all
|
|
# boxes with the correct config file set.
|
|
#
|
|
# for more advanced, per-account/channel hooks, see
|
|
# https://sourceforge.net/p/isync/feature-requests/8/
|
|
|
|
# available env vars:
|
|
# MBSYNC_MAX_TRIES=3
|
|
# MBSYNC_PRE="/bin/usr/cmd-to-run"
|
|
# MBSYNC_POST="/bin/usr/cmd-to-run"
|
|
# MBSYNC_NOTIFY=1
|
|
|
|
PASSWORD_FILE="$HOME/.local/share/pass/misc/aerc-gmail-app-password.gpg"
|
|
|
|
prehook() {
|
|
if [ -n "$MBSYNC_PRE" ]; then
|
|
eval "$MBSYNC_PRE"
|
|
return 0
|
|
fi
|
|
imapfilter -c "${XDG_CONFIG_HOME:-/home/marty/.config}/imapfilter/config.lua"
|
|
}
|
|
|
|
posthook() {
|
|
if [ -n "$MBSYNC_POST" ]; then
|
|
eval "$MBSYNC_POST"
|
|
return 0
|
|
fi
|
|
|
|
notmuch new 2>/dev/null
|
|
afew --tag --new
|
|
afew --move-mail --new
|
|
afew --tag --new
|
|
notmuch_foldertags
|
|
countnew
|
|
}
|
|
|
|
# use notmuch to index incoming mail and set the
|
|
# correct number of mails if new ones arrived for notifications
|
|
countnew() {
|
|
num=$(notmuch count tag:unread and tag:inbox)
|
|
HASMAIL="${num:-0}"
|
|
}
|
|
|
|
# fail the routine and optionally send a message why
|
|
fail() {
|
|
[ -n "$1" ] && echo "$1"
|
|
exit 1
|
|
}
|
|
|
|
checkmail() {
|
|
mbsync -c "${XDG_CONFIG_HOME:-$HOME/.config}/isync/mbsyncrc" -a
|
|
}
|
|
|
|
checkonline() {
|
|
# Ping 1.1.1.1 to confirm that we are on the internet
|
|
ping -c 1 "1.1.1.1" >/dev/null 2>/dev/null || fail "checkmail can not access the internet."
|
|
}
|
|
|
|
# warn user that he has to enter his password in a moment
|
|
# to stop catching him offguard or entering something by accident
|
|
checkwarnuser() {
|
|
agt=$(gpg2 --decrypt --no-tty --quiet --no-verbose --for-your-eyes-only --pinentry-mode cancel "$PASSWORD_FILE" 2>&1)
|
|
if echo "$agt" | grep -qE 'No secret key'; then
|
|
notify "Mail" "Password phrase needed!"
|
|
sleep 2.5
|
|
fi
|
|
}
|
|
|
|
enablegpgagent() {
|
|
## get password from user
|
|
agt=$(gpg2 --decrypt --no-tty --quiet --no-verbose --for-your-eyes-only --pinentry-mode ask "$PASSWORD_FILE" 2>&1)
|
|
## exit program after first failed attempt
|
|
if echo "$agt" | grep -qE 'decryption failed'; then
|
|
notify "Mail" "Process aborted."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# send out a notification on new mail, to libnotify and stdout
|
|
notifymail() {
|
|
[ "${MBSYNC_NOTIFY:-1}" -eq 0 ] && return
|
|
|
|
if [ "${HASMAIL:-0}" -gt 0 ]; then
|
|
notify "Mail" "New Mail ($HASMAIL)"
|
|
fi
|
|
}
|
|
|
|
notify() {
|
|
command -v notify-send >/dev/null && notify-send "$@"
|
|
echo "$@"
|
|
}
|
|
|
|
# Routine start
|
|
|
|
# check
|
|
|
|
# skip any retries and pre/post hooks, just run mbsync
|
|
if [ "$1" = "raw" ]; then
|
|
checkmail
|
|
exit
|
|
fi
|
|
|
|
main() {
|
|
checkwarnuser
|
|
|
|
enablegpgagent
|
|
|
|
prehook
|
|
|
|
tries=0
|
|
while true; do
|
|
if checkmail; then
|
|
break
|
|
fi
|
|
|
|
tries=$((tries + 1))
|
|
if [ $tries -gt "${MBSYNC_MAX_TRIES:-3}" ]; then
|
|
fail "maximum retries reached without success."
|
|
fi
|
|
done
|
|
unset tries
|
|
|
|
posthook
|
|
|
|
notifymail
|
|
}
|
|
|
|
notmuch_foldertags() {
|
|
notmuch tag +dump -inbox -deleted -- folder:Dump and not folder:Inbox
|
|
notmuch tag +archived -inbox -deleted -- folder:Archive and not folder:Inbox
|
|
notmuch tag +deleted -inbox -archived -- folder:Trash and not folder:Inbox
|
|
notmuch tag -inbox -- not folder:Inbox
|
|
}
|
|
|
|
main
|