diff options
| author | Barry Warsaw | 2012-10-12 22:43:13 -0400 |
|---|---|---|
| committer | Barry Warsaw | 2012-10-12 22:43:13 -0400 |
| commit | d337335caa3e7116f73c2b18874c9a64d5f70957 (patch) | |
| tree | 3db6db859e469108f9a9f43211e5f14ac6ec8ef4 /src/mailman/commands | |
| parent | 12b9839a5e7f1e9fda477c5e40ed190e08292da7 (diff) | |
| parent | 55869e715579119d8cff3e520a2a3c00e4e87de7 (diff) | |
| download | mailman-d337335caa3e7116f73c2b18874c9a64d5f70957.tar.gz mailman-d337335caa3e7116f73c2b18874c9a64d5f70957.tar.zst mailman-d337335caa3e7116f73c2b18874c9a64d5f70957.zip | |
* Added support for Postfix `relay_domains` setting for better virtual domain
support. Contributed by Jimmy Bergman.
* `bin/mailman aliases` loses the `--output`, `--format`, and `--simple`
arguments, and adds a `--directory` argument. This is necessary to support
the Postfix `relay_domains` support.
Diffstat (limited to 'src/mailman/commands')
| -rw-r--r-- | src/mailman/commands/cli_aliases.py | 88 | ||||
| -rw-r--r-- | src/mailman/commands/docs/aliases.rst | 92 |
2 files changed, 34 insertions, 146 deletions
diff --git a/src/mailman/commands/cli_aliases.py b/src/mailman/commands/cli_aliases.py index d692ba356..d26e5a754 100644 --- a/src/mailman/commands/cli_aliases.py +++ b/src/mailman/commands/cli_aliases.py @@ -25,18 +25,11 @@ __all__ = [ ] -import sys - -from operator import attrgetter -from zope.component import getUtility from zope.interface import implementer 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 @@ -51,84 +44,11 @@ class Aliases: """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', + '-d', '--directory', 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. - """)) + An alternative directory to output the various MTA files to.""")) 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 - elif args.output is None: - output = None - else: - output = args.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) - - - -@implementer(IMailTransportAgentLifecycle) -class Dummy: - """Dummy aliases implementation for simpler output format.""" - - 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.mail_host, []).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(alias, file=fp) - print(file=fp) + # Call the MTA-specific regeneration method. + call_name(config.mta.incoming).regenerate(args.directory) diff --git a/src/mailman/commands/docs/aliases.rst b/src/mailman/commands/docs/aliases.rst index c0d4c10c9..89843c8ad 100644 --- a/src/mailman/commands/docs/aliases.rst +++ b/src/mailman/commands/docs/aliases.rst @@ -2,16 +2,14 @@ Generating aliases ================== -For some mail servers, Mailman must generate a data file that is used to hook +For some mail servers, Mailman must generate data files that are used to hook Mailman up to the mail server. The details of this differ for each mail server. Generally these files are automatically kept up-to-date when mailing lists are created or removed, but you might occasionally need to manually regenerate the file. The ``bin/mailman aliases`` command does this. >>> class FakeArgs: - ... output = None - ... format = None - ... simple = None + ... directory = None >>> from mailman.commands.cli_aliases import Aliases >>> command = Aliases() @@ -32,12 +30,29 @@ generation. ... """) Let's create a mailing list and then display the transport map for it. We'll -send the output to stdout. +write the appropriate files to a temporary directory. :: - >>> FakeArgs.output = '-' + >>> import os, shutil, tempfile + >>> output_directory = tempfile.mkdtemp() + >>> cleanups.append((shutil.rmtree, output_directory)) + + >>> FakeArgs.directory = output_directory >>> mlist = create_list('test@example.com') >>> command.process(FakeArgs) + +For Postfix, there are two files in the output directory. + + >>> files = sorted(os.listdir(output_directory)) + >>> for file in files: + ... print file + postfix_domains + postfix_lmtp + +The transport map file contains all the aliases for the mailing list. + + >>> with open(os.path.join(output_directory, 'postfix_lmtp')) as fp: + ... print fp.read() # AUTOMATICALLY GENERATED BY MAILMAN ON ... ... test@example.com lmtp:[lmtp.example.com]:24 @@ -51,61 +66,14 @@ send the output to stdout. test-unsubscribe@example.com lmtp:[lmtp.example.com]:24 <BLANKLINE> - >>> config.pop('postfix') - +The relay domains file contains a list of all the domains. -Alternative output -================== - -By using a command line switch, we can select a different output format. The -option must point to an alternative implementation of the -``IMailTransportAgentAliases`` interface. - -Mailman comes with an alternative implementation that just prints the aliases, -with no adornment. - - >>> FakeArgs.format = 'mailman.commands.cli_aliases.Dummy' - >>> command.process(FakeArgs) - test@example.com - test-bounces@example.com - test-confirm@example.com - test-join@example.com - test-leave@example.com - test-owner@example.com - test-request@example.com - test-subscribe@example.com - test-unsubscribe@example.com - <BLANKLINE> - -A simpler way of getting the same output is with the ``--simple`` flag. - - >>> FakeArgs.format = None - >>> FakeArgs.simple = True - >>> command.process(FakeArgs) - test@example.com - test-bounces@example.com - test-confirm@example.com - test-join@example.com - test-leave@example.com - test-owner@example.com - test-request@example.com - test-subscribe@example.com - test-unsubscribe@example.com - <BLANKLINE> - - -Mutually exclusive arguments -============================ - -You cannot use both ``--simple`` and ``--format``. - - >>> FakeArgs.format = 'mailman.commands.cli_aliases.Dummy' - >>> FakeArgs.simple = True - >>> class Parser: - ... def error(self, message): - ... raise RuntimeError(message) - >>> command.parser = Parser() - >>> command.process(FakeArgs) - Traceback (most recent call last): + >>> with open(os.path.join(output_directory, 'postfix_domains')) as fp: + ... print fp.read() + # AUTOMATICALLY GENERATED BY MAILMAN ON ... ... - RuntimeError: Cannot use both -s and -f + example.com example.com + +.. + Clean up. + >>> config.pop('postfix') |
