From d52a615774ffce07391ff7a7802a198ee1be78e3 Mon Sep 17 00:00:00 2001 From: InsanePrawn Date: Sun, 12 Sep 2021 06:10:15 +0200 Subject: [PATCH] Make main.py the main entrypoint again and call docker wrapper enforcement from cli() callback Signed-off-by: InsanePrawn --- bin/kupferbootstrap | 2 +- main.py | 11 +++++++++- wrapper.py | 53 +++++++++++++++++++++++++++++---------------- 3 files changed, 45 insertions(+), 21 deletions(-) diff --git a/bin/kupferbootstrap b/bin/kupferbootstrap index 7185350..0744f9e 100755 --- a/bin/kupferbootstrap +++ b/bin/kupferbootstrap @@ -1,4 +1,4 @@ #!/bin/bash # shellcheck disable=SC2068 -python3 "$(dirname "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")")/wrapper.py" $@ +python3 "$(dirname "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")")/main.py" $@ diff --git a/main.py b/main.py index 150c796..1004edf 100644 --- a/main.py +++ b/main.py @@ -9,19 +9,25 @@ from telnet import cmd_telnet from logger import setup_logging, verbose_option import click from config import config, config_option +from wrapper import enforce_wrap, nowrapper_option @click.group() @verbose_option @config_option -def cli(verbose: bool = False, config_file: str = None): +@nowrapper_option +def cli(verbose: bool = False, config_file: str = None, no_wrapper: bool = False): setup_logging(verbose) config.runtime['verbose'] = verbose config.try_load_file(config_file) + # TODO: move this only to CMDs where it's needed + enforce_wrap(no_wrapper=no_wrapper) + def main(): return cli(prog_name='kupferbootstrap') + cli.add_command(cmd_cache) cli.add_command(cmd_packages) cli.add_command(cmd_image) @@ -30,3 +36,6 @@ cli.add_command(cmd_flash) cli.add_command(cmd_ssh) cli.add_command(cmd_forwarding) cli.add_command(cmd_telnet) + +if __name__ == '__main__': + main() diff --git a/wrapper.py b/wrapper.py index 48902ee..c5c4037 100644 --- a/wrapper.py +++ b/wrapper.py @@ -4,28 +4,28 @@ import subprocess import sys import appdirs import uuid +import click +import logging +from config import config -if os.getenv('KUPFERBOOTSTRAP_DOCKER') == '1': - from main import main - main() -else: + +def wrap_docker(): script_path = os.path.dirname(os.path.abspath(__file__)) with open(os.path.join(script_path, 'version.txt')) as version_file: version = version_file.read().replace('\n', '') tag = f'registry.gitlab.com/kupfer/kupferbootstrap:{version}' if version == 'dev': - result = subprocess.run( - [ - 'docker', - 'build', - '.', - '-t', - tag, - ], - cwd=script_path, - ) + logging.info(f'Building docker image "{tag}"') + cmd = [ + 'docker', + 'build', + '.', + '-t', + tag, + ] + (['-q'] if not config.runtime['verbose'] else []) + result = subprocess.run(cmd, cwd=script_path, capture_output=True) if result.returncode != 0: - print(f'Failed to build kupferbootstrap docker image') + logging.fatal('Failed to build docker image:\n' + result.stderr.decode()) exit(1) else: # Check if the image for the version already exists @@ -39,7 +39,7 @@ else: capture_output=True, ) if result.stdout == b'': - print(f'Pulling kupferbootstrap docker image version \'{version}\'') + logging.info(f'Pulling kupferbootstrap docker image version \'{version}\'') subprocess.run([ 'docker', 'pull', @@ -66,8 +66,7 @@ else: '-v', f'{os.getenv("KUPFERBOOTSTRAP_PREBUILTS")}:/prebuilts:z', ] - - result = subprocess.run([ + cmd = [ 'docker', 'run', '--name', @@ -88,6 +87,22 @@ else: '-v', '/dev:/dev', #'-v', '/mnt/kupfer:/mnt/kupfer:z', - ] + [tag, 'kupferbootstrap'] + sys.argv[1:]) + ] + [tag, 'kupferbootstrap'] + sys.argv[1:] + logging.debug('Wrapping in docker:' + repr(cmd)) + result = subprocess.run(cmd) exit(result.returncode) + + +def enforce_wrap(no_wrapper=False): + if os.getenv('KUPFERBOOTSTRAP_DOCKER') != '1' and not no_wrapper: + wrap_docker() + + +nowrapper_option = click.option( + '--no-wrapper', + 'no_wrapper', + is_flag=True, + default=False, + help='Disable the docker wrapper. Defaults to autodetection.', +)