diff -r c0e1fb1b0145 -r a4aead244f75 VirtualMailManager/cli/main.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VirtualMailManager/cli/main.py Thu Jun 28 19:26:50 2012 +0000 @@ -0,0 +1,80 @@ +# -*- coding: UTF-8 -*- +# Copyright (c) 2007 - 2012, Pascal Volk +# See COPYING for distribution information. +""" + VirtualMailManager.cli.main + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + VirtualMailManager's command line interface. +""" + +from ConfigParser import NoOptionError, NoSectionError + +from VirtualMailManager import ENCODING, errors +from VirtualMailManager.config import BadOptionError, ConfigValueError +from VirtualMailManager.cli import w_err +from VirtualMailManager.cli.handler import CliHandler +from VirtualMailManager.constants import DATABASE_ERROR, EX_MISSING_ARGS, \ + EX_SUCCESS, EX_UNKNOWN_COMMAND, EX_USER_INTERRUPT, INVALID_ARGUMENT +from VirtualMailManager.cli.subcommands import RunContext, cmd_map, \ + update_cmd_map, usage + + +_ = lambda msg: msg + + +def _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() + return handler + + +def run(argv): + update_cmd_map() + if len(argv) < 2: + usage(EX_MISSING_ARGS, _(u"You must specify a subcommand at least.")) + + sub_cmd = argv[1].lower() + if sub_cmd in cmd_map: + cmd_func = cmd_map[sub_cmd].func + else: + for cmd in cmd_map.itervalues(): + if cmd.alias == sub_cmd: + cmd_func = cmd.func + sub_cmd = cmd.name + break + else: + 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!'), '') + except errors.VMMError, err: + if err.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) + except NoSectionError, err: + w_err(INVALID_ARGUMENT, + _(u"Error: Unknown section: '%s'") % err.section) + except NoOptionError, err: + w_err(INVALID_ARGUMENT, + _(u"Error: No option '%(option)s' in section: '%(section)s'") % + {'option': err.option, 'section': err.section}) + if handler.has_warnings(): + w_err(0, _(u'Warnings:'), *handler.get_warnings()) + return EX_SUCCESS + +del _