iact3/main.py (60 lines of code) (raw):
import signal
import sys
from pkg_resources import get_distribution
from iact3 import cli_modules
from iact3.cli import CliCore, GLOBAL_ARGS, _get_log_level
from iact3.generate_params import IAC_PACKAGE_NAME, IAC_NAME
from iact3.logger import init_cli_logger
from iact3.util import exit_with_code
LOG = init_cli_logger(loglevel="ERROR")
DESCRIPTION = 'Infrastructure as Code Templates Validation Test.'
DEFAULT_PROFILE = '.'
def sync_run():
"""
Run the CLI synchronously.
"""
import asyncio
from iact3.exceptions import Iact3Exception
if sys.version_info[0] == 3 and sys.version_info[1] >= 7:
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
loop.run_until_complete(run())
finally:
loop.close()
else:
raise Iact3Exception("Please use Python 3.7+")
async def run():
signal.signal(signal.SIGINT, _sigint_handler)
log_level = _setup_logging(sys.argv)
args = sys.argv[1:]
if not args:
args.append('-h')
try:
version = get_installed_version()
cli = CliCore(IAC_NAME, cli_modules, DESCRIPTION, version, GLOBAL_ARGS.ARGS)
cli.parse(args)
_default_profile = cli.parsed_args.__dict__.get('_profile')
if _default_profile:
GLOBAL_ARGS.profile = _default_profile
_log_prefix = cli.parsed_args.__dict__.get('_log_prefix')
if _log_prefix:
GLOBAL_ARGS.log_prefix = _log_prefix
init_cli_logger(log_prefix=_log_prefix, logger=LOG)
await cli.run()
except Exception as e:
LOG.error(
'%s %s', e.__class__.__name__, str(e), exc_info=_print_tracebacks(log_level)
)
exit_with_code(1)
def _setup_logging(args, exit_func=exit_with_code):
log_level = _get_log_level(args, exit_func=exit_func)
LOG.setLevel(log_level)
return log_level
def _print_tracebacks(log_level):
return log_level == 'DEBUG'
def get_installed_version():
try:
return get_distribution(IAC_PACKAGE_NAME).version
except Exception:
return '[local source] no pip module installed'
def _sigint_handler(signum, frame):
LOG.debug(f'SIGNAL {signum} caught at {frame}')
exit_with_code(1)