#!/usr/bin/env python3 import logging import sys import importlib import argparse import multiprocessing as mp from uncloud import UncloudException from contextlib import suppress 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) arg_parser = argparse.ArgumentParser() subparsers = arg_parser.add_subparsers(dest='command') parent_parser = argparse.ArgumentParser(add_help=False) parent_parser.add_argument('--debug', '-d', action='store_true', default=False, help='More verbose logging') for component in ['api', 'scheduler', 'host', 'filescanner', 'imagescanner', 'metadata', 'configure', 'cli']: mod = importlib.import_module('uncloud.{}.main'.format(component)) parser = getattr(mod, 'arg_parser') subparsers.add_parser(name=parser.prog, parents=[parser, parent_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)