#! /usr/bin/env python # # Copyright (C) 1998,1999,2000 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """Check the databases for mailing lists. Both the config.db and config.db.last files are checked for corruption. Usage: %(PROGRAM)s [options] [listname [listname ...]] Options: --all -a Check all databases. Otherwise only the lists named on the command line are checked. --verbose -v Verbose output. --help -h Print this text and exit. """ import sys import os import getopt import marshal import paths from Mailman import mm_cfg from Mailman import Utils from Mailman.i18n import _ PROGRAM = sys.argv[0] def usage(code, msg=''): print >> sys.stderr, _(__doc__) if msg: print >> sys.stderr, msg sys.exit(code) def testfile(filename): try: fp = open(filename) except IOError, (code, msg): print _('%(filename)s cannot be opened for reading:\n\t'), msg return 1 else: try: try: d = marshal.load(fp) except (EOFError, ValueError, TypeError), msg: print _('%(filename)s contains a corrupt marshal:\n\t'), msg return 1 else: return 0 finally: fp.close() def main(): try: opts, args = getopt.getopt(sys.argv[1:], 'ahv', ['all', 'verbose', 'help']) except getopt.error, msg: usage(1, msg) verbose = 0 listnames = args for opt, arg in opts: if opt in ('-h', '--help'): usage(0) elif opt in ('-v', '--verbose'): verbose = 1 elif opt in ('-a', '--all'): listnames = Utils.list_names() listnames = [n.lower().strip() for n in listnames] if not listnames: print _('Nothing to do.') sys.exit(0) for listname in listnames: if not Utils.list_exists(listname): print _('No list named:'), listname continue configdb = os.path.join(mm_cfg.LIST_DATA_DIR, listname, 'config.db') lastdb = configdb + '.last' origbad = testfile(configdb) lastbad = testfile(lastdb) if origbad and not lastbad: print _("""\ ***** ALERT ***** The original database file for the list `%(listname)s' is corrupt, but the backup seems fine. Consider copying %(lastdb)s to %(configdb)s however, you may lose some data.""") elif origbad and backupbad: print _(""" ***** ALERT ***** Both the original database file and the backup for list `%(listname)s' seem corrupted. You will probably need to recover both %(configdb)s and %(lastdb)s from a system backup, or remove the list `%(listname)s' and re-create it from scratch.""") elif verbose: print _("The list `%(listname)s' databases seem fine.") if __name__ == '__main__': main()