#! @PYTHON@
#
# Copyright (C) 2000-2018 by the Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

"""Check the error logs and send any which have information in them.

If any log entries exist, a message is sent to the mailman owner address
and the logs are rotated.
"""

# GETTING STARTED
#
#  Run this program as root from cron, preferably at least daily.  Running
#  as root is optional, but will preserve the various modes and ownerships
#  of log files in "~mailman/logs".  If any entries are in "errors" or
#  "smtp-errors", they will be mailed to the mailman owner address.
#
#  Set COMPRESS_LOGFILES_WITH in mm_cfg.py to "gzip" to get rotated logfiles
#  to be compressed.
#
#  Hacked from some existing Mailman code by
#  Sean Reifschneider <jafo-mailman@tummy.com>
#  Please direct questions on this to the above address.
#

showLines = 100         #  lines of log messages to display before truncating

import sys, os, string, time, errno
import paths
from Mailman import mm_cfg, Utils
import fileinput, socket, time, stat

# Work around known problems with some RedHat cron daemons
import signal
signal.signal(signal.SIGCHLD, signal.SIG_DFL)


newLogfiles = []
text = []
text.append('Mailman Log Report')
text.append('Generated: %s' % time.ctime(time.time()))
text.append('Host: %s' % socket.gethostname())
text.append('')

logDate = time.strftime('%Y%m%d-%H%M%S', time.localtime(time.time()))
textSend = 0
for log in ( 'error', 'smtp-failures' ):
        fileName = os.path.join(mm_cfg.LOG_DIR, log)

        #  rotate file if it contains any data
        stats = os.stat(fileName)
        if stats[stat.ST_SIZE] < 1: continue
        fileNameNew = '%s.%s' % ( fileName, logDate )
        newLogfiles.append(fileNameNew)
        os.rename(fileName, fileNameNew)
        open(fileName, 'w')
        os.chmod(fileName, stat.S_IMODE(stats[stat.ST_MODE]))
        try: os.chown(fileName, stats[stat.ST_UID], stats[stat.ST_GID])
        except OSError: pass    #  permission denied, DOH!

        textSend = 1
        tmp = '#  FILE: %s  #' % fileNameNew
        text.append('#' * len(tmp))
        text.append(tmp)
        text.append('#' * len(tmp))
        text.append('')

        linesLeft = showLines   #  e-mail first linesLeft of log files
        for line in fileinput.input(fileNameNew):
                if linesLeft == 0:
                        text.append('[... truncated ...]')
                        break
                linesLeft = linesLeft - 1
                line = string.rstrip(line)
                text.append(line)
        text.append('')

#  send message if we've actually found anything
if textSend:
        text = string.join(text, '\n') + '\n'
        siteowner = Utils.get_site_email()
        Utils.SendTextToUser(
                'Mailman Log Report -- %s' % time.ctime(time.time()),
                text, siteowner, siteowner)

#  compress any log-files we made
if hasattr(mm_cfg, 'COMPRESS_LOGFILES_WITH') and mm_cfg.COMPRESS_LOGFILES_WITH:
        for file in newLogfiles:
                os.system(mm_cfg.COMPRESS_LOGFILES_WITH % file)
