From a80595acf011b48e5b62410342e67a27deb18e71 Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Sun, 3 May 2015 16:56:22 -0400 Subject: Remove the obsolete and mostly unimplemented onebounce script. Move the options base class to utilities (even though only the master uses it). Remove other obsolete and unused code. --- src/mailman/bin/master.py | 6 +- src/mailman/bin/onebounce.py | 71 ----------------- src/mailman/options.py | 168 --------------------------------------- src/mailman/utilities/options.py | 142 +++++++++++++++++++++++++++++++++ 4 files changed, 145 insertions(+), 242 deletions(-) delete mode 100644 src/mailman/bin/onebounce.py delete mode 100644 src/mailman/options.py create mode 100644 src/mailman/utilities/options.py (limited to 'src') diff --git a/src/mailman/bin/master.py b/src/mailman/bin/master.py index ebf08ba11..ca7d50883 100644 --- a/src/mailman/bin/master.py +++ b/src/mailman/bin/master.py @@ -37,7 +37,7 @@ from lazr.config import as_boolean from mailman.config import config from mailman.core.i18n import _ from mailman.core.logging import reopen -from mailman.options import Options +from mailman.utilities.options import Options DOT = '.' @@ -53,7 +53,7 @@ PRESERVE_ENVS = ( -class ScriptOptions(Options): +class MasterOptions(Options): """Options for the master watcher.""" usage = _("""\ @@ -526,7 +526,7 @@ Runner {0} reached maximum restart limit of {1:d}, not restarting.""", def main(): """Main process.""" - options = ScriptOptions() + options = MasterOptions() options.initialize() # Acquire the master lock, exiting if we can't. We'll let the caller # handle any clean up or lock breaking. No `with` statement here because diff --git a/src/mailman/bin/onebounce.py b/src/mailman/bin/onebounce.py deleted file mode 100644 index 9130b5c44..000000000 --- a/src/mailman/bin/onebounce.py +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright (C) 2002-2015 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 . - -"""Test bounce detection on message files.""" - - -__all__ = [ - 'main', - ] - - -import sys - -from mailman.core.i18n import _ -from mailman.options import Options - - - -class ScriptOptions(Options): - """Options for onebounce.""" - - usage = _("""\ -%prog [options] - -Test the bounce detection for message files.""") - - def add_options(self): - """See `Options`.""" - self.parser.add_option( - '-a', '--all', - default=False, action='store_true', - help=_("""\ -Run the message through all the registered bounce modules. Normally this -script stops at the first match.""")) - self.parser.add_option( - '-m', '--module', - type='string', help=_(""" -Run the message through just the named bounce module.""")) - self.parser.add_option( - '-l', '--list', - default=False, action='store_true', - help=_('List all available bounce modules and exit.')) - self.parser.add_option( - '-v', '--verbose', - default=False, action='store_true', - help=_('Increase verbosity.')) - - - -def main(): - """bin/onebounce""" - options = ScriptOptions() - options.initialize() - - if options.options.list: - print('list of available bounce modules.') - sys.exit(0) diff --git a/src/mailman/options.py b/src/mailman/options.py deleted file mode 100644 index 44cabd19f..000000000 --- a/src/mailman/options.py +++ /dev/null @@ -1,168 +0,0 @@ -# Copyright (C) 2008-2015 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 . - -"""Common argument parsing.""" - -__all__ = [ - 'Options', - 'SingleMailingListOptions', - 'MultipleMailingListOptions', - ] - - -import os -import sys - -from copy import copy -from mailman.config import config -from mailman.core.i18n import _ -from mailman.core.initialize import initialize -from mailman.version import MAILMAN_VERSION -from optparse import Option, OptionParser, OptionValueError - - - -def check_unicode(option, opt, value): - """Check that the value is a unicode string.""" - if not isinstance(value, bytes): - return value - try: - return value.decode(sys.getdefaultencoding()) - except UnicodeDecodeError: - raise OptionValueError( - 'option {0}: Cannot decode: {1}'.format(opt, value)) - - -def check_yesno(option, opt, value): - """Check that the value is 'yes' or 'no'.""" - value = value.lower() - if value not in ('yes', 'no', 'y', 'n'): - raise OptionValueError('option {0}: invalid: {1}'.format(opt, value)) - return value[0] == 'y' - - -class MailmanOption(Option): - """Extension types for unicode options.""" - TYPES = Option.TYPES + ('unicode', 'yesno') - TYPE_CHECKER = copy(Option.TYPE_CHECKER) - TYPE_CHECKER['unicode'] = check_unicode - TYPE_CHECKER['yesno'] = check_yesno - - -class SafeOptionParser(OptionParser): - """A unicode-compatible `OptionParser`. - - Python's standard option parser does not accept unicode options. Rather - than try to fix that, this class wraps the add_option() method and saves - having to wrap the options in str() calls. - """ - def add_option(self, *args, **kwargs): - """See `OptionParser`.""" - # Check to see if the first or first two options are unicodes and turn - # them into 8-bit strings before calling the superclass's method. - if len(args) == 0: - return OptionParser.add_option(self, *args, **kwargs) - old_args = list(args) - new_args = [] - arg0 = old_args.pop(0) - new_args.append(str(arg0)) - if len(old_args) > 0: - arg1 = old_args.pop(0) - new_args.append(str(arg1)) - new_args.extend(old_args) - return OptionParser.add_option(self, *new_args, **kwargs) - - - -class Options: - """Common argument parser.""" - - # Subclasses should override. - usage = None - - def __init__(self): - self.parser = SafeOptionParser( - version=MAILMAN_VERSION, - option_class=MailmanOption, - usage=self.usage) - self.add_common_options() - self.add_options() - options, arguments = self.parser.parse_args() - self.options = options - self.arguments = arguments - # Also, for convenience, place the options in the configuration file - # because occasional global uses are necessary. - config.options = self - - def add_options(self): - """Allow the subclass to add its own specific arguments.""" - pass - - def sanity_check(self): - """Allow subclasses to do sanity checking of arguments.""" - pass - - def add_common_options(self): - """Add options common to all scripts.""" - # Python requires str types here. - self.parser.add_option( - '-C', '--config', - help=_('Alternative configuration file to use')) - - def initialize(self, propagate_logs=None): - """Initialize the configuration system. - - After initialization of the configuration system, perform sanity - checks. We do it in this order because some sanity checks require the - configuration to be initialized. - - :param propagate_logs: Optional flag specifying whether log messages - in sub-loggers should be propagated to the master logger (and - hence to the root logger). If not given, propagation is taken - from the configuration files. - :type propagate_logs: bool or None. - """ - # Fall back to using the environment variable if -C is not given. - config_file = (os.getenv('MAILMAN_CONFIG_FILE') - if self.options.config is None - else self.options.config) - initialize(config_file, propagate_logs=propagate_logs) - self.sanity_check() - - - -class SingleMailingListOptions(Options): - """A helper for specifying the mailing list on the command line.""" - - def add_options(self): - """See `Options`.""" - self.parser.add_option( - '-l', '--listname', - type='unicode', help=_('The mailing list name')) - super(SingleMailingListOptions, self).add_options() - - -class MultipleMailingListOptions(Options): - """A helper for specifying multiple mailing lists on the command line.""" - - def add_options(self): - """See `Options`.""" - self.parser.add_option( - '-l', '--listname', - default=[], action='append', dest='listnames', type='unicode', - help=_("""\ -A mailing list name. It is okay to have multiple --listname options.""")) diff --git a/src/mailman/utilities/options.py b/src/mailman/utilities/options.py new file mode 100644 index 000000000..a9cff3b70 --- /dev/null +++ b/src/mailman/utilities/options.py @@ -0,0 +1,142 @@ +# Copyright (C) 2008-2015 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 . + +"""Common argument parsing.""" + +__all__ = [ + 'Options', + ] + + +import os +import sys + +from copy import copy +from mailman.config import config +from mailman.core.i18n import _ +from mailman.core.initialize import initialize +from mailman.version import MAILMAN_VERSION +from optparse import Option, OptionParser, OptionValueError + + + +def check_unicode(option, opt, value): + """Check that the value is a unicode string.""" + if not isinstance(value, bytes): + return value + try: + return value.decode(sys.getdefaultencoding()) + except UnicodeDecodeError: + raise OptionValueError( + 'option {0}: Cannot decode: {1}'.format(opt, value)) + + +def check_yesno(option, opt, value): + """Check that the value is 'yes' or 'no'.""" + value = value.lower() + if value not in ('yes', 'no', 'y', 'n'): + raise OptionValueError('option {0}: invalid: {1}'.format(opt, value)) + return value[0] == 'y' + + +class MailmanOption(Option): + """Extension types for unicode options.""" + TYPES = Option.TYPES + ('unicode', 'yesno') + TYPE_CHECKER = copy(Option.TYPE_CHECKER) + TYPE_CHECKER['unicode'] = check_unicode + TYPE_CHECKER['yesno'] = check_yesno + + +class SafeOptionParser(OptionParser): + """A unicode-compatible `OptionParser`. + + Python's standard option parser does not accept unicode options. Rather + than try to fix that, this class wraps the add_option() method and saves + having to wrap the options in str() calls. + """ + def add_option(self, *args, **kwargs): + """See `OptionParser`.""" + # Check to see if the first or first two options are unicodes and turn + # them into 8-bit strings before calling the superclass's method. + if len(args) == 0: + return OptionParser.add_option(self, *args, **kwargs) + old_args = list(args) + new_args = [] + arg0 = old_args.pop(0) + new_args.append(str(arg0)) + if len(old_args) > 0: + arg1 = old_args.pop(0) + new_args.append(str(arg1)) + new_args.extend(old_args) + return OptionParser.add_option(self, *new_args, **kwargs) + + + +class Options: + """Common argument parser.""" + + # Subclasses should override. + usage = None + + def __init__(self): + self.parser = SafeOptionParser( + version=MAILMAN_VERSION, + option_class=MailmanOption, + usage=self.usage) + self.add_common_options() + self.add_options() + options, arguments = self.parser.parse_args() + self.options = options + self.arguments = arguments + # Also, for convenience, place the options in the configuration file + # because occasional global uses are necessary. + config.options = self + + def add_options(self): + """Allow the subclass to add its own specific arguments.""" + pass + + def sanity_check(self): + """Allow subclasses to do sanity checking of arguments.""" + pass + + def add_common_options(self): + """Add options common to all scripts.""" + # Python requires str types here. + self.parser.add_option( + '-C', '--config', + help=_('Alternative configuration file to use')) + + def initialize(self, propagate_logs=None): + """Initialize the configuration system. + + After initialization of the configuration system, perform sanity + checks. We do it in this order because some sanity checks require the + configuration to be initialized. + + :param propagate_logs: Optional flag specifying whether log messages + in sub-loggers should be propagated to the master logger (and + hence to the root logger). If not given, propagation is taken + from the configuration files. + :type propagate_logs: bool or None. + """ + # Fall back to using the environment variable if -C is not given. + config_file = (os.getenv('MAILMAN_CONFIG_FILE') + if self.options.config is None + else self.options.config) + initialize(config_file, propagate_logs=propagate_logs) + self.sanity_check() -- cgit v1.3.1