From: martin f. krafft Date: Thu, 22 Dec 2011 14:13:58 +0000 (+0100) Subject: refactor to support independent runs across accounts X-Git-Url: https://git.madduck.net/etc/offlineimap.git/commitdiff_plain/7f6aec793e90c72cb6699191e01ed412b6ceb3b7?hp=d6533cdd1e4f42895b2569e979ad9987ba8d7454 refactor to support independent runs across accounts --- diff --git a/.bin/offlineimap b/.bin/offlineimap index d1f81c0..a1d7f96 100755 --- a/.bin/offlineimap +++ b/.bin/offlineimap @@ -1,27 +1,66 @@ #!/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 diff --git a/.crontab.d/offlineimap b/.crontab.d/offlineimap index c368e4b..e335ef3 100644 --- a/.crontab.d/offlineimap +++ b/.crontab.d/offlineimap @@ -1,2 +1,2 @@ -*/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 diff --git a/.offlineimap/helper.py b/.offlineimap/helper.py index 25d59c3..47b9825 100644 --- a/.offlineimap/helper.py +++ b/.offlineimap/helper.py @@ -20,7 +20,7 @@ def py_foldersort_main(x, y): 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): @@ -46,5 +46,5 @@ def py_folderfilter_bulk(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) diff --git a/.offlineimaprc b/.offlineimaprc index 92757fa..be3fb02 100644 --- a/.offlineimaprc +++ b/.offlineimaprc @@ -1,7 +1,7 @@ [general] -metadata = ~/.var/offlineimap -accounts = madduck.net -ui = basic +#metadata = ~/.var/offlineimap +accounts = +ui = Basic ignore-readonly = no socktimeout = 30 pythonfile = ~/.offlineimap/helper.py @@ -24,9 +24,9 @@ autorefresh = 15 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 @@ -43,11 +43,11 @@ holdconnectionopen = yes 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