#! @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 # 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)