summaryrefslogtreecommitdiff
path: root/src/mailman/commands/cli_aliases.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailman/commands/cli_aliases.py')
-rw-r--r--src/mailman/commands/cli_aliases.py76
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