import json import click from pathlib import Path import logging ################################################## # Import package modules ################################################# from iottb.utils.logger_config import setup_logging from iottb import definitions from iottb.contexts import IottbConfig from iottb.commands.initialize_testbed import init_db ############################################################################ # Module shortcuts for global definitions ########################################################################### APP_NAME = definitions.APP_NAME DB_NAME = definitions.DB_NAME CFG_FILE_PATH = definitions.CFG_FILE_PATH # These are (possibly) redundant when defined in definitions.py # keeping them here until refactored and tested MAX_VERBOSITY = definitions.MAX_VERBOSITY # Logger stuff loglevel = definitions.LOGLEVEL logger = logging.getLogger(__name__) @click.group() @click.option('-v', '--verbosity', count=True, type=click.IntRange(0, 3), default=0, help='Set verbosity') @click.option('-d', '--debug', is_flag=True, default=False, help='Enable debug mode') @click.option('--cfg-file', type=click.Path(), default=Path(click.get_app_dir(APP_NAME)).joinpath('iottb.cfg'), envvar='IOTTB_CONF_HOME', help='Path to iottb config file') @click.pass_context def cli(ctx, verbosity, debug, cfg_file): setup_logging(verbosity, debug) # Setup logging based on the loaded configuration and other options ctx.ensure_object(dict) # Make sure context is ready for use logger.info("Starting execution.") ctx.obj['CONFIG'] = IottbConfig(cfg_file) # Load configuration directly @click.command() @click.option('--file', default=DB_NAME) @click.option('--table', type=str, default='DefaultDatabase') @click.option('--key') @click.option('--value') @click.pass_context def set_key_in_table_to(ctx, file, table, key, value): """Edit config or metadata files. TODO: Implement""" click.echo(f'set_key_in_table_to invoked') logger.warning("Unimplemented subcommand invoked.") @click.command() @click.confirmation_option(prompt="Are you certain that you want to delete the cfg file?") def rm_cfg(): """ Removes the cfg file from the filesystem. This is mostly a utility during development. Once non-standard database locations are implemented, deleting this would lead to iottb not being able to find them anymore. """ Path(CFG_FILE_PATH).unlink() click.echo(f'Iottb configuration removed at {CFG_FILE_PATH}') @click.command() @click.confirmation_option(prompt="Are you certain that you want to delete the databases file?") def rm_dbs(dbs): """ Removes ALL(!) databases from the filesystem if they're empty. Development utility currently unfit for use. """ config = IottbConfig() paths = config.get_know_database_paths() logger.debug(f'Known db paths: {str(paths)}') for dbs in paths: try: Path(dbs).rmdir() click.echo(f'{dbs} deleted') except Exception as e: logger.debug(f'Failed unlinking db {dbs} with error {e}') logger.info(f'All databases deleted') ################################################################################## # Add all subcommands to group here ################################################################################# # noinspection PyTypeChecker cli.add_command(init_db) cli.add_command(rm_cfg) cli.add_command(set_key_in_table_to) cli.add_command(rm_dbs) if __name__ == '__main__': cli(auto_envvar_prefix='IOTTB')