132 lines
4.9 KiB
Python
132 lines
4.9 KiB
Python
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.models.iottb_config import IottbConfig
|
|
from iottb.commands.initialize_testbed import init_db
|
|
from iottb.commands.add_device import add_device
|
|
|
|
############################################################################
|
|
# 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
|
|
# ctx.meta['FULL_PATH_CONFIG_FILE'] =
|
|
|
|
|
|
@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')
|
|
|
|
|
|
@click.command('show-cfg', help='Show the current configuration context')
|
|
@click.option('--cfg-file', type=click.Path(), default=CFG_FILE_PATH, help='Path to the config file')
|
|
@click.option('-pp', is_flag=True, default=False, help='Pretty Print')
|
|
@click.pass_context
|
|
def show_cfg(ctx, cfg_file, pp):
|
|
logger.debug(f'Pretty print option set to {pp}')
|
|
if pp:
|
|
try:
|
|
config = IottbConfig(Path(cfg_file))
|
|
click.echo("Configuration Context:")
|
|
click.echo(f"Default Database: {config.default_database}")
|
|
click.echo(f"Default Database Path: {config.default_db_location}")
|
|
click.echo("Database Locations:")
|
|
for db_name, db_path in config.db_path_dict.items():
|
|
click.echo(f" - {db_name}: {db_path}")
|
|
except Exception as e:
|
|
logger.error(f"Error loading configuration: {e}")
|
|
click.echo(f"Failed to load configuration from {cfg_file}")
|
|
else:
|
|
path = Path(cfg_file)
|
|
|
|
if path.is_file():
|
|
with path.open('r') as file:
|
|
content = file.read()
|
|
click.echo(content)
|
|
else:
|
|
click.echo(f"Configuration file not found at {cfg_file}")
|
|
|
|
|
|
##################################################################################
|
|
# 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)
|
|
# noinspection PyTypeChecker
|
|
cli.add_command(add_device)
|
|
cli.add_command(show_cfg)
|
|
if __name__ == '__main__':
|
|
cli(auto_envvar_prefix='IOTTB', show_default=True, show_envvars=True)
|