#!/usr/bin/env python3 import argparse from os import environ from pathlib import Path import logging from archive.iottb.subcommands.add_device import setup_init_device_root_parser # from iottb.subcommands.capture import setup_capture_parser from iottb.subcommands.sniff import setup_sniff_parser from iottb.utils.tcpdump_utils import list_interfaces from iottb.logger import setup_logging logger = logging.getLogger('iottbLogger.__main__') logger.setLevel(logging.DEBUG) ###################### # Argparse setup ###################### def setup_argparse(): # create top level parser root_parser = argparse.ArgumentParser(prog='iottb') # shared options root_parser.add_argument('--verbose', '-v', action='count', default=0) root_parser.add_argument('--script-mode', action='store_true', help='Run in script mode (non-interactive)') # Group of args w.r.t iottb.db creation group = root_parser.add_argument_group('database options') group.add_argument('--db-home', default=Path.home() / 'IoTtb.db') group.add_argument('--config-home', default=Path.home() / '.config' / 'iottb.conf', type=Path, ) group.add_argument('--user', default=Path.home().stem, type=Path, ) # configure subcommands subparsers = root_parser.add_subparsers(title='subcommands', required=True, dest='command') # setup_capture_parser(subparsers) setup_init_device_root_parser(subparsers) setup_sniff_parser(subparsers) # Utility to list interfaces directly with iottb instead of relying on external tooling interfaces_parser = subparsers.add_parser('list-interfaces', aliases=['li', 'if'], help='List available network interfaces.') interfaces_parser.set_defaults(func=list_interfaces) return root_parser ### # Where put ?! ### class IoTdb: def __init__(self, db_home=Path.home() / 'IoTtb.db', iottb_config=Path.home() / '.conf' / 'iottb.conf', user=Path.home().stem): self.db_home = db_home self.config_home = iottb_config self.default_filters_home = db_home / 'default_filters' self.user = user def create_db(self, mode=0o777, parents=False, exist_ok=False): logger.info(f'Creating db at {self.db_home}') try: self.db_home.mkdir(mode=mode, parents=parents, exist_ok=exist_ok) except FileExistsError: logger.error(f'Database path already at {self.db_home} exists and is not a directory') finally: logger.debug(f'Leaving finally clause in create_db') def create_device_tree(self, mode=0o777, parents=False, exist_ok=False): logger.info(f'Creating device tree at {self.db_home / 'devices'}') #TODO def parse_db_config(self): pass def parse_iottb_config(self): pass def get_known_devices(self): pass def iottb_db_exists(db_home=Path.home() / 'IoTtb.db'): res = db_home.is_dir() def main(): logger.debug(f'Pre setup_argparse()') parser = setup_argparse() logger.debug('Post setup_argparse().') args = parser.parse_args() logger.debug(f'Args parsed: {args}') if args.command: try: args.func(args) except KeyboardInterrupt: print('Received keyboard interrupt. Exiting...') exit(1) except Exception as e: logger.debug(f'Error in main: {e}') print(f'Error: {e}') # create_capture_directory(args.device_name) if __name__ == '__main__': setup_logging() logger.debug("Debug level is working") logger.info("Info level is working") logger.warning("Warning level is working") main()