: /bin/sh
# @(#)util/checkerr.sh	1.6 9/20/92 12:55:08
#
#    Copyright (C) 1987, 1988 Ronald S. Karr and Landon Curt Noll
#    Copyright (C) 1992  Ronald S. Karr
# See the file COPYING, distributed with smail, for restriction
# and warranty information.

# Check for errors which have been deposited in the smail error directory.
# If any new messages are found in this directory, save information
# related to those errors in the file .checkerror which is then mailed
# to the postmaster.  If the mail cannot be sent to the postmaster now,
# such as due to a configuration error, then try to send it in a future
# invocation of this script.

PATH="/bin:/usr/bin"; export PATH
SMAIL_PROGRAM="/usr/lib/sendmail"
SPOOL_DIRS="`$SMAIL_PROGRAM -bP spool_dirs`"
HOSTNAME="`$SMAIL_PROGRAM -bP primary_name`"
LOGFILE="`$SMAIL_PROGRAM -bP logfile`"
OLD_LOGFILE="`echo $LOGFILE | sed -e 's,^\(.*\)/\([^/][^/]*\)$,\1/OLD/\2,'`"
PANICLOG="`$SMAIL_PROGRAM -bP paniclog`"
OLD_PANICLOG="`echo $PANICLOG | sed -e 's,^\(.*\)/\([^/][^/]*\)$,\1/OLD/\2,'`"
Z_DOT=""
ZCAT="zcat"
PROG=$0

# go into each spooling directory
(IFS=:; for i in $SPOOL_DIRS; do echo $i; done) |
while read SPOOLDIR; do
    cd $SPOOLDIR
    if [ $? != 0 ]; then
	# spool directory did not exist, ignore it
	continue
    fi

    # cleanup old msg.* files in the input directory
    if [ -d input ]; then
	find input -name 'msg.*' -mtime +2 -print | while read fn
	do
	    rm -f "$fn"
	done
    fi

    # cleanup msglog files with no corresponding input or error file:
    if [ -d msglog ]; then (
    	cd msglog
	x="`echo [0-9]*`"
	sleep 1			# avoids an almost impossible race condition
	if [ "$x" != "[0-9]*" ]; then
	    for i in $x; do
		if [ ! -f ../input/$i ] && [ ! -f ../error/$i ]; then
		    rm -f $i
		fi
	    done
	fi
    ); fi

    # if the last run found some errors, but couldn't deliver, try again now
    if [ -s .checkerror ]; then
	# don't send to the Postmaster if configuration errors still exist
	x="`$SMAIL_PROGRAM -bv Postmaster 2>/dev/null`"
	if [ "$x" ]; then
	    $SMAIL_PROGRAM -f"<+>" -eq -m Postmaster <<EOF
From: MAILER-DAEMON
Subject: Mail errors on the host $HOSTNAME

Smail has detected new errors requiring your attention on the
host $HOSTNAME.  Messages which failed can be found in the
directory $SPOOLDIR/error and should be moved back to
$SPOOLDIR when the situation which caused the error has
been taken care of.

A sumary of these errors follows:
`cat .checkerror`
EOF
	    if [ $? -ne 0 ]; then
		continue
	    fi
	    rm -f .checkerror
	else
	    # if we cannot reach the postmaster, don't go to the next step
	    continue
	fi
    fi

    if [ ! -d error ]; then
	# no error directory, so there could not be new errors
	continue
    fi

    # find any new errors
    if [ -f .lasttimedone ]; then
	mv -f .lasttimedone .thistime
	: > .lasttimedone
	cd error; find * -newer ../.thistime -name '[0-9]*' -print
    else
	: > .lasttimedone
	cd error; find * -name '[0-9]*' -print
    fi 2> /dev/null | while read f; do
	echo ""; echo "------------------ Message $f ------------------"
	if [ -s msglog/$f ]; then
	    echo "The per-message log file contains:"
	    sed 's/^/ /' < msglog/$f
	else
	    echo "No per-message log file was created"
	fi
	echo ""; echo "Logfile entries related to this message are:"
	(if [ -f $LOGFILE ]; then
		cat $LOGFILE;
	 fi
	 if [ -f $OLD_LOGFILE.0 ]; then
		cat $OLD_LOGFILE.0;
	 elif [ -f $OLD_LOGFILE.0$Z_DOT ]; then
		$ZCAT $OLD_LOGFILE.0$Z_DOT;
	 fi
	 if [ -f $OLD_LOGFILE.1 ]; then
		cat $OLD_LOGFILE.1;
	 elif [ -f $OLD_LOGFILE.1$Z_DOT ]; then
		$ZCAT $OLD_LOGFILE.1$Z_DOT;
	 fi) | sed ":l1
		    /^[^|].*\[m$f\]/{
			:l2
			s/^/  /
			n
			/^|/!b l1
			s/^|	/|       /
			b l2
		    }
		    d"
	echo ""; echo "Paniclog entries related to this messsage are:"
	(if [ -f $PANICLOG ]; then
		cat $PANICLOG;
	 fi
	 if [ -f $OLD_PANICLOG.0 ]; then
		cat $OLD_PANICLOG.0;
	 elif [ -f $OLD_PANICLOG.0$Z_DOT ]; then
		$ZCAT $OLD_PANICLOG.0$Z_DOT;
	 fi
	 if [ -f $OLD_PANICLOG.1 ]; then
		cat $OLD_PANICLOG.1;
	 elif [ -f $OLD_PANICLOG.1$Z_DOT ]; then
		$ZCAT $OLD_PANICLOG.1$Z_DOT;
	 fi) |	grep "\[m$f\]" | sed 's/^/  /'
    done > .newerrors

    mv .newerrors .checkerror

    if [ -s .checkerror ]; then
	# don't send to the Postmaster if configuration errors still exist
	x="`$SMAIL_PROGRAM -bv Postmaster 2>/dev/null`"
	if [ "$x" ]; then
	    $SMAIL_PROGRAM -f"<+>" -eq -m Postmaster <<EOF
From: MAILER-DAEMON
Subject: Mail errors on the host $HOSTNAME

Smail has detected new errors requiring your attention on the
host $HOSTNAME.  Messages which failed can be found in the
directory $SPOOLDIR/error and should be moved back to
$SPOOLDIR when the situation which caused the error has
been taken care of.

A sumary of these errors follows:

`cat .checkerror`
EOF
	    if [ $? -eq 0 ]; then
		rm -f .checkerror
	    fi
	fi
    fi
done

exit 0
