First version of a CatchallAlias class
I based the CatchallAlias class in catchall.py heavily on the Alias class, but
by copy, not deriving. The two are functionally related, but the
implementations are too different because CatchallAliases have no localpart.
# -*- coding: UTF-8 -*-# Copyright 2007 - 2011, Pascal Volk# See COPYING for distribution information.""" VirtualMailManager.cli.main ~~~~~~~~~~~~~~~~~~~~~~~~~~~ VirtualMailManager's command line interface."""fromConfigParserimportNoOptionError,NoSectionErrorfromVirtualMailManagerimportENCODING,errorsfromVirtualMailManager.configimportBadOptionError,ConfigValueErrorfromVirtualMailManager.cliimportw_errfromVirtualMailManager.cli.handlerimportCliHandlerfromVirtualMailManager.constantsimportDATABASE_ERROR,EX_MISSING_ARGS, \EX_SUCCESS,EX_UNKNOWN_COMMAND,EX_USER_INTERRUPT,INVALID_ARGUMENTfromVirtualMailManager.cli.subcommandsimportRunContext,cmd_map, \update_cmd_map,usage_=lambdamsg:msgdef_get_handler():"""Try to get a CliHandler. Exit the program when an error occurs."""try:handler=CliHandler()except(errors.NotRootError,errors.PermissionError,errors.VMMError,errors.ConfigError),err:w_err(err.code,_(u'Error: %s')%err.msg)else:handler.cfg_install()returnhandlerdefrun(argv):update_cmd_map()iflen(argv)<2:usage(EX_MISSING_ARGS,_(u"You must specify a subcommand at least."))sub_cmd=argv[1].lower()ifsub_cmdincmd_map:cmd_func=cmd_map[sub_cmd].funcelse:forcmdincmd_map.itervalues():ifcmd.alias==sub_cmd:cmd_func=cmd.funcsub_cmd=cmd.namebreakelse:usage(EX_UNKNOWN_COMMAND,_(u"Unknown subcommand: '%s'")%sub_cmd)handler=_get_handler()run_ctx=RunContext(argv,handler,sub_cmd)try:cmd_func(run_ctx)except(EOFError,KeyboardInterrupt):# TP: We have to cry, because root has killed/interrupted vmm# with Ctrl+C or Ctrl+D.w_err(EX_USER_INTERRUPT,'',_(u'Ouch!'),'')excepterrors.VMMError,err:iferr.code!=DATABASE_ERROR:w_err(err.code,_(u'Error: %s')%err.msg)w_err(err.code,unicode(err.msg,ENCODING,'replace'))except(BadOptionError,ConfigValueError),err:w_err(INVALID_ARGUMENT,_(u'Error: %s')%err)exceptNoSectionError,err:w_err(INVALID_ARGUMENT,_(u"Error: Unknown section: '%s'")%err.section)exceptNoOptionError,err:w_err(INVALID_ARGUMENT,_(u"Error: No option '%(option)s' in section: '%(section)s'")%{'option':err.option,'section':err.section})ifhandler.has_warnings():w_err(0,_(u'Warnings:'),*handler.get_warnings())returnEX_SUCCESSdel_