#!/bin/sh

#
# Script pour analyser le log genere par les regles anti-spam.
#
# Syntaxe :
#	stat-spam < /var/log/mail.log
#
# Historique :
#   98/02/19 : sv     : premiere version
#   98/02/24 : sv/pda : deuxieme version
#

#
# Limite du nombre de lignes affichees pour chaque cas de rejet
#
LIMITE=10

if [ $# -ne 0 ]
then
    echo "usage: $0" >&2
    echo "	entree standard = log de sendmail" >&2
    exit 1
fi

grep ruleset=check_ |
    sed \
	-e 's/ [^ ]* sendmail\[[0-9]*\]: [^:]*: /|/' \
	-e 's/, /|/g' \
	-e 's/ruleset=//' \
	-e 's/arg.=//g' \
	-e 's/relay=//' \
	-e 's/reject=//' \
	-e 's/check_mail|[^|]*|/&|/' \
	-e 's/check_rcpt|[^|]*|/&|/' \
	| \
    awk -F'|' -v limite=$LIMITE '
	# $1 = date
	# $2 = ruleset
	# $3 = arg1
	# $4 = arg2 (eventuellement vide)
	# $5 = relay
	# $6 = reject
	    {
		if (premiere_date == "")
		    premiere_date = $1
		derniere_date = $1
	    }
	/maps.vix.com/	{
		mapsrbl [$3] += 1
		next
	    }
	/Go away/	{
		goaway [$3] += 1
		next
	    }
	/Unknown relay name/	{
		client [$3] += 1
		next
	    }
	/Sender address must resolve/ {
		sender [$3] += 1
		next
	    }
	/Polite people/ {
		polite [$3] += 1
		next
	    }
	/Relaying denied/ {
		relaying [$3] += 1
		next
	    }
	    {
		nonreconnu [$6] += 1
	    }
	END {
		printf "Date de debut = %s\n", premiere_date
		printf "Date de fin   = %s\n", derniere_date
		printf "\n"

		afficher(mapsrbl, "MAPS RBL", limite)
		afficher(client, "Unkonwn relay name (client SMTP pas dans le DNS)", limite)
		afficher(goaway, "Go away (liste noire locale)", limite)
		afficher(sender, "Sender address must resolve (adresse expediteur pas dans le DNS)", limite)
		afficher(polite, "Polite people give a qualified adddress", limite)
		afficher(relaying, "Relaying denied", limite)
		afficher(nonreconnu, "Messages non reconnus", limite)
	    }
	function afficher (tab, msg, lim,     s,n,tabtrie)
	{
	    s = 0
	    for (i in tab)
		s += tab [i]
	    printf "%s : %d occurrences\n", msg, s

	    trier(tab,tabtrie)
	    n = max(tabtrie [0] - lim, 1)
	    for (i = tabtrie [0] ; i >= n ; i--)
		printf "\t%5.5d %s\n", tab [tabtrie [i]], tabtrie [i]
	    printf "\n"
	}
	function max (i, j)
	{
	    return i > j ? i : j
	}
	function trier (tab, tabtrie,         clef,i,j,k,n)
	{
	    # chercher le nb d-elements du tableau
	    n = 0
	    for (i in tab)
		n += 1

	    tabtrie [0] = n
	    j = 1
	    for (i in tab)
	    {
		# assertion : tabtrie [1..j-1] est trie
		# on cherche a placer tab [i]
		clef = tab [i]
		for (k = 1 ; k < j ; k++)
		{
		    if (tab [tabtrie [k]] > clef)
			break
		}
		# assertion : il faut inserer juste avant k
		for (l = j ; l > k ; l--)
		    tabtrie [l] = tabtrie [l-1]

		tabtrie [k] = i
		j++
	    }
	}
    ' -

exit 0
