File: statstable.sh

package info (click to toggle)
qsf 1.2.7-1
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd, lenny, squeeze, wheezy
  • size: 1,372 kB
  • ctags: 598
  • sloc: ansic: 9,981; sh: 816; awk: 17; makefile: 6
file content (160 lines) | stat: -rw-r--r-- 4,439 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#!/bin/sh
#
# Script to generate an HTML table of stats on standard output, generated
# from the MySQL table maintained by mailstats.sh.
#
# This script requires the MySQL command-line client, `mysql'. It may need
# to run under bash, rather than Bourne shell; this has not been tested.
#
# Fill in the MYSQL* variables to make this script work, and alter DAYS
# (number of days in the past to start from), HOURDIV (number of hours
# between rows), and BARLEN (pixel width of bar graph) as appropriate.
#
# Copyright 2007 Andrew Wood, distributed under the Artistic License.
#

MYSQLUSER=
MYSQLPASS=
MYSQLDB=
MYSQLTABLE=spamlog

DAYS=14
HOURDIV=24
BARLEN=300

# Remove this next line to enable this script!
echo "Please read this script first, copy it, THEN run it."; exit 1

TOTALS=\
'  COUNT(IF(type="SPAM",1,NULL)) AS spam,
   COUNT(IF(type="SPAM-BOUNCE",1,NULL)) AS spambounce,
   COUNT(IF(type="SPAM-REPLY",1,NULL)) AS spamreply,
   COUNT(IF(type="DELIVERED",1,NULL)) AS delivered,
   COUNT(IF(type="RETRAIN-SPAM",1,NULL)) AS retrainspam,
   COUNT(IF(type="RETRAIN-NONSPAM",1,NULL)) AS retrainnonspam'


function graph_row () {
	local VAL COL NAME MAX BARLEN WIDTH

	VAL="$1"
	COL="$2"
	NAME="$3"
	MAX="$4"
	BARLEN="$5"

	WIDTH=$[$[$VAL * $BARLEN] / $MAX]
	[ $WIDTH -lt 0 ] && WIDTH=0

	echo '<tr><td><table border="0" cellspacing="0" cellpadding="0">'

	if [ $WIDTH -lt 1 ]; then
		echo '<tr><td style="font-size: 6px;"'
	else
		echo '<tr><td style="background-color: #'"$COL"'; font-size: 6px;"'
		echo "width=\"$WIDTH\""
	fi
	echo ">&nbsp;</td>"

	if [ $[$ROWNUM % 10] -eq 1 ]; then
		echo "<td width=\"$[$BARLEN-$WIDTH]\" align=\"right\""
		echo "style=\"font-size: 6px;\">$NAME</td>"
	fi

	echo '</tr>'

	echo '</table></td></tr>'
}


export BARLEN
export HOURDIV

MAX=`mysql -u $MYSQLUSER -p$MYSQLPASS $MYSQLDB -B -N -e \
  'SELECT '"$TOTALS"'
  FROM '"$MYSQLTABLE"'
  WHERE stamp >= DATE_SUB(FROM_DAYS(TO_DAYS(NOW())), INTERVAL '"$DAYS"' DAY)
  GROUP BY
  DATE_FORMAT(stamp,"%Y-%m-%d"),
  '"$HOURDIV"'*FLOOR(EXTRACT(HOUR FROM stamp)/'"$HOURDIV"')' \
| ( while read ROWS ROWSB ROWSR ROWD ROWRS ROWRN; do
	SPAM=$[$[$ROWS-$ROWSR]+$ROWRS]
	FALSENEG=$ROWRS
	NONSPAM=$[$[$ROWD+$ROWRN]-$ROWRS]
	FALSEPOS=$ROWSR
  	echo $SPAM
  	echo $FALSENEG
  	echo $NONSPAM
  	echo $FALSEPOS
  done ) \
| sort -n \
| tail -n 1`

[ $MAX -lt 1 ] && MAX=1
export MAX

mysql -u $MYSQLUSER -p$MYSQLPASS $MYSQLDB -B -N -e \
  'SELECT DATE_FORMAT(stamp,"%Y-%m-%d") AS date,
  '"$HOURDIV"'*FLOOR(EXTRACT(HOUR FROM stamp)/'"$HOURDIV"') AS hour,
  '"$TOTALS"'
  FROM '"$MYSQLTABLE"'
  WHERE stamp >= DATE_SUB(FROM_DAYS(TO_DAYS(NOW())), INTERVAL '"$DAYS"' DAY)
  GROUP BY date,hour' \
| (
echo '<table class="spamlog" border="0" cellpadding="2" cellspacing="0">'
echo '<tr>'
echo '<th align="right">Date</th>'
[ $HOURDIV -lt 24 ] && echo '<th align="right">Time</th>'
echo '<th align="right" class="firstval"><span title="Spam (JMBA replied)">S</span></th>'
echo '<th align="right" class="val"><span title="JMBA bounced">SB</span></th>'
echo '<th align="right" class="val"><span title="JMBA returned">SR</span></th>'
echo '<th align="right" class="val"><span title="Delivered">D</span></th>'
echo '<th align="right" class="val"><span title="Retrain (spam)">RS</span></th>'
echo '<th align="right" class="val"><span title="Retrain (nonspam)">RN</span></th>'
echo '<th>&nbsp;</th>'
echo '</tr>'
PREVDATE=""
ROWNUM=0
while read DATE TIME ROWS ROWSB ROWSR ROWD ROWRS ROWRN; do

	SPAM=$[$[$ROWS-$ROWSR]+$ROWRS]
	FALSENEG=$ROWRS
	NONSPAM=$[$[$ROWD+$ROWRN]-$ROWRS]
	FALSEPOS=$ROWSR

	ROWNUM=$[1+$ROWNUM]

	if [ "$DATE" = "$PREVDATE" ]; then
		echo '<tr>'
		echo '<td align="right" valign="top">&nbsp;</td>'
	else
		echo '<tr class="newdate">'
		echo "<td align=\"right\" valign=\"top\">$DATE</td>"
	fi
	PREVDATE=$DATE
	[ $HOURDIV -lt 24 ] \
	&& echo "<td align=\"right\" valign=\"top\">$TIME:00</td>"

	FIRSTVAL=1
	for VAL in $ROWS $ROWSB $ROWSR $ROWD $ROWRS $ROWRN; do
		C=val
		[ $FIRSTVAL = 1 ] && C=firstval
		FIRSTVAL=0
		echo "<td align=\"right\" valign=\"top\" class=\"$C\">$VAL</td>"
	done

	echo '<td><table border="0" cellspacing="0" cellpadding="0">'

	graph_row $NONSPAM '080' 'Non-spam' $MAX $BARLEN
	graph_row $FALSEPOS '800' 'Non-spam falsely marked as spam' $MAX $BARLEN
	graph_row $SPAM '088' 'Spam' $MAX $BARLEN
	graph_row $FALSENEG '008' 'Spam that slipped through' $MAX $BARLEN

	echo '</table></td>'

	echo '</tr>'
done
echo '</table>'
)

# EOF