[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Solved: Bug#242740: Help needed on obscure mailman bug



Hi,

thanks to those who responded.

On Tue, Apr 20, 2004 at 07:13:35PM +0200, Josselin Mouette wrote:

> Well, this file might be imported by mailman and not by the python
> interpreter as it is launched.

You're correct with this assumption ...

> I'd recommend a 'locate string.py' to be sure.

... but 'locate string.py' doesn't help when
/var/lib/mailman/pythonlib is a symlink to /usr/lib/python2.1 :-\

I found that problem with the help of a predator of the attached
script which I wrote for debugging the python postinst for the next
mailman release.

Thanks
 . Siggy
#! /usr/bin/python -O
#
# Adopted from mailman maintainer scripts
#
# Copyright (c) 2004, Bernd S. Brentrup <bsb@debian.org>
#
# Licensed under GPL version 2
#
# Work in progress, STANDARD NO WARRANTY DISCLAIMER
#
# $URL: svn+alioth://svn.alioth.debian.org/svn/pkg-mailman/branches/pkg-split/core/debian/snippets/maint_helpers.py $
# $Id: maint_helpers.py 80 2004-04-22 21:04:10Z bsb $

"""
"""#

__version__ = '0.1'

__all__ = [
    'SimpleLogger',
    'DebuggingLogger',
    'CommandRunner',
    ]


# We'll use this copy later in CommandRunner
virgin_gbls = globals().copy()
for k in ('__doc__', '__version__', '__all__'):
    del virgin_gbls[k]

import sys, os

class SimpleLogger:
    """
    """#
    levels = [ 'no', 'yes', 'all' ]

    def __init__(self, prefix):
        self._file = sys.stderr
        try:
            level = os.environ['%(prefix)s_LOG' % locals()]
            self._level = int(level)
        except KeyError:
            self._level = 1
        except ValueError:
            self._level = self.levels.index(level.lower())

    def set_level(self, lvl):
        self._level = lvl

    def set_file(self, fl):
        self._file = fl

    def __call__(self, msg, **kw):
        nl = kw.get('nl', '\n')
        lvl = kw.get('lvl', 1)
        if lvl <= self._level:
            self._file.write('%(msg)s%(nl)s' % locals())
            self._file.flush()

class DebuggingLogger(SimpleLogger):
    """
    """#

    def __init__(self, prefix):
        SimpleLogger.__init__(self, prefix)
        self._info = [ 'modules', 'path', 'argv', 'version', 'environ' ]
        try:
            info = os.environ['%(prefix)s_DEBUG' % locals()]
            if info not in ('all', 'chatty'):
                self._info = info.split(',')
            elif info == 'chatty':
                self.set_level(999)
        except:
            self._info = []

    def sys_info(self):
        if 'modules' in self._info:
            for n, m in sys.modules.items():
                if m is not None:
                    self('%20s: %r' % (n, m), lvl=0)
            self('', lvl=0)
        if 'version' in self._info:
            self('sys.version=%r' % sys.version, lvl=0)
            self('', lvl=0)
        if 'path' in self._info:
            self('sys.path=%r' % sys.path, lvl=0)
            self('', lvl=0)
        if 'argv' in self._info:
            self('sys.argv=%r' % sys.argv, lvl=0)
            self('', lvl=0)
        if 'environ' in self._info:
            self('os.environ:', lvl=0)
            for n, v in os.environ.items():
                self('%20s=%r' % (n, v), lvl=0)
            self('', lvl=0)

class CommandRunner:
    """
    """#

    def __init__(self, sys_path):
        self._prepend = sys_path
        self._sys_path = 


    def run(self, cmd, *args):
    """
    """#
        gbls = virgin_gbls.copy()
        sys_argv    = sys.argv[:]
        sys_path    = sys.path[:]
        sys.argv    = [cmd] + list(args)
        sys.path.insert(0, self._prepend)
        execfile(cmd, gbls)
        sys.path    = sys_path
        sys.argv    = sys_argv

# If run as a script, provide debug info for MM commands
# implemented in Python.

if __name__ == '__main__':
    MM_ROOT = '/var/lib/mailman'
    sys.stderr = sys.stdout
    log = DebuggingLogger('MM_MAINT')
    try:
        CommandRunner(os.path.join(MM_ROOT, 'bin')
                      ).run(*sys.argv[1:])
    finally:
        # If things break, show useful information
        # depending on $MM_MAINT_DEBUG settings
        log.sys_info()

Reply to: