Remove debian/patches
[mspang/vmailman.git] / contrib / rotatelogs.py
1 #! @PYTHON@
2 #
3 # Copyright (C) 2000,2001,2002 by the Free Software Foundation, Inc.
4 #
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; either version 2
8 # of the License, or (at your option) any later version.
9
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software 
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18
19 """Check the error logs and send any which have information in them.
20
21 If any log entries exist, a message is sent to the mailman owner address
22 and the logs are rotated.
23 """
24
25 # GETTING STARTED
26 #
27 #  Run this program as root from cron, preferably at least daily.  Running
28 #  as root is optional, but will preserve the various modes and ownerships
29 #  of log files in "~mailman/logs".  If any entries are in "errors" or
30 #  "smtp-errors", they will be mailed to the mailman owner address.
31 #
32 #  Set COMPRESS_LOGFILES_WITH in mm_cfg.py to "gzip" to get rotated logfiles
33 #  to be compressed.
34 #
35 #  Hacked from some existing Mailman code by
36 #  Sean Reifschneider <jafo-mailman@tummy.com>
37 #  Please direct questions on this to the above address.
38 #
39
40 showLines = 100         #  lines of log messages to display before truncating
41
42 import sys, os, string, time, errno
43 import paths
44 from Mailman import mm_cfg, Utils
45 import fileinput, socket, time, stat
46
47 # Work around known problems with some RedHat cron daemons
48 import signal
49 signal.signal(signal.SIGCHLD, signal.SIG_DFL)
50
51
52 newLogfiles = []
53 text = []
54 text.append('Mailman Log Report')
55 text.append('Generated: %s' % time.ctime(time.time()))
56 text.append('Host: %s' % socket.gethostname())
57 text.append('')
58
59 logDate = time.strftime('%Y%m%d-%H%M%S', time.localtime(time.time()))
60 textSend = 0
61 for log in ( 'error', 'smtp-failures' ):
62         fileName = os.path.join(mm_cfg.LOG_DIR, log)
63
64         #  rotate file if it contains any data
65         stats = os.stat(fileName)
66         if stats[stat.ST_SIZE] < 1: continue
67         fileNameNew = '%s.%s' % ( fileName, logDate )
68         newLogfiles.append(fileNameNew)
69         os.rename(fileName, fileNameNew)
70         open(fileName, 'w')
71         os.chmod(fileName, stat.S_IMODE(stats[stat.ST_MODE]))
72         try: os.chown(fileName, stats[stat.ST_UID], stats[stat.ST_GID])
73         except OSError: pass    #  permission denied, DOH!
74
75         textSend = 1
76         tmp = '#  FILE: %s  #' % fileNameNew
77         text.append('#' * len(tmp))
78         text.append(tmp)
79         text.append('#' * len(tmp))
80         text.append('')
81
82         linesLeft = showLines   #  e-mail first linesLeft of log files
83         for line in fileinput.input(fileNameNew):
84                 if linesLeft == 0:
85                         text.append('[... truncated ...]')
86                         break
87                 linesLeft = linesLeft - 1
88                 line = string.rstrip(line)
89                 text.append(line)
90         text.append('')
91
92 #  send message if we've actually found anything
93 if textSend:
94         text = string.join(text, '\n') + '\n'
95         siteowner = Utils.get_site_email()
96         Utils.SendTextToUser(
97                 'Mailman Log Report -- %s' % time.ctime(time.time()),
98                 text, siteowner, siteowner)
99
100 #  compress any log-files we made
101 if hasattr(mm_cfg, 'COMPRESS_LOGFILES_WITH') and mm_cfg.COMPRESS_LOGFILES_WITH:
102         for file in newLogfiles:
103                 os.system(mm_cfg.COMPRESS_LOGFILES_WITH % file)