#!/bin/sh
#
# Copyright (c) 2010, 2011, The OpenDKIM Project.  All rights reserved.
#
# Script to generate some HTML-ized statistics for OpenDKIM

###
### Setup
###

# Command to perform a MySQL query and output HTML
MYSQL_CMD="mysql -s -N"

# Database name
DB=${OPENDKIM_DB:-opendkim}

# Database user
USER=${OPENDKIM_USER:-opendkim}

# Database user's password
PASSWORD=${OPENDKIM_PASSWORD:-password}

# Where to write the report
REALOUTPUT=${OPENDKIM_OUTPUT:-/var/www/docs/opendkim/graphs.html}
OUTPUT=${REALOUTPUT}.$$
GRAPHDIR=`dirname $REALOUTPUT`

# Domains of interest
DOMAINS=${OPENDKIM_DOMAINS:-"gmail.com,yahoo.com,paypal.com"}

###
### NO user-serviceable parts beyond this point
###

MYSQL="$MYSQL_CMD --user=$USER --password=$PASSWORD --database=$DB"

# output a header
cat > $OUTPUT << EOF
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
  <head>
   <title>
    OpenDKIM Statistics Report (Part II)
   </title>
  </head>

  <body>
EOF

echo "<h1>OpenDKIM Statistics Report (Part II) generated at `date` </h1>" >> $OUTPUT
echo "<hr>" >> $OUTPUT
echo "<ul>" >> $OUTPUT
for i in $(echo $DOMAINS | awk -F, '{for (c = 1; c <= NF; c++) print $c;}')
do
	echo '<li> <a href="'#$i'">'$i'</a>' >> $OUTPUT
done
echo '<li> <a href="#unsigned">unsigned</a>' >> $OUTPUT
echo "</ul>" >> $OUTPUT
echo "<hr>" >> $OUTPUT

for i in $(echo $DOMAINS | awk -F, '{for (c = 1; c <= NF; c++) print $c;}')
do
	echo '<a name="'$i'"></a>' >> $OUTPUT
	echo "<p> $i: </p>" >> $OUTPUT
	$MYSQL --execute="SELECT t1.x, t1.y, COUNT(*)/10 FROM (SELECT COUNT(*) AS x, SUM(spam) AS y FROM messages JOIN reporters ON reporters.id = messages.reporter JOIN signatures ON signatures.message = messages.id JOIN domains ON domains.id = signatures.domain WHERE enabled = 1 AND NOT spam = -1 AND domains.name = '"$i"' GROUP BY DATE(msgtime)) AS t1 GROUP BY t1.x, t1.y" > /tmp/ogg.data.$$
	cat > /tmp/ogg.script.$$ << EOF
set xrange [0:*]
set yrange [0:*]
unset log
unset label
set xtic auto
set ytic auto
set xlabel "received"
set ylabel "spam"
set terminal png size 800,600
EOF
	echo set title \"$i received-spam scatter plot\" >> /tmp/ogg.script.$$
	echo set output '"'/tmp/ogg.png.$$'"' >> /tmp/ogg.script.$$
	echo plot '"'/tmp/ogg.data.$$'"' using 1:2:3 notitle with circles >> /tmp/ogg.script.$$
	gnuplot /tmp/ogg.script.$$ | fgrep -v "empty y"
	rm -f /tmp/ogg.script.$$ -f /tmp/ogg.data.$$
	mv /tmp/ogg.png.$$ $GRAPHDIR/$i.png
	echo '<img src="'$i.png'">' >> $OUTPUT
	echo "" >> $OUTPUT
done

echo '<a name="unsigned"></a>' >> $OUTPUT
echo "<p> unsigned mail: </p>" >> $OUTPUT
$MYSQL --execute="SELECT t1.msgs, t1.spam, COUNT(*) FROM (SELECT COUNT(*) AS msgs, SUM(spam) AS spam FROM messages JOIN reporters ON reporters.id = messages.reporter WHERE enabled = 1 AND NOT EXISTS (SELECT * FROM signatures WHERE signatures.message = messages.id AND signatures.pass = 1) AND NOT spam = -1 GROUP BY DATE(msgtime)) AS t1 GROUP BY t1.msgs, t1.spam" > /tmp/ogg.data.$$
cat > /tmp/ogg.script.$$ << EOF
set xrange [0:*]
set yrange [0:*]
unset log
unset label
set xtic auto
set ytic auto
set xlabel "received"
set ylabel "spam"
set terminal png size 800,600
EOF
echo set title \"unsigned mail received-spam scatter plot\" >> /tmp/ogg.script.$$
echo set output '"'/tmp/ogg.png.$$'"' >> /tmp/ogg.script.$$
echo plot '"'/tmp/ogg.data.$$'"' using 1:2:3 notitle with circles >> /tmp/ogg.script.$$
gnuplot /tmp/ogg.script.$$ | fgrep -v "empty y"
rm -f /tmp/ogg.script.$$ -f /tmp/ogg.data.$$
mv /tmp/ogg.png.$$ $GRAPHDIR/unsigned.png
echo '<img src="unsigned.png">' >> $OUTPUT
echo "" >> $OUTPUT

# output a footer
echo "<hr>" >> $OUTPUT
echo '<font size="-1"> <i> $Id: opendkim-gengraphs,v 1.26 2010/10/27 06:18:45 cm-msk Exp $ </i> </font>' >> $OUTPUT
cat >> $OUTPUT << EOF
  </body>
</html>
EOF

# all done!
mv $OUTPUT $REALOUTPUT
exit 0
