VirtualMailManager/cli/main.py
author Pascal Volk <neverseen@users.sourceforge.net>
Fri, 06 Aug 2010 23:06:19 +0000
branchv0.6.x
changeset 346 95d45e4ec1a6
parent 343 9232ed7e4d85
child 354 a653c43048b1
permissions -rw-r--r--
VMM/cli/handler: Don't perform config and environment checks twice.

# -*- coding: UTF-8 -*-
# Copyright 2007 - 2010, 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 CONF_ERROR, DATABASE_ERROR, \
     EX_MISSING_ARGS, EX_SUCCESS, EX_UNKNOWN_COMMAND, EX_USER_INTERRUPT, \
     INVALID_ARGUMENT
from VirtualMailManager.cli.subcommands import RunContext, cmd_map, usage


_ = lambda msg: msg


def _get_handler():
    """Try to get a CliHandler. Exit the program when an error occurs."""
    try:
        handler = CliHandler()
        handler.cfg_install()
    except (errors.NotRootError, errors.PermissionError, errors.VMMError,
            errors.ConfigError), err:
        w_err(err.code, _(u'Error: %s') % err.msg)
    except ConfigValueError, err:
        w_err(CONF_ERROR, _(u'Error: %s') % err)
    else:
        return handler


def run(argv):
    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: No 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 _