#! @PYTHON@ # # Copyright (C) 1998-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. """Dispatch digests for lists w/pending messages and digest_send_periodic set. Usage: %(PROGRAM)s [options] Options: -h / --help Print this message and exit. -l listname --listname=listname Send the digest for the given list only, otherwise the digests for all lists are sent out. May be repeated to do multiple lists. -e listname --exceptlist listname Don't send the digest for the given list. May be repeated to skip multiple lists. """ import os import sys import getopt import paths from Mailman import mm_cfg from Mailman import Utils from Mailman import MailList from Mailman.i18n import _ # Work around known problems with some RedHat cron daemons import signal signal.signal(signal.SIGCHLD, signal.SIG_DFL) PROGRAM = sys.argv[0] def usage(code, msg=''): if code: fd = sys.stderr else: fd = sys.stdout print >> fd, _(__doc__) if msg: print >> fd, msg sys.exit(code) def main(): try: opts, args = getopt.getopt(sys.argv[1:], 'hl:e:', ['help', 'listname=', 'exceptlist=']) except getopt.error, msg: usage(1, msg) if args: usage(1) exceptlists = [] listnames = [] for opt, arg in opts: if opt in ('-h', '--help'): usage(0) elif opt in ('-l', '--listname'): listnames.append(arg) elif opt in ('-e', '--exceptlist'): exceptlists.append(arg) if not listnames: listnames = Utils.list_names() for listname in exceptlists: try: listnames.remove(listname) except ValueError: pass for listname in listnames: mlist = MailList.MailList(listname, lock=0) if mlist.digest_send_periodic: mlist.Lock() try: try: mlist.send_digest_now() mlist.Save() # We are unable to predict what exception may occur in digest # processing and we don't want to lose the other digests, so # we catch everything. except Exception, errmsg: print >> sys.stderr, \ 'List: %s: problem processing %s:\n%s' % \ (listname, os.path.join(mlist.fullpath(), 'digest.mbox'), errmsg) finally: mlist.Unlock() if __name__ == '__main__': main()