Commit 39153393 authored by Barry Warsaw's avatar Barry Warsaw

Replace the old bin/dumpdb with 'bin/mailman qfile'.

parent dc68c4f9
# Copyright (C) 1998-2009 by the Free Software Foundation, Inc.
# Copyright (C) 2009 by the Free Software Foundation, Inc.
#
# This file is part of GNU Mailman.
#
......@@ -15,74 +15,82 @@
# 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
"""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.options import Options
from mailman.interfaces.command import ICLISubCommand
COMMASPACE = ', '
m = []
class ScriptOptions(Options):
usage=_("""\
%prog [options] filename
class QFile:
"""Get information out of a queue file."""
Dump the contents of any Mailman queue file. The queue file is a data file
with multiple Python pickles in it.""")
implements(ICLISubCommand)
def add_options(self):
super(ScriptOptions, self).add_options()
self.parser.add_option(
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'."""))
self.parser.add_option(
'-i', '--interact',
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."""))
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()
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.'))
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()
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)
===================
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: [email protected]
... To: [email protected]
... 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: [email protected]
To: [email protected]
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)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment