#!/usr/bin/env python3 import argparse import logging import importlib import multiprocessing as mp import sys from logging.handlers import SysLogHandler from uncloud.configure.main import configure_parser from uncloud import UncloudException def exception_hook(exc_type, exc_value, exc_traceback): logging.getLogger(__name__).error( 'Uncaught exception', exc_info=(exc_type, exc_value, exc_traceback) ) sys.excepthook = exception_hook if __name__ == '__main__': # Setting up root logger logger = logging.getLogger() logger.setLevel(logging.DEBUG) parent_parser = argparse.ArgumentParser(add_help=False) parent_parser.add_argument("--debug", "-d", action='store_true') arg_parser = argparse.ArgumentParser() subparsers = arg_parser.add_subparsers(dest="command") api_parser = subparsers.add_parser("api", parents=[parent_parser]) api_parser.add_argument("--port", "-p") host_parser = subparsers.add_parser("host") host_parser.add_argument("--hostname", required=True) scheduler_parser = subparsers.add_parser("scheduler", parents=[parent_parser]) filescanner_parser = subparsers.add_parser("filescanner") imagescanner_parser = subparsers.add_parser("imagescanner") metadata_parser = subparsers.add_parser("metadata") metadata_parser.add_argument("--port", "-p") config_parser = subparsers.add_parser("configure") configure_parser(config_parser) args = arg_parser.parse_args() if not args.command: arg_parser.print_help() else: # if we start etcd in seperate process with default settings # i.e inheriting few things from parent process etcd3 module # errors out, so the following command configure multiprocessing # module to not inherit anything from parent. mp.set_start_method('spawn') arguments = vars(args) try: name = arguments.pop('command') mod = importlib.import_module("uncloud.{}.main".format(name)) main = getattr(mod, "main") main(**arguments) except UncloudException as err: logger.error(err) except Exception as err: logger.exception(err)