#!/bin/sh set -eu VAR=$HOME/.var/offlineimap 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 say() { [ -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 if ! test -t 0; then say "I: Renicing because we are not run interactively…" renice 20 -p $$ >/dev/null ionice -c3 -p $$ fi 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 } 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