#!/usr/bin/python3
# SPDX-License-Identifier: AGPL-3.0-or-later
"""
Configuration helper for email server.
"""

import argparse
import logging
import os
import sys

import plinth.log
from plinth.modules.email_server import audit

EXIT_SYNTAX = 10
EXIT_PERM = 20

logger = logging.getLogger(__file__)


def main():
    """Parse arguments."""
    plinth.log.action_init()

    parser = argparse.ArgumentParser()
    parser.add_argument('module', help='Module to trigger action in')
    parser.add_argument('action', help='Action to trigger in module')
    parser.add_argument('arguments', help='String arguments for action',
                        nargs='*')
    args = parser.parse_args()

    try:
        _call(args.module, args.action, args.arguments)
    except Exception as exception:
        logger.exception(exception)
        sys.exit(1)


def _call(module_name, action_name, arguments):
    """Import the module and run action as superuser."""
    if os.getuid() != 0:
        logger.critical('This action is reserved for root')
        sys.exit(EXIT_PERM)

    # We only run actions defined in the audit module
    if module_name not in audit.__all__:
        logger.critical('Bad module name: %r', module_name)
        sys.exit(EXIT_SYNTAX)

    module = getattr(audit, module_name)
    try:
        action = getattr(module, 'action_' + action_name)
    except AttributeError:
        logger.critical('Bad action: %s/%r', module_name, action_name)
        sys.exit(EXIT_SYNTAX)

    for argument in arguments:
        if not isinstance(argument, str):
            logger.critical('Bad argument: %s', argument)
            sys.exit(EXIT_SYNTAX)

    action(*arguments)


if __name__ == '__main__':
    main()
