From: martin f. krafft <madduck@madduck.net>
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?ds=sidebyside;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