#!/bin/sh
set -eu
-NICE='nice -20'
-PROCMAIL="$HOME/.etc/mailfilter/procmail/procmailrc"
+NICE='/usr/bin/nice -20'
+NICE=''
+
+RESUBMIT="$NICE $HOME/.etc/mailfilter/bin/resubmit"
PAUSETIME=10
HAM=0
SPAM=0
-MAILDIR=
+maildir=
+files=
for i in "$@"; do
case "$i" in
--ham) HAM=1;;
--spam) SPAM=1;;
*)
- if [ -n "$MAILDIR" ]; then
- echo "E: Maildir already specified: $i" >&2
- exit 1
+ if [ -f "$i" ] && [ -r "$i" ]; then
+ files="$files $i"
elif [ -d "$i"/cur ] && [ -d "$i"/new ] && [ -d "$i"/tmp ]; then
- MAILDIR="$i"
+ if [ -n "$maildir" ]; then
+ echo "E: Maildir already specified: $i" >&2
+ exit 1
+ fi
+ maildir="$i"
else
echo "E: unknown argument: $i" >&2
exit 255
1/0) ARG=--ham;;
esac
-LOCKFILE="$MAILDIR/.retrain.lock"
-trap "rm -f $LOCKFILE" 1 2 3 4 5 6 7 8 10 11 12 13 14 15
-if ! lockfile -0 -r0 -l 3600 "$LOCKFILE" 2>/dev/null; then
- echo "E: another retrain process is already running over that Maildir." >&2
- exit 1
+if [ -n "$maildir" ]; then
+ ME="${0##*/}"
+ LOCKFILE="$maildir/.$ME.lock"
+ trap "rm -f $LOCKFILE" 1 2 3 4 5 6 7 8 10 11 12 13 14 15
+ if ! lockfile -0 -r0 -l 3600 "$LOCKFILE" 2>/dev/null; then
+ echo "E: another $ME process is already running over that Maildir." >&2
+ trap - 0 1 2 3 4 5 6 7 8 10 11 12 13 14 15
+ exit 1
+ fi
+
+ files="$files $(find $MAILDIR/cur $MAILDIR/new -type f)"
fi
-find $MAILDIR/cur $MAILDIR/new -type f | while read msg; do
- $NICE ${0%/*}/train $ARG "$msg" | $PROCMAIL || ret=$?
+for msg in $files; do
+ $NICE ${0%/*}/train $ARG "$msg" | $RESUBMIT || ret=$?
case "${ret:-0}" in
0|75) :;;
+ *)
+ echo "E: resubmission returned with exit code $ret" >&2
+ continue
+ ;;
esac
rm -f "$msg"
sleep $PAUSETIME
done
-rm -f "$LOCKFILE"
-trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15
+if [ -n "${LOCKFILE:-}" ]; then
+ rm -f "$LOCKFILE"
+ trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15
+fi
exit 0