madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

refactor to support independent runs across accounts
authormartin f. krafft <madduck@madduck.net>
Thu, 22 Dec 2011 14:13:58 +0000 (15:13 +0100)
committermartin f. krafft <madduck@madduck.net>
Thu, 22 Dec 2011 14:13:58 +0000 (15:13 +0100)
.bin/offlineimap
.crontab.d/offlineimap
.offlineimap/helper.py
.offlineimaprc

index d1f81c07a3e246e867fbec37e31c8745e0929b00..a1d7f96229509c63da8d44def38dbbec4c33c646 100755 (executable)
@@ -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
index c368e4be1dadcede3668a796216d6a1f7e5fc1dd..e335ef372c10a5a827a938bf9589ef7219cb0546 100644 (file)
@@ -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
index 25d59c3f6e3a1196d062732344e59079e81d93b0..47b98250249230141ff21e4d96994cc48573c4f3 100644 (file)
@@ -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)
index 92757fa640a9125737efb876dc87da929889d03b..be3fb02ca3afebde57a4b0b09f34319adbff290e 100644 (file)
@@ -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