108 lines
3.6 KiB
Python
108 lines
3.6 KiB
Python
#!/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()
|