#!/bin/sh
set -eu
-[ "${1:-}" = -q ] && exec >/dev/null
-
VAR=$HOME/.var/offlineimap
-LOCKFILE="$VAR/.cron.lock"
-trapfn() { rm -f "$LOCKFILE"; trap - 0 1 2 3 4 5 6 7 8 10 11 12 13 14 15; }
-trap trapfn 1 2 3 4 5 6 7 8 10 11 12 13 14 15
-if [ -d "$VAR" ] && ! lockfile -0 -r0 -l 3600 "$LOCKFILE" 2>/dev/null; then
- echo "E: offlineimap is already running." >&2
+
+opts=
+accounts=
+quiet=
+for opt in "$@"; do
+ case "$opt" in
+ --quiet)
+ opts="${opts:+$opts }-uQuiet -l/dev/null"
+ quiet=1
+ ;;
+ -a) continue;;
+ -*) opts="${opts:+$opts }$opt";;
+ *) accounts="${accounts:+$accounts }$opt";;
+ esac
+done
+
+info() { [ -n "$quiet" ] || echo >&2 "$@"; }
+err() { echo >&2 "$@"; }
+
+if [ -z "$accounts" ]; then
+ err "E: no account(s) specified…"
exit 1
+else
+ accounts=$(echo "$accounts" | sed -e 's/,/ /g')
fi
-trap trapfn 0
-
if ! test -t 0; then
- echo Renicing because we are not run interactively…
+ say "I: Renicing because we are not run interactively…"
renice 20 -p $$ >/dev/null
ionice -c3 -p $$
fi
-ret=0
-strace -tfo /tmp/offlineimap.strace /usr/bin/offlineimap "$@" || ret=$?
+getlock()
+{
+ lockfile="$VAR/.$1.lock"
+ trapfn() { rm -f "$lockfile"; trap - 0 1 2 3 4 5 6 7 8 10 11 12 13 14 15; }
+ trap trapfn 1 2 3 4 5 6 7 8 10 11 12 13 14 15
+ if [ -d "$VAR" ] && ! lockfile -0 -r0 -l 3600 "$lockfile" 2>/dev/null; then
+ return 1
+ fi
+ trap trapfn 0
+}
-trapfn
-exit $ret
+failures=0
+for account in $accounts; do
+ getlock "$account" || {
+ err "E: unable to acquire lock for account $account, already running?"
+ failures=$(($failures + 1))
+ continue
+ }
+
+ eval /usr/bin/offlineimap -a $account -k metadata=$VAR/$account $opts || \
+ failures=$(($failures + 1))
+
+ trapfn
+done
+
+if [ $failures -gt 0 ]; then
+ exit 1
+else
+ exit 0
+fi
-*/30 * * * * sleep $((900 * $RANDOM / 32768)) && ip r | grep -q via && $HOME/.bin/offlineimap -q -ou quiet
-55 */8 * * * sleep $((300 * $RANDOM / 32768)) && ip r | grep -q via && $HOME/.bin/offlineimap -q -ou quiet -a madduck.net-bulk
+*/30 * * * * sleep $((900 * $RANDOM / 32768)) && ip r | grep -q via && $HOME/.bin/offlineimap --quiet -o -a madduck.net
+55 */8 * * * sleep $((300 * $RANDOM / 32768)) && ip r | grep -q via && $HOME/.bin/offlineimap --quiet -o -a madduck.net_bulk
return -1
return cmp(x, y)
-def py_nametrans_main(x):
+def py_nametrans(x):
return re.sub('^INBOX', 'inbox', x)
def py_folderfilter_main(x):
def py_folderfilter_mbnames(acct, x):
full_excludes_re_mbnames = ['retrain/(sp|h)am'] + full_excludes_re
- return acct in ['madduck.net', 'madduck.net-bulk'] \
+ return acct in ['madduck.net', 'madduck.net_bulk'] \
and not re.search('^(' + '|'.join(full_excludes_re_mbnames) + ')', x)
[general]
-metadata = ~/.var/offlineimap
-accounts = madduck.net
-ui = basic
+#metadata = ~/.var/offlineimap
+accounts =
+ui = Basic
ignore-readonly = no
socktimeout = 30
pythonfile = ~/.offlineimap/helper.py
quick = 16
postsynchook = ionice -c3 nice -20 notmuch new
-[Account madduck.net-bulk]
+[Account madduck.net_bulk]
localrepository = local-main
-remoterepository = madduck.net-bulk
+remoterepository = madduck.net_bulk
autorefresh = 15
quick = 16
postsynchook = ionice -c3 nice -20 notmuch new
preauthtunnel = SSH_AUTH_SOCK= ssh -TCaxS ~/.var/offlineimap/ssh_ctl_sock -o "ControlMaster auto" -o "ProtocolKeepAlives 10" -o "ConnectTimeout 60" -o "IPQoS af12" -i ~/.offlineimap/id_rsa.imap@seamus imap.madduck.net
expunge = yes
foldersort = py_foldersort_main
-nametrans = py_nametrans_main
+nametrans = py_nametrans
folderfilter = py_folderfilter_main
idlefolders = ['inbox', 'mass', 'debian', 'ul', 'phd', 'admin']
-[Repository madduck.net-bulk]
+[Repository madduck.net_bulk]
type = IMAP
maxconnections = 1
holdconnectionopen = yes