X-Git-Url: https://git.madduck.net/etc/mailfilter.git/blobdiff_plain/638a5556b1da40dfed06a501546ee46a07974bce..335c575676f939f64cba82dd90ccc29abf9e9a74:/bin/retrain

diff --git a/bin/retrain b/bin/retrain
index 8135509..315d329 100755
--- a/bin/retrain
+++ b/bin/retrain
@@ -4,24 +4,28 @@ set -eu
 NICE='/usr/bin/nice -20'
 NICE=''
 
-PROCMAIL="$NICE $HOME/.etc/mailfilter/procmail/procmailrc"
+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
@@ -44,23 +48,35 @@ case "$HAM/$SPAM" in
   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