Menu

#351 Daily Status Report script...

Mailman 2.1
open
nobody
5
2005-02-15
2005-02-15
No

Folks,

I quickly whacked together a Daily Status Report script for
Mailman (using Bourne shell, not Python ;), and thought that other
folks might be interested in seeing it.

The basic concept is a program that gets fired off at 23:59 every
night, and goes through a variety of log files looking for entries
specific to that date, and indicating problems or certain types of
activity that might be of interest to someone trying to administer
the server. It also does an "ls -la" of /usr/local/mailman/qfiles/*,
so that you can see what is in the queue at the time of the running
of the script.

My concept was that this daily report would get e-mailed to the
admin, or posted to a "reports" mailing list, where they could be
archived and kept for future reference.

The script does not (yet) do any statistics calculations, although it
should be relatively easy to hack together some basic stats using
awk, sort, etc....

Anyway, I thought I'd share it and let folks take a look at it, and if
anyone has any recommended improvements, we can incorporate
those and share them back out with everyone.

The code is written under a BSD-style license, so if you don't want
to contribute any changes back to me, that's okay. Of course, I
would prefer that you did, but I leave the choice up to you.

Discussion

  • Tom G. Christensen

    Logged In: YES
    user_id=1159458

    The current UID grab command doesn't work on Solaris (2.6 &
    8 tested).

    I'd recommend this instead:
    ps -o user -p $$|tail -1

    This is tested and works on RH 6.2, RH 7.3, RHEL 2.1, RHEL3,
    FC3, FreeBSD 4.9, Solaris 2.6, 8.

     
  • adrianwi

    adrianwi - 2005-02-22

    Logged In: YES
    user_id=1175103

    Use of variable named UID does work well with OS X (version
    10.2.8). Apparently the variable UID is a constant already
    in use. When trying to the run the script without
    modification, I was receiving the following error message:

    UID: readonly variable

    This issue was resolved by changing the name of variable,
    UID, to something else, such as MMUID. Works fine with this
    change.

    As an aside (& for what it is worth), the UID grab command
    suggested by tgc99 on 2005-02-16 03:15 works on this system
    (OS X - version 10.2.8)

     
  • Brad Knowles

    Brad Knowles - 2005-02-22

    Logged In: YES
    user_id=18417

    The UID variable in the current code was already replaced by MYUID,
    because I got complaints on other platforms. But UID wasn't available to
    me as a useful constant, so I had to use something else to obtain the
    value.

    The recommended patch from tgc99 does work, and I will be uploading a
    new version of the code soon.

     
  • Brad Knowles

    Brad Knowles - 2005-09-06

    Logged In: YES
    user_id=18417

    Okay, I've deleted the old version of the mmdsr script that was attached,
    and uploaded the latest version. This is what we're currently using to
    monitor the lists on python.org, and we have found it very useful.

    Any comments you may have will be appreciated.

     
  • Mark Sapiro

    Mark Sapiro - 2005-09-11

    Logged In: YES
    user_id=1123998

    I tried the script and other than the expected site specific
    changes, I found two issues which are both addressed by the
    patch in the mmdsr.patch file.

    1) Mailman's log files are not necessarily in
    $var_prefix/logs/ - they can be in any directory. The patch
    adds a LOGDIR directory independant of MMDIR.

    2) The $TMPLOG file is not removed at completion. The patch
    removes it.

     
  • Mark Sapiro

    Mark Sapiro - 2005-09-11

    Logged In: YES
    user_id=1123998

    Oooops! I mistakenly thought I could add the mmdsr.patch as
    a downloadable file, but I can't so here it is. Watch out
    for wrapped lines ...

    --- mmdsr.orig 2005-09-06 20:37:53.000000000 -0700
    +++ mmdsr 2005-09-10 18:33:14.532393572 -0700
    @@ -132,6 +132,7 @@

    MMDIR="/usr/local/mailman"
    TMPDIR="/tmp"
    +LOGDIR="/var/log/mailman"

    ###############################################################################
    # Maximum number of subdirectory entries to display in report
    @@ -234,9 +235,9 @@
    $TOUCH $TMPLOG
    echo "Log file: $LOG" >> $TMP
    echo "==============================" >> $TMP
    - $GREP -si "^$DAY [0-9][0-9:]* $YEAR" logs/$LOG >> $TMPLOG
    + $GREP -si "^$DAY [0-9][0-9:]* $YEAR" $LOGDIR/$LOG >>
    $TMPLOG

    - if [ -f "logs/${LOG}" ] ; then
    + if [ -f "$LOGDIR/${LOG}" ] ; then

    if [ "${LOG}" = "post" ] ; then

    @@ -304,9 +305,9 @@
    $TOUCH $TMPLOG
    echo "Log file: $LOG" >> $TMP
    echo "==============================" >> $TMP
    - $GREP -si "^$DAY [0-9][0-9:]* $YEAR" logs/$LOG >> $TMPLOG
    + $GREP -si "^$DAY [0-9][0-9:]* $YEAR" $LOGDIR/$LOG >>
    $TMPLOG

    - if [ -f "logs/${LOG}" ] ; then
    + if [ -f "$LOGDIR/${LOG}" ] ; then

    if [ "${LOG}" = "error" ] ; then

    @@ -453,4 +454,4 @@
    $CAT $TMP
    fi

    -$RM $TMP
    +$RM -f $TMP $TMPLOG

     
  • Brad Knowles

    Brad Knowles - 2005-09-22

    Logged In: YES
    user_id=18417

    Okay, I took Mark's comments and incorporated them. Adrian Wells also
    pointed out a log file difference between Mailman 2.1.5 and 2.1.6 that
    caused the summary of the "smtp" log to be munged.

    I've now fixed these bugs, deleted the old file, and uploaded the new one
    (version 0.0.12).

    Thanks!

     
  • Tom G. Christensen

    Logged In: YES
    user_id=1159458

    ps output on solaris is full of whitespace but a further
    echo get's rid of it.
    The lines in the smtp log are sometimes broken up by a
    newline (right before the msgid) which throws of the
    summary. Piping it through sed first will rejoin the broken
    lines.
    Use $AWK instead of awk.

    Patch inserted below:
    --- mmdsr.orig 2005-10-19 09:42:30.000000000 +0200
    +++ mmdsr 2005-10-19 09:44:23.000000000 +0200
    @@ -203,7 +203,8 @@
    # there is an easier cross-platform way to do it,
    please let me know.
    ###############################################################################

    -MYUID=`$PS -o user -p $$ | $TAIL -1`
    +GRABUID=`$PS -o user -p $$ | $TAIL -1`
    +MYUID=`echo $GRABUID`
    RUNAS="mailman"

    ###############################################################################
    @@ -254,7 +255,7 @@
    $TOUCH $TMPLOG
    echo "Log file: $LOG" >> $TMP
    echo "==============================" >> $TMP
    - $GREP -si "^$DAY [0-9][0-9:]* $YEAR" $LOGDIR/$LOG >>
    $TMPLOG
    + $SED -e :a -e '$!N;s/\n //;ta' -e 'P;D' $LOGDIR/$LOG |
    $GREP -si "^$DAY [0-9][0-9:]* $YEAR" >> $TMPLOG

    if [ -f "$LOGDIR/${LOG}" ] ; then

    @@ -264,7 +265,7 @@
    echo "Hourly Summary of Posts" >> $TMP
    echo "-----------------------" >> $TMP

    - $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
    + $SED -e 's/^[A-Z][a-z][a-z] *[0-9]* //' -e
    's/:.*$//' $TMPLOG | $UNIQ -c | $SORT -n +1 | $AWK '{
    printf( "%8d %02d:00-%02
    d:59\n", $1, $2, $2 ) }' >> $TMP

    echo "" >> $TMP
    echo "Post Count by List" >> $TMP
    @@ -295,7 +296,7 @@
    echo "" >> $TMP
    echo "Hourly Summary of Messages Sent" >> $TMP
    echo "-------------------------------" >> $TMP
    - $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
    + $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

    else

     
  • Mark Sapiro

    Mark Sapiro - 2005-11-06

    Logged In: YES
    user_id=1123998

    The vette log summary lists posts held for moderation
    individually under "Other Errors:". The following patch
    (watch out for wrapped lines) summarizes them by list instead.

    --- mmdsr 2005-09-29 21:31:33.000000000 -0700
    +++ mmdsrx 2005-11-06 08:20:58.835895418 -0800
    @@ -415,10 +415,15 @@
    echo "------------------------------" >> $TMP
    $GREP -i 'Posting to a moderated newsgroup' $TMPLOG |
    $AWK '{ print $6 }' | $SORT | $UNIQ -c | $SORT -nr >> $TMP

    + echo "" >> $TMP
    + echo "Post to moderated list (by list):" >> $TMP
    + echo "------------------------------" >> $TMP
    + $GREP -i 'Post to moderated list' $TMPLOG |
    $AWK '{ print $6 }' | $SORT | $UNIQ -c | $SORT -nr >> $TMP
    +
    echo "" >> $TMP
    echo "Other Errors:" >> $TMP
    echo "------------------------------" >> $TMP
    - $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|Message
    discarded, msgid)' $TMPLOG | $SED 's/^.* ([0-9]*) //' |
    $SORT | $UNIQ -c | $SORT -nr >> $TMP
    + $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
    's/^.* ([0-9]*) //' | $SORT | $UNIQ -c | $SORT -nr >> $TMP

    else

     
  • Brad Knowles

    Brad Knowles - 2006-01-26

    mmdsr -- version 0.0.15

     
  • Brad Knowles

    Brad Knowles - 2006-01-26

    mmdsr readme

     
  • Brad Knowles

    Brad Knowles - 2006-01-26

    Logged In: YES
    user_id=18417

    Folks,

    Okay, I just uploaded version 0.0.15, which addresses the most recent
    comments here from Mark and Tom, and makes a few additional tweaks as
    well. See the version comments at the top of the script.

     
  • Dave Yost

    Dave Yost - 2007-01-13

    Logged In: YES
    user_id=330919
    Originator: NO

    I suggest incorporating the readme into the shell script, so there is only the one file.

     
  • Mark Sapiro

    Mark Sapiro - 2008-01-03

    mmdsr -- version 0.0.16

     
  • Mark Sapiro

    Mark Sapiro - 2008-01-03

    Logged In: YES
    user_id=1123998
    Originator: NO

    File Added: mmdsr

     
  • Mark Sapiro

    Mark Sapiro - 2008-01-03

    Logged In: YES
    user_id=1123998
    Originator: NO

    I have added two files.

    Version 0.0.16 corrects a couple of typo/minor issues. It is the version that has been in the contrib directory of the distribution since Mailman 2.1.8.

    Version 0.0.17 processes two generations of rotated logs (assuming they are named xxx and xxx.1 and xxx.1 exists) so that data is not lost on the day the logs rotate. It also changes a deprecated sort key option to one that should work with all sort commands. This version will be in the contrib directory of the Mailman 2.1.10 distribution.

    File Added: mmdsr

     
  • Mark Sapiro

    Mark Sapiro - 2008-01-04

    mmdsr -- version 0.0.17

     
  • Mark Sapiro

    Mark Sapiro - 2008-01-04

    Logged In: YES
    user_id=1123998
    Originator: NO

    Re-did the 0.0.17 change to use the prior sort key field separator by default but to make it a user settable parameter.
    File Added: mmdsr

     
  • Mark Sapiro

    Mark Sapiro - 2008-07-03

    Logged In: YES
    user_id=1123998
    Originator: NO

    The following changes have been made in version 0.18

    # 0.0.18 Update by Mark Sapiro <mark@msapiro.net>
    # Updated on: Tue May 13 08:58:26 PDT 2008
    # Changes for Mailman 2.1.10 --
    # Added 'bad' to the list of queues.
    # Made listing of a queue directory conditional on existence.
    # Sumarized unparseable messages and preserved queue entries
    # in the Other Errors section.

    File Added: mmdsr

     
  • Mark Sapiro

    Mark Sapiro - 2008-07-03

    mmdsr -- version 0.0.18

     
  • Mark Sapiro

    Mark Sapiro - 2008-12-09

    mmdsr -- version 0.0.19

     
  • Mark Sapiro

    Mark Sapiro - 2008-12-09

    Posted version 0.0.19 which corrects a minor error in the 'posts from usenet' report.

     
  • tlhackque

    tlhackque - 2009-03-17

    It would be nice if this only generated output when it found a problem. Less likely to be ignored. (Actually, what I often do in such scripts is mail only on error, except even if no error 1x/week -- so I know that the monitor is alive.)

    Failing that, for low activity sites, if it could run less frequently than daily (say, weekly) without getting confused.

     
  • Cri

    Cri - 2009-04-19

    Here you are a patch to insert the hostname in the report title and Subject
    (in case you manage more than one mailman instance and want to use the same
    SENDER for all of them)

    ---8<--------------------------------------------------------------------------

    --- mmdsr.orig 2009-04-19 19:23:52.000000000 +0200
    +++ mmdsr 2009-04-19 19:39:29.000000000 +0200
    @@ -257,6 +257,12 @@
    SENDER="INSERT.YOUR.SENDER.ADDRESS@HERE"
    RCPTS="INSERT.YOUR.RECIPIENTS.ADDRESSES@HERE"

    +###############################################################################
    +# Specify hostname that will appear in the title (and in the Subject: header)
    +###############################################################################
    +
    +HOSTNAME=`hostname`
    +
    ###############################################################################
    # If you run this program in cron at 23:59:00, you need to sleep sixty
    # seconds to make sure that you capture all the logs for the previous day.
    @@ -307,11 +313,11 @@
    if [ "${RCPTS}x" != "x" ] ; then
    echo "From: ${SENDER}" >> $TMP
    echo "To: ${RCPTS}" >> $TMP
    - echo "Subject: Mailman Daily Status Report: $DAY $YEAR" >> $TMP
    + echo "Subject: ${HOSTNAME}: Mailman Daily Status Report: $DAY $YEAR" >> $TMP
    echo "" >> $TMP
    fi

    -echo " Mailman Daily Status Report: $DAY $YEAR" >> $TMP
    +echo " ${HOSTNAME}: Mailman Daily Status Report: $DAY $YEAR" >> $TMP
    echo "" >> $TMP
    echo "" >> $TMP

     

Log in to post a comment.