#!/bin/sh

LOGFILE="/var/log/maillog"
RRDFILE_RCV="/var/lib/lstat/rrd/rcvdmails.rrd"
RRDFILE_DLV="/var/lib/lstat/rrd/dlvmails.rrd"
PNGDIR="/var/www/lstat"

if [ ! -e "$RRDFILE_RCV" ]; then
    rrdtool create "$RRDFILE_RCV" \
            -s 180 \
            DS:vir:GAUGE:200:0:100000 \
            DS:banned:GAUGE:200:0:100000 \
            DS:novir:GAUGE:200:0:100000 \
	    RRA:LAST:0:1:1 \
            RRA:AVERAGE:0:1:480 \
            RRA:AVERAGE:0:10:336 \
            RRA:AVERAGE:0.1:4:360 \
            RRA:AVERAGE:0.25:4:1080
fi
if [ ! -e "$RRDFILE_DLV" ]; then
    rrdtool create "$RRDFILE_DLV" \
            -s 180 \
            DS:spam:GAUGE:200:0:100000 \
            DS:nospam:GAUGE:200:0:100000 \
	    RRA:LAST:0:1:1 \
            RRA:AVERAGE:0:1:480 \
            RRA:AVERAGE:0:10:336 \
            RRA:AVERAGE:0.1:4:360 \
            RRA:AVERAGE:0.25:4:1080
fi

LOGLENSTOP="$( ls -l $LOGFILE | awk '{ print $5 }' )"
LOGLENSTART="$( cat /var/run/logstat 2>/dev/null )"
[ -z "$LOGLENSTART" ] && LOGLENSTART=0
if [ "$1" != "graph" ]; then
if [ "$LOGLENSTART" -eq "$LOGLENSTOP" ]; then
	rrdupdate "$RRDFILE_RCV" "N:0:0:0"
	rrdupdate "$RRDFILE_DLV" "N:0:0"
else
	echo "$LOGLENSTOP" > /var/run/logstat
	VAL="$( /usr/local/bin/part "$LOGFILE" $LOGLENSTART $LOGLENSTOP |\
	awk '
BEGIN { novir = 0; banned = 0; vir = 0; spam = 0; nospam = 0 }
/amavis\[[0-9]*\]: \([0-9]*-[0-9]*\) Passed/ { novir++ }
/amavis\[[0-9]*\]: \([0-9]*-[0-9]*\) BANNED/ { banned++ }
/amavis\[[0-9]*\]: \([0-9]*-[0-9]*\) INFECTED/ { vir++ }
/spamd\[[0-9]*\]: identified spam/ { spam++ }
/spamd\[[0-9]*\]: clean message/ { nospam++ }
END { printf("N:%d:%d:%d\n", vir, banned, novir)
printf("N:%d:%d\n", spam, nospam) }
' )"
{
	read RCV_VAL
	read DLV_VAL
} << EOF
$VAL
EOF
###	logger -t logpart.sh "Rcvd: $RCV_VAL, Dlvd: $DLV_VAL"
	logger -t mailstat "Rcvd: $RCV_VAL, Dlvd: $DLV_VAL"
	rrdupdate "$RRDFILE_RCV" "$RCV_VAL"
	rrdupdate "$RRDFILE_DLV" "$DLV_VAL"
fi
fi

graph_rcv() {
	TYPE_EN="$1"
	TYPE_PL="$2"
	WIDTH="$3"
	STEP="$4"
	TIME="$5"
	rrdtool graph "$PNGDIR/rcvdmails-$TYPE_EN.png" \
	--imgformat="PNG" \
	--start="-$(( $TIME + 300))" \
	--end="-300" \
	--vertical-label="ilosc/min" \
	--width="$WIDTH" \
	--height=300 \
	--step="$STEP" \
	--title="Ilosc maili otrzymanych - $TYPE_PL ($( date +'%Y-%m-%d %H:%M:%S' ))" \
	"DEF:a1=$RRDFILE_RCV:vir:AVERAGE" \
	"DEF:a2=$RRDFILE_RCV:banned:AVERAGE" \
	"DEF:a3=$RRDFILE_RCV:novir:AVERAGE" \
	"CDEF:wipeout=a1,UN,a2,UN,a3,UN,MIN,MIN,INF,UNKN,IF" \
	"CDEF:c1=a1,3,/" \
	"CDEF:c2=a2,3,/" \
	"CDEF:c3=a3,3,/" \
	"CDEF:bad=c1,c2,+" \
	"CDEF:sum=bad,c3,+" \
	"CDEF:sumbad=PREV,UN,0,PREV,IF,a1,a2,+,+" \
	"CDEF:sumtotal=PREV,UN,0,PREV,IF,a1,a2,a3,+,+,+" \
	"CDEF:percent=sumbad,100,*,sumtotal,/" \
	"COMMENT:Ilosc otrzymanych maili (na minute):" \
	"AREA:wipeout#C0C0C0" \
	"AREA:c2#FF0000:zablokowane" \
	"STACK:c1#0000FF:wirusy" \
	"STACK:c3#00FF00:czyste\n" \
	"LINE1:sum#000000" \
	'GPRINT:sum:LAST:W ciagu ostatnich 3 minut otrzymano %1.0lf wiadomosci,\g' \
	'GPRINT:bad:LAST: w tym %1.0lf wirusow/zablokowanych\n' \
	'COMMENT:Srednia ilosc otrzymanych (na minute):\g' \
	'GPRINT:c3:AVERAGE: czyste\: %1.2lf,\g' \
	'GPRINT:c2:AVERAGE: zablokowane\: %1.2lf,\g' \
	'GPRINT:c1:AVERAGE: wirusy\: %1.2lf\n' \
	'GPRINT:sumtotal:LAST:Lacznie otrzymano w analizowanym okresie %1.0lf wiadomosci,\g' \
	'GPRINT:sumbad:LAST: w tym %1.0lf wirusów/zablokowanych\g' \
	'GPRINT:percent:LAST: (%02.02lf%%)' \
	> /dev/null
}

graph_dlv() {
	TYPE_EN="$1"
	TYPE_PL="$2"
	WIDTH="$3"
	STEP="$4"
	TIME="$5"
	rrdtool graph "$PNGDIR/dlvmails-$TYPE_EN.png" \
	--imgformat="PNG" \
	--start="-$(( $TIME + 300))" \
	--end="-300" \
	--end="-5 minutes" \
	--vertical-label="ilosc/min" \
	--width="$WIDTH" \
	--height=300 \
	--step="$STEP" \
	--title="Ilosc maili dostarczonych lokalnie - $TYPE_PL ($( date +'%Y-%m-%d %H:%M:%S' ))" \
	"DEF:a1=$RRDFILE_DLV:spam:AVERAGE" \
	"DEF:a2=$RRDFILE_DLV:nospam:AVERAGE" \
	"CDEF:wipeout=a1,UN,a2,UN,MIN,INF,UNKN,IF" \
	"CDEF:c1=a1,3,/" \
	"CDEF:c2=a2,3,/" \
	"CDEF:sum=c1,c2,+" \
	"CDEF:sumspam=PREV,UN,0,PREV,IF,c1,+" \
	"CDEF:sumtotal=PREV,UN,0,PREV,IF,c1,c2,+,+" \
	"CDEF:percent=sumspam,100,*,sumtotal,/" \
	"COMMENT:ilosc dostarczonych maili (na minute)" \
	"AREA:wipeout#C0C0C0" \
	"AREA:c1#FF0000:spam" \
	"STACK:c2#00FF00:czyste\n" \
	"LINE1:sum#000000" \
	'GPRINT:sum:LAST:W ciagu ostatnich 3 minut dostarczono %1.0lf wiadomosci,\g' \
	'GPRINT:c1:LAST: w tym %1.0lf spamow\n' \
	'COMMENT:Srednia ilosc dostarczanych (na minute):\g' \
	'GPRINT:c2:AVERAGE: czyste\: %1.2lf,\g' \
	'GPRINT:c1:AVERAGE: spam\: %1.2lf\n' \
	'GPRINT:sumtotal:LAST:Lacznie dostarczono w analizowanym okresie %1.0lf wiadomosci,\g' \
	'GPRINT:sumspam:LAST: w tym %1.0lf zidentyfikowanych jako spam\g' \
	'GPRINT:percent:LAST: (%02.02lf%%)' \
	> /dev/null
}

graph_rcv "2hourly" "2-godzinny"	800 180		"$(( 7020 ))"
graph_rcv "daily" "dzienny"		800 180		"$(( 29 * 3600 ))"
graph_rcv "weekly" "tygodniowy"		920 1260	"$(( 7 * 24 * 3600 ))"
graph_rcv "monthly" "miesieczny"	800 0		"$(( 30 * 24 * 3600 ))"
graph_dlv "2hourly" "2-godzinny"	800 180		"$(( 7020 ))"
graph_dlv "daily" "dzienny"		800 180		"$(( 29 * 3600 ))"
graph_dlv "weekly" "tygodniowy"		920 1260	"$(( 7 * 24 * 3600 ))"
graph_dlv "monthly" "miesieczny"	800 0		"$(( 30 * 24 * 3600 ))"

