Apply 79_archiver_slash.patch
[mspang/vmailman.git] / contrib / mmdsr
1 #!/bin/sh
2 ###############################################################################
3 # mmdsr -- Mailman Daily Status Report (cron job, run at 23:59)
4 ###############################################################################
5 # Copyright (c) 2005, Brad Knowles
6 # All rights reserved.
7
8 # Redistribution and use in source and binary forms, with or without
9 # modification, are permitted provided that the following conditions
10 # are met:
11
12 #     Redistributions of source code must retain the above copyright
13 #     notice, this list of conditions and the following disclaimer.
14
15 #     Redistributions in binary form must reproduce the above copyright
16 #     notice, this list of conditions and the following disclaimer
17 #     in the documentation and/or other materials provided with the
18 #     distribution.
19
20 #     The name of the author or other contributors may not be used
21 #     to endorse or promote products derived from this software without
22 #     specific prior written permission.
23
24 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28 # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 # POSSIBILITY OF SUCH DAMAGE.
36 ###############################################################################
37
38 ###############################################################################
39 # Version history
40 ###############################################################################
41 # 0.0.1         Initial creation by Brad Knowles <brad@stop.mail-abuse.org>
42 #               Created on: Tue Feb 15 04:01:20 PST 2005
43 #
44 # 0.0.2         Update by Brad Knowles <brad@stop.mail-abuse.org>
45 #               Updated on: Wed Feb 16 18:55:52 CET 2005
46 #               Feedback from Tom G. Christensen (tgc99):
47 #               > The current UID grab command doesn't work on Solaris 
48 #               > (2.6 & 8 tested).      
49 #               >
50 #               > I'd recommend this instead:
51 #               > ps -o user -p $$|tail -1
52 #               >
53 #               > This is tested and works on RH 6.2, RH 7.3, RHEL 2.1,
54 #               > RHEL3, FC3, FreeBSD 4.9, Solaris 2.6, 8.
55 #
56 # 0.0.3         Update by Brad Knowles <brad@stop.mail-abuse.org>
57 #               Updated on: Sun Mar 13 01:15:24 CET 2005
58 #               Noted errors from grep when trying to search a nonexistant
59 #               file.  Added "-s" option to compensate, and extra code to
60 #               notify the admin if the log file doesn't exist.
61 #
62 # 0.0.4         Update by Brad Knowles <brad@stop.mail-abuse.org>
63 #               Updated on: Sun Mar 13 01:58:37 CET 2005
64 #               Eliminate some extra cruft from the "fromusenet" logs.
65 #
66 # 0.0.5         Update by Brad Knowles <brad@stop.mail-abuse.org>
67 #               Updated on: Wed Apr 13 00:54:42 CEST 2005
68 #               Eliminate a lot of extra cruft from the "error" & "vette" logs.
69 #               Eliminate more cruft from the "fromusenet" logs.
70 #
71 # 0.0.6         Update by Brad Knowles <brad@stop.mail-abuse.org>
72 #               Updated on: Thu Apr 14 03:07:08 CEST 2005
73 #               Eliminate even more cruft from the "fromusenet" logs.
74 #               Eliminate more cruft from the "vette" logs.
75 #               Eliminate cruft from the "mischief" logs.
76 #
77 # 0.0.7         Update by Brad Knowles <brad@stop.mail-abuse.org>
78 #               Updated on: Sun May  1 22:29:13 CEST 2005   [guess]
79 #               The "error" log "no such list" errors didn't need to be
80 #               quite so "compressed", open them up to be more readable.
81 #               Also eliminate all use of "xargs", use "fmt -w 75" instead.
82 #
83 # 0.0.8         Update by Brad Knowles <brad@stop.mail-abuse.org>
84 #               Updated on: Sun May  1 23:09:13 CEST 2005
85 #               Clean up code for queue subdirectories to check.
86 #
87 # 0.0.9         Update by Brad Knowles <brad@stop.mail-abuse.org>
88 #               Updated on: Wed May 11 01:23:40 CEST 2005
89 #               Eliminate date/time stamps from the rest of the logs,
90 #               then pipe through `sort | uniq -c | sort -nr`
91 #               so that all possible duplicates are eliminated.
92 #
93 # 0.0.10        Update by Brad Knowles <brad@stop.mail-abuse.org>
94 #               Updated on: Tue Jul 12 16:53:49 CDT 2005
95 #               Add code to do summary of normal list activity
96 #
97 # 0.0.11        Update by Brad Knowles <brad@stop.mail-abuse.org>
98 #               Updated on: Tue Sep  6 15:44:19 CEST 2005
99 #               Tweaked display of Mailman/qfiles subdirectories
100 #               so as to avoid displaying more than $MAX_LINES
101 #               output, which really helps if you have thousands
102 #               of bounces sitting around, etc....
103 #               Also slightly tweaked display of fromusenet logs
104 #               to split summary from errors.
105 #
106 # 0.0.12        Update by Brad Knowles <brad@stop.mail-abuse.org>
107 #               Updated on: Thu Sep 22 22:37:35 CEST 2005
108 #               Bugs found by Mark Sapiro and Adrian Wells.
109 #               Mark suggested splitting the Mailman log directory
110 #               from the rest of the Mailman source and queues,
111 #               as well as making sure to clean up all temp files.
112 #               Adrian discovered that there was a log file format
113 #               change between Mailman 2.1.5 and 2.1.6, which broke
114 #               hourly statistics.
115 #
116 # 0.0.13        Update by Brad Knowles <brad@stop.mail-abuse.org>
117 #               Updated on: Mon Dec 26 05:54:27 CET 2005
118 #               Bugs found by Tom G. Christensen (tgc99):
119 #               > ps output on solaris is full of whitespace but a further
120 #               > echo get's rid of it.
121 #               > The lines in the smtp log are sometimes broken up by a
122 #               > newline (right before the msgid) which throws of the
123 #               > summary. Piping it through sed first will rejoin the broken
124 #               > lines.
125 #               > Use $AWK instead of awk.
126 #               Enhancements from Mark Sapiro:
127 #               > The vette log summary lists posts held for moderation
128 #               > individually under "Other Errors:". The following patch
129 #               > (watch out for wrapped lines) summarizes them by list instead.
130 #
131 # 0.0.14        Update by Brad Knowles <brad@stop.mail-abuse.org>
132 #               Updated on: Thu Dec 29 08:17:38 CET 2005
133 #               Added code to check /usr/local/mailman/data for
134 #               moderation hold queue
135 #
136 # 0.0.15        Update by Brad Knowles <brad@stop.mail-abuse.org>
137 #               Updated on: Thu Jan 26 02:39:38 CET 2006
138 #               Tweaked display of summary data in the "smtp-failure" log,
139 #               and "other" category in the "vette" log, so as to reduce
140 #               the spewage when things go wonky, mostly by removing
141 #               unique-ifying data like message-id or sender address.
142 #               Also tweaked moderation queue information, to tell us
143 #               how many Python pickle files are in the data directory,
144 #               as opposed to just doing a directory listing and skipping
145 #               the files in the middle if there are too many -- now we
146 #               know how many are being skipped.
147 #
148 # 0.0.16        Update by Brad Knowles <brad@stop.mail-abuse.org>
149 #               Updated on: Sun Jan 29 11:45:58 CET 2006
150 #               Mark found a couple of typos that I somehow let slip
151 #               through.  Thanks!
152
153 ###############################################################################
154 # Set up locations of standard commands, directories, etc....
155 # You may need to modify these for your platform or installation.
156 ###############################################################################
157
158 AWK="/usr/bin/awk"
159 BASENAME="/usr/bin/basename"
160 CAT="/bin/cat"
161 DATE="/bin/date"
162 EGREP="/bin/egrep"
163 FMT="/usr/bin/fmt"
164 GREP="/bin/grep"
165 HEAD="/usr/bin/head"
166 LS="/bin/ls"
167 PS="/bin/ps"
168 RM="/bin/rm"
169 SED="/bin/sed"
170 SENDMAIL="/usr/sbin/sendmail"
171 SLEEP="/bin/sleep"
172 SORT="/usr/bin/sort"
173 TAIL="/usr/bin/tail"
174 TOUCH="/bin/touch"
175 TR="/usr/bin/tr"
176 UNIQ="/usr/bin/uniq"
177 XARGS="/usr/bin/xargs"
178 WC="/usr/bin/wc"
179
180 ###############################################################################
181 # Directory for temporary files
182 ###############################################################################
183 TMPDIR="/tmp"
184
185 ###############################################################################
186 # Mailman queue directory
187 ###############################################################################
188 QUEUEDIR="/usr/local/mailman/qfiles"
189
190 ###############################################################################
191 # Mailman log directory
192 ###############################################################################
193 LOGDIR="/usr/local/mailman/logs"
194
195 ###############################################################################
196 # Mailman data directory
197 ###############################################################################
198 DATADIR="/usr/local/mailman/data"
199
200 ###############################################################################
201 # Maximum number of subdirectory entries to display in report
202 ###############################################################################
203 MAX_QUEUE_LINES=20
204
205 ###############################################################################
206 # Maximum number of moderation queue pickle files to display in report
207 ###############################################################################
208 MAX_DATA_LINES=100
209
210 ###############################################################################
211 # Mailman Log files to check for errors.
212 # No need to specify path, only log file name.
213 ###############################################################################
214 ERR_LOGS="error fromusenet locks mischief post qrunner smtp-failure vette"
215
216 ###############################################################################
217 # Mailman Log files to summarize.
218 # No need to specify path, only log file name.
219 ###############################################################################
220 SUM_LOGS="fromusenet post smtp"
221
222 ###############################################################################
223 # Mailman queue subdirectories to check.  No need to specify path, only name.
224 ###############################################################################
225 SUBDIRS="archive bounces commands in news out retry shunt virgin"
226
227 ###############################################################################
228 # Specify recipients for report.  If none, then simply print to "STDOUT".
229 # Specify sender address for report.  Not used if recipient list is empty.
230 ###############################################################################
231
232 SENDER="INSERT.YOUR.SENDER.ADDRESS@HERE"
233 RCPTS="INSERT.YOUR.RECIPIENTS.ADDRESSES@HERE"
234
235 ###############################################################################
236 # If you run this program in cron at 23:59:00, you need to sleep sixty
237 # seconds to make sure that you capture all the logs for the previous day.
238 # Comment this line out to disable sleeping altogether.
239 ###############################################################################
240
241 SLEEPTIME=60
242
243 ###############################################################################
244 # What user id is Mailman installed under?
245 # How do we determine what UID this program is running as?
246 # NB:   There will probably be SysV vs. BSD semantic differences here.
247 #       Be careful.  Make sure the command you specify actually works.
248 #       The command string specified here may seem arcane, but should pull
249 #       out the information we need, and throw away everything else.  If
250 #       there is an easier cross-platform way to do it, please let me know.
251 ###############################################################################
252
253 GRABUID=`$PS -o user -p $$ | $TAIL -1`
254 MYUID=`echo $GRABUID`
255 RUNAS="mailman"
256
257 ###############################################################################
258 # No modifications below this line should be required.
259 ###############################################################################
260
261 DAY=`$DATE '+%b %d'`
262 YEAR=`$DATE '+%Y'`
263
264 PROG=`$BASENAME $0`
265
266 if [ "${MYUID}" != "${RUNAS}" -a "${MYUID}" != "root" ] ; then
267     echo "ERROR: You must be root or ${RUNAS} to run $PROG."
268     exit 1
269 fi
270
271 if [ "${SLEEPTIME}" != "" -a "${RCPTS}x" != "${SENDER}x" ] ; then
272     if [ $SLEEPTIME -gt 0 ] ; then
273         $SLEEP $SLEEPTIME
274     fi
275 fi
276
277 TMP="$TMPDIR/.$PROG.$$"
278 TMPLOG="$TMP.log"
279 $RM -f $TMP
280 $TOUCH $TMP
281
282 if [ "${RCPTS}x" != "x" ] ; then
283     echo "From: ${SENDER}" >> $TMP
284     echo "To: ${RCPTS}" >> $TMP
285     echo "Subject: Mailman Daily Status Report: $DAY $YEAR" >> $TMP
286     echo "" >> $TMP
287 fi
288
289 echo "          Mailman Daily Status Report: $DAY $YEAR" >> $TMP
290 echo "" >> $TMP
291 echo "" >> $TMP
292
293 echo "******************************" >> $TMP
294 echo "Log File Summary" >> $TMP
295 echo "******************************" >> $TMP
296 echo "" >> $TMP
297
298 for LOG in $SUM_LOGS
299 do
300
301     $RM -f $TMPLOG
302     $TOUCH $TMPLOG
303     echo "Log file: $LOG" >> $TMP
304     echo "==============================" >> $TMP
305
306     if [ -f "$LOGDIR/${LOG}" ] ; then
307     $SED -e :a -e '$!N;s/\n //;ta' -e 'P;D' $LOGDIR/$LOG | $GREP -si "^$DAY [0-9][0-9:]* $YEAR" >> $TMPLOG
308
309         if [ "${LOG}" = "post" ] ; then
310
311             echo "" >> $TMP
312             echo "Hourly Summary of Posts" >> $TMP
313             echo "-----------------------" >> $TMP
314
315             $SED -e 's/^[A-Z][a-z][a-z] *[0-9]* //' -e 's/:.*$//' $TMPLOG | $UNIQ -c | $SORT -n +1 | $AWK '{ printf( "%8d  %02d:00-%02d:59\n", $1, $2, $2 ) }' >> $TMP
316
317             echo "" >> $TMP
318             echo "Post Count by List" >> $TMP
319             echo "------------------" >> $TMP
320
321             $SED -e 's/^.* post to //' -e 's/ .*$//' $TMPLOG | $SORT | $UNIQ -c | $SORT -nr >> $TMP
322
323             echo "" >> $TMP
324             echo "Post Count by Sender" >> $TMP
325             echo "--------------------" >> $TMP
326
327             $SED -e 's/^.* from //' -e 's/,.*$//' $TMPLOG | $SORT | $UNIQ -c | $SORT -nr >> $TMP
328
329         elif [ "${LOG}" = "fromusenet" ] ; then
330
331             GRPS=`$EGREP -vi '(watermark:|nothing new| posted to |: \[[0-9\.]*\])' $TMPLOG | $GREP -i ' gating ' | $AWK '{ print $7 }' | $SORT -u | $FMT -w 75`
332
333             for GRP in $GRPS
334             do
335                 echo "" >> $TMP
336                 echo "$GRP Article #'s Gated:" >> $TMP
337                 echo "------------------------------" >> $TMP
338                 $EGREP -vi '(watermark:|nothing new| posted to |: \[[0-9\.]*\])' $TMPLOG | $GREP -i " gating " | $GREP -i " $GRP " | $SED -e 's/^.*\[//' -e 's/\]$//' -e 's/\.\./ /' | $TR ' ' '\n' |  $SORT -u | $FMT -w 75 >> $TMP
339             done
340
341         elif [ "${LOG}" = "smtp" ] ; then
342
343             echo "" >> $TMP
344             echo "Hourly Summary of Messages Sent" >> $TMP
345             echo "-------------------------------" >> $TMP
346             $SED -e 's/^[A-Z][a-z][a-z] *[0-9]* //' -e 's/:.* for / /' -e 's/ recips,.*$//' $TMPLOG | $AWK '{ val=int($1); sum[val]+=$2 } END { for (i=0; i<24; i++) { printf "%8d %02d:00-%02d:59\n", sum[i], i, i } }' >> $TMP
347
348         else
349
350             $SED 's/^.* ([0-9]*) //' $TMPLOG | $SORT | $UNIQ -c | $SORT -nr >> $TMP
351
352         fi
353
354     else
355
356         echo " ### Log file ${LOG} does not exist ### " >> $TMP
357
358     fi
359
360     echo "" >> $TMP
361
362 done
363
364 echo "******************************" >> $TMP
365 echo "Log File Squawks" >> $TMP
366 echo "******************************" >> $TMP
367 echo "" >> $TMP
368
369 for LOG in $ERR_LOGS
370 do
371     $RM -f $TMPLOG
372     $TOUCH $TMPLOG
373     echo "Log file: $LOG" >> $TMP
374     echo "==============================" >> $TMP
375     $GREP -si "^$DAY [0-9][0-9:]* $YEAR" $LOGDIR/$LOG >> $TMPLOG
376
377     if [ -f "$LOGDIR/${LOG}" ] ; then
378
379         if [ "${LOG}" = "error" ] ; then
380
381             echo "Uncaught Runner Exceptions:" >> $TMP
382             echo "------------------------------" >> $TMP
383             $GREP 'Uncaught runner exception' $TMPLOG | $SED 's/^.*exception: //' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
384
385             echo "" >> $TMP
386             echo "No Such List:" >> $TMP
387             echo "------------------------------" >> $TMP
388             $GREP 'No such list' $TMPLOG | $SED -e 's/^.* "//' -e 's/".*$//' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
389
390             CNT=`$GREP -i 'shunting' $TMPLOG | $WC -l`
391             if [ "${CNT}x" != "x" ] ; then
392                 if [ ${CNT} -gt 0 ] ; then
393                     echo "" >> $TMP
394                     echo "Shunting Count: $CNT" >> $TMP
395                     echo "------------------------------" >> $TMP
396                 fi
397             fi
398
399             echo "" >> $TMP
400             echo "Other Errors:" >> $TMP
401             echo "------------------------------" >> $TMP
402             $EGREP -vi '(Uncaught runner exception|No such list|Ignoring unparseable message|Traceback|shunting)' $TMPLOG | $SED 's/^.* ([0-9]*) //' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
403
404         elif [ "${LOG}" = "fromusenet" ] ; then
405
406             $EGREP -vi '(watermark:|nothing new| posted to |: \[[0-9\.]*\])' $TMPLOG | $GREP -vi " gating " | $SED 's/^.* ([0-9]*) //' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
407
408         elif [ "${LOG}" = "mischief" ] ; then
409
410             echo "" >> $TMP
411             echo "Login failure with private rosters (by user):" >> $TMP
412             echo "------------------------------" >> $TMP
413             $GREP -i 'Login failure with private rosters' $TMPLOG | $AWK '{ print $NF }' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
414
415             echo "" >> $TMP
416             echo "Unsub attempt of non-member (by user):" >> $TMP
417             echo "------------------------------" >> $TMP
418             $GREP -i 'Unsub attempt of non-member' $TMPLOG | $AWK '{ print $NF }' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
419
420             echo "" >> $TMP
421             echo "Reminder attempt of non-member (by user):" >> $TMP
422             echo "------------------------------" >> $TMP
423             $GREP -i 'Reminder attempt of non-member' $TMPLOG | $AWK '{ print $NF }' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
424
425             echo "" >> $TMP
426             echo "Other Messages:" >> $TMP
427             echo "------------------------------" >> $TMP
428             $EGREP -vi '(Login failure with private rosters|Unsub attempt of non-member|Reminder attempt of non-member)' $TMPLOG | $SED 's/^.* ([0-9]*) //' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
429
430         elif [ "${LOG}" = "post" ] ; then
431
432             $GREP -vi 'success' $TMPLOG | $SED 's/^.* ([0-9]*) //' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
433
434         elif [ "${LOG}" = "vette" ] ; then
435
436             echo "" >> $TMP
437             echo "Message held -- Post by non-member (by list):" >> $TMP
438             echo "------------------------------" >> $TMP
439             $GREP 'Post by non-member' $TMPLOG | $AWK '{ print $6 }' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
440
441             echo "" >> $TMP
442             echo "Message held -- Suspicious header (by list):" >> $TMP
443             echo "------------------------------" >> $TMP
444             $GREP -i 'suspicious header' $TMPLOG | $AWK '{ print $6 }' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
445
446             echo "" >> $TMP
447             echo "Discarded posting (by list):" >> $TMP
448             echo "------------------------------" >> $TMP
449             $GREP -i 'Discarded posting' $TMPLOG | $AWK '{ print $6 }' | $SED 's/:$//' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
450
451             echo "" >> $TMP
452             echo "Bulk/Junk message discarded (by list):" >> $TMP
453             echo "------------------------------" >> $TMP
454             $EGREP -i '(bulk|junk) message discarded' $TMPLOG | $AWK '{ print $NF }' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
455
456             echo "" >> $TMP
457             echo "Implicit destination (by list):" >> $TMP
458             echo "------------------------------" >> $TMP
459             $GREP -i 'Message has implicit destination' $TMPLOG | $AWK '{ print $6 }' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
460
461             echo "" >> $TMP
462             echo "Post to moderated newsgroup (by list):" >> $TMP
463             echo "------------------------------" >> $TMP
464             $GREP -i 'Posting to a moderated newsgroup' $TMPLOG | $AWK '{ print $6 }' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
465
466             echo "" >> $TMP
467             echo "Post to moderated list (by list):" >> $TMP
468             echo "------------------------------" >> $TMP
469             $GREP -i 'Post to moderated list' $TMPLOG | $AWK '{ print $6 }' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
470
471             echo "" >> $TMP
472             echo "Other Errors:" >> $TMP
473             echo "------------------------------" >> $TMP
474             $EGREP -vi '(Post by non-member|suspicious header|message approved|Discarded posting|bulk message discarded|junk message discarded|Message has implicit destination|Posting to a moderated newsgroup|Post to moderated list|Message discarded, msgid)' $TMPLOG | $SED -e 's/^.* ([0-9]*) //' -e 's/, message-id=<[^> ]*>:/:/' | $SORT | $UNIQ -c | $SORT -nr >> $TMP 
475
476         elif [ "${LOG}" = "smtp-failure" ] ; then
477
478             $SED 's/^.* ([0-9]*) //' $TMPLOG | $SED 's/delivery to [^@ ]*@[^@ ]* failed with code/delivery failed with code/g' | $SORT | $UNIQ -c | $SORT -nr >> $TMP 
479
480         else
481
482             $SED 's/^.* ([0-9]*) //' $TMPLOG | $SORT | $UNIQ -c | $SORT -nr >> $TMP
483
484         fi
485     else
486
487         echo " ### Log file ${LOG} does not exist ### " >> $TMP
488
489     fi
490     echo "" >> $TMP
491
492 done
493
494 echo "******************************" >> $TMP
495 echo "Queue Directory Contents" >> $TMP
496 echo "******************************" >> $TMP
497 echo "" >> $TMP
498
499 cd $QUEUEDIR
500 for DIR in $SUBDIRS
501 do
502
503     $RM -f $TMPLOG
504     $TOUCH $TMPLOG
505     $LS -la $DIR >> $TMPLOG
506     LINES=`$WC -l < $TMPLOG`
507     LINES=`expr $LINES - 3`
508
509     echo "Subdirectory: $DIR" >> $TMP
510     echo "==============================" >> $TMP
511     echo "Entries: $LINES" >> $TMP
512     echo "------------------------------" >> $TMP
513
514     if [ $LINES -le $MAX_QUEUE_LINES ] ; then
515         $CAT $TMPLOG >> $TMP
516     else
517         $HEAD $TMPLOG >> $TMP
518         echo "" >> $TMP
519         echo "  More than $MAX_QUEUE_LINES total entries, skipping ..." >> $TMP
520         echo "" >> $TMP
521         $TAIL $TMPLOG >> $TMP
522     fi
523     echo "" >> $TMP
524
525 done
526
527 echo "******************************" >> $TMP
528 echo "Data Directory Contents" >> $TMP
529 echo "  (Python pickle files only)" >> $TMP
530 echo "******************************" >> $TMP
531
532 cd $DATADIR
533
534 $RM -f $TMPLOG
535 $TOUCH $TMPLOG
536 $LS -la | $GREP -i '\.pck$' >> $TMPLOG
537 LINES=`$WC -l < $TMPLOG`
538
539 echo "Python pickle files: $LINES" >> $TMP
540 echo "==============================" >> $TMP
541 echo "" >> $TMP
542
543 if [ $LINES -le $MAX_DATA_LINES ] ; then
544     $CAT $TMPLOG >> $TMP
545 else
546     $HEAD $TMPLOG >> $TMP
547     echo "" >> $TMP
548     echo "      More than $MAX_DATA_LINES total entries, skipping ..." >> $TMP
549     echo "" >> $TMP
550     $TAIL $TMPLOG >> $TMP
551 fi
552 echo "" >> $TMP
553
554 echo "******************************" >> $TMP
555 echo "Moderation Queue Summary" >> $TMP
556 echo "******************************" >> $TMP
557 echo "" >> $TMP
558
559 $AWK '{ print $NF }' $TMPLOG | $GREP -i '^heldmsg-' | $SED -e 's/^heldmsg-//' -e 's/-[0-9]*\.pck$//' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
560 echo "" >> $TMP
561
562 ###############################################################################
563 # Okay, we're done with all the code stuff, now handle the output
564 ###############################################################################
565
566 if [ "${RCPTS}x" != "x" ] ; then
567     $SENDMAIL -t -f$SENDER < $TMP
568 else
569     $CAT $TMP
570 fi
571
572 $RM $TMP $TMPLOG