diff options
| author | Barry Warsaw | 2009-12-04 22:26:40 -0500 |
|---|---|---|
| committer | Barry Warsaw | 2009-12-04 22:26:40 -0500 |
| commit | 3915339314239e281a204c7adea3e3977bb6c679 (patch) | |
| tree | de0750cc672b879350c6910be17f67ebc4478663 /src | |
| parent | dc68c4f96e02e16ae5613bf1e7336ac582f560c5 (diff) | |
| download | mailman-3915339314239e281a204c7adea3e3977bb6c679.tar.gz mailman-3915339314239e281a204c7adea3e3977bb6c679.tar.zst mailman-3915339314239e281a204c7adea3e3977bb6c679.zip | |
Diffstat (limited to 'src')
| -rw-r--r-- | src/mailman/bin/dumpdb.py | 88 | ||||
| -rw-r--r-- | src/mailman/commands/cli_qfile.py | 96 | ||||
| -rw-r--r-- | src/mailman/commands/docs/qfile.txt | 67 |
3 files changed, 163 insertions, 88 deletions
diff --git a/src/mailman/bin/dumpdb.py b/src/mailman/bin/dumpdb.py deleted file mode 100644 index 6c3ac5414..000000000 --- a/src/mailman/bin/dumpdb.py +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright (C) 1998-2009 by the Free Software Foundation, Inc. -# -# This file is part of GNU Mailman. -# -# GNU Mailman 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 3 of the License, or (at your option) -# any later version. -# -# GNU Mailman 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 -# GNU Mailman. If not, see <http://www.gnu.org/licenses/>. - -import pprint -import cPickle - -from mailman.config import config -from mailman.core.i18n import _ -from mailman.interact import interact -from mailman.options import Options - - -COMMASPACE = ', ' -m = [] - - - -class ScriptOptions(Options): - usage=_("""\ -%prog [options] filename - -Dump the contents of any Mailman queue file. The queue file is a data file -with multiple Python pickles in it.""") - - def add_options(self): - super(ScriptOptions, self).add_options() - self.parser.add_option( - '-n', '--noprint', - dest='doprint', default=True, action='store_false', - help=_("""\ -Don't attempt to pretty print the object. This is useful if there is some -problem with the object and you just want to get an unpickled representation. -Useful with 'bin/dumpdb -i <file>'. In that case, the list of -unpickled objects will be left in a variable called 'm'.""")) - self.parser.add_option( - '-i', '--interact', - default=False, action='store_true', - help=_("""\ -Start an interactive Python session, with a variable called 'm' containing the -list of unpickled objects.""")) - - def sanity_check(self): - if len(self.arguments) < 1: - self.parser.error(_('No filename given.')) - elif len(self.arguments) > 1: - self.parser.error(_('Unexpected arguments')) - else: - self.filename = self.arguments[0] - - - -def main(): - options = ScriptOptions() - options.initialize() - - pp = pprint.PrettyPrinter(indent=4) - with open(options.filename) as fp: - while True: - try: - m.append(cPickle.load(fp)) - except EOFError: - break - if options.options.doprint: - print _('[----- start pickle -----]') - for i, obj in enumerate(m): - count = i + 1 - print _('<----- start object $count ----->') - if isinstance(obj, basestring): - print obj - else: - pp.pprint(obj) - print _('[----- end pickle -----]') - if options.options.interact: - interact() diff --git a/src/mailman/commands/cli_qfile.py b/src/mailman/commands/cli_qfile.py new file mode 100644 index 000000000..05005848c --- /dev/null +++ b/src/mailman/commands/cli_qfile.py @@ -0,0 +1,96 @@ +# Copyright (C) 2009 by the Free Software Foundation, Inc. +# +# This file is part of GNU Mailman. +# +# GNU Mailman 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 3 of the License, or (at your option) +# any later version. +# +# GNU Mailman 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 +# GNU Mailman. If not, see <http://www.gnu.org/licenses/>. + +"""Getting information out of a qfile.""" + +from __future__ import absolute_import, unicode_literals + +__metaclass__ = type +__all__ = [ + 'QFile', + ] + + +import cPickle + +from pprint import PrettyPrinter +from zope.component import getUtility +from zope.interface import implements + +from mailman.config import config +from mailman.core.i18n import _ +from mailman.interact import interact +from mailman.interfaces.command import ICLISubCommand + + +m = [] + + + +class QFile: + """Get information out of a queue file.""" + + implements(ICLISubCommand) + + name = 'qfile' + + def add(self, parser, command_parser): + """See `ICLISubCommand`.""" + self.parser = parser + command_parser.add_argument( + '-n', '--noprint', + dest='doprint', default=True, action='store_false', + help=_("""\ + Don't attempt to pretty print the object. This is useful if there + is some problem with the object and you just want to get an + unpickled representation. Useful with 'bin/dumpdb -i <file>'. In + that case, the list of unpickled objects will be left in a + variable called 'm'.""")) + command_parser.add_argument( + '-i', '--interactive', + default=False, action='store_true', + help=_("""\ + Start an interactive Python session, with a variable called 'm' + containing the list of unpickled objects.""")) + command_parser.add_argument( + 'qfile', metavar='FILENAME', nargs=1, + help=_('The queue file to dump.')) + + def process(self, args): + """See `ICLISubCommand`.""" + printer = PrettyPrinter(indent=4) + assert len(args.qfile) == 1, 'Wrong number of positional arguments' + with open(args.qfile[0]) as fp: + while True: + try: + m.append(cPickle.load(fp)) + except EOFError: + break + if args.doprint: + print _('[----- start pickle -----]') + for i, obj in enumerate(m): + count = i + 1 + print _('<----- start object $count ----->') + if isinstance(obj, basestring): + print obj + else: + printer.pprint(obj) + print _('[----- end pickle -----]') + count = len(m) + banner = _("The variable 'm' contains $count objects") + if args.interactive: + interact(banner=banner) diff --git a/src/mailman/commands/docs/qfile.txt b/src/mailman/commands/docs/qfile.txt new file mode 100644 index 000000000..c54f37c50 --- /dev/null +++ b/src/mailman/commands/docs/qfile.txt @@ -0,0 +1,67 @@ +=================== +Dumping queue files +=================== + +The 'qfile' command dumps the contents of a queue pickle file. This is +especially useful when you have shunt files you want to inspect. + +XXX Test the interactive operation of qfile + + +Pretty printing +=============== + +By default, the qfile command pretty prints the contents of a queue pickle +file to standard output. + + >>> from mailman.commands.cli_qfile import QFile + >>> command = QFile() + + >>> class FakeArgs: + ... interactive = False + ... doprint = True + ... qfile = [] + +Let's say Mailman shunted a message file. + + >>> msg = message_from_string("""\ + ... From: aperson@example.com + ... To: test@example.com + ... Subject: Uh oh + ... + ... I borkeded Mailman. + ... """) + + >>> shuntq = config.switchboards['shunt'] + >>> basename = shuntq.enqueue(msg, foo=7, bar='baz', bad='yes') + +Once we've figured out the file name of the shunted message, we can print it. + + >>> from os.path import join + >>> qfile = join(shuntq.queue_directory, basename + '.pck') + + >>> FakeArgs.qfile = [qfile] + >>> command.process(FakeArgs) + [----- start pickle -----] + <----- start object 1 -----> + From nobody ... + From: aperson@example.com + To: test@example.com + Subject: Uh oh + <BLANKLINE> + I borkeded Mailman. + <BLANKLINE> + <----- start object 2 -----> + { u'_parsemsg': False, + 'bad': u'yes', + 'bar': u'baz', + 'foo': 7, + u'received_time': ... + u'version': 3} + [----- end pickle -----] + +Maybe we don't want to print the contents of the file though, in case we want +to enter the interactive prompt. + + >>> FakeArgs.doprint = False + >>> command.process(FakeArgs) |
