diff options
| author | Barry Warsaw | 2011-06-10 19:52:25 -0400 |
|---|---|---|
| committer | Barry Warsaw | 2011-06-10 19:52:25 -0400 |
| commit | f8596ce463863dc6defb5dac84f5b226c45cb419 (patch) | |
| tree | 616e2f0d952d1654d3b0b60d661f5349d469acf4 /src/mailman/commands/cli_aliases.py | |
| parent | bf8b285acb8c2500e52ae2582f27513b9842de54 (diff) | |
| download | mailman-f8596ce463863dc6defb5dac84f5b226c45cb419.tar.gz mailman-f8596ce463863dc6defb5dac84f5b226c45cb419.tar.zst mailman-f8596ce463863dc6defb5dac84f5b226c45cb419.zip | |
Diffstat (limited to 'src/mailman/commands/cli_aliases.py')
| -rw-r--r-- | src/mailman/commands/cli_aliases.py | 76 |
1 files changed, 74 insertions, 2 deletions
diff --git a/src/mailman/commands/cli_aliases.py b/src/mailman/commands/cli_aliases.py index dcb494ebb..b13919121 100644 --- a/src/mailman/commands/cli_aliases.py +++ b/src/mailman/commands/cli_aliases.py @@ -27,11 +27,16 @@ __all__ = [ import sys +from operator import attrgetter +from zope.component import getUtility from zope.interface import implements from mailman.config import config from mailman.core.i18n import _ from mailman.interfaces.command import ICLISubCommand +from mailman.interfaces.listmanager import IListManager +from mailman.interfaces.mta import ( + IMailTransportAgentAliases, IMailTransportAgentLifecycle) from mailman.utilities.modules import call_name @@ -45,14 +50,29 @@ class Aliases: def add(self, parser, command_parser): """See `ICLISubCommand`.""" + self.parser = parser command_parser.add_argument( '-o', '--output', action='store', help=_("""\ File to send the output to. If not given, a file in $VAR/data is used. The argument can be '-' to use standard output..""")) + command_parser.add_argument( + '-f', '--format', + action='store', help=_("""\ + Alternative output format to use. This is the Python object path + to an implementation of the `IMailTransportAgentLifecycle` + interface.""")) + command_parser.add_argument( + '-s', '--simple', + action='store_true', default=False, help=_("""\ + Simply output the list of aliases. + """)) def process(self, args): """See `ICLISubCommand`.""" + if args.format is not None and args.simple: + self.parser.error(_('Cannot use both -s and -f')) + # Does not return. output = None if args.output == '-': output = sys.stdout @@ -60,5 +80,57 @@ class Aliases: output = None else: output = args.output - # Call the MTA-specific regeneration method. - call_name(config.mta.incoming).regenerate(output) + if args.simple: + Dummy().regenerate(output) + else: + format_arg = (config.mta.incoming + if args.format is None + else args.format) + # Call the MTA-specific regeneration method. + call_name(format_arg).regenerate(output) + + + +class Dummy: + """Dummy aliases implementation for simpler output format.""" + + implements(IMailTransportAgentLifecycle) + + def create(self, mlist): + """See `IMailTransportAgentLifecycle`.""" + raise NotImplementedError + + def delete(self, mlist): + """See `IMailTransportAgentLifecycle`.""" + raise NotImplementedError + + def regenerate(self, output=None): + """See `IMailTransportAgentLifecycle`.""" + fp = None + close = False + try: + if output is None: + # There's really no place to print the output. + return + elif isinstance(output, basestring): + fp = open(output, 'w') + close = True + else: + fp = output + self._do_write_file(fp) + finally: + if fp is not None and close: + fp.close() + + def _do_write_file(self, fp): + # First, sort mailing lists by domain. + by_domain = {} + for mlist in getUtility(IListManager).mailing_lists: + by_domain.setdefault(mlist.host_name, []).append(mlist) + sort_key = attrgetter('list_name') + for domain in sorted(by_domain): + for mlist in sorted(by_domain[domain], key=sort_key): + utility = getUtility(IMailTransportAgentAliases) + for alias in utility.aliases(mlist): + print >> fp, alias + print >> fp |
