diff --git a/code/iottb-project/docs/help_messages.md b/code/iottb-project/docs/help_messages.md new file mode 100644 index 0000000..4936087 --- /dev/null +++ b/code/iottb-project/docs/help_messages.md @@ -0,0 +1,142 @@ +Main Command: iottb +Testbed [I] + Usage: [OPTIONS] COMMAND [ARGS]... + +Options: + -v, --verbosity Set verbosity [0<=x<=3] + -d, --debug Enable debug mode + --dry-run + --cfg-file PATH Path to iottb config file + --help Show this message and exit. + +Commands: + add-device Add a device to a database + init-db + rm-cfg Removes the cfg file from the filesystem. + rm-dbs Removes ALL(!) databases from the filesystem if... + set-key-in-table-to Edit config or metadata files. + show-all Show everything: configuration, databases, and... + show-cfg Show the current configuration context + sniff Sniff packets with tcpdump + + +Command: init-db + Usage: [OPTIONS] + +Options: + -d, --dest PATH Location to put (new) iottb database + -n, --name TEXT Name of new database. + --update-default / --no-update-default + If new db should be set as the new default + --help Show this message and exit. + + +Command: rm-cfg + Usage: [OPTIONS] + + 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. + +Options: + --yes Confirm the action without prompting. + --help Show this message and exit. + + +Command: set-key-in-table-to + Usage: [OPTIONS] + + Edit config or metadata files. TODO: Implement + +Options: + --file TEXT + --table TEXT + --key TEXT + --value TEXT + --help Show this message and exit. + + +Command: rm-dbs + Usage: [OPTIONS] + + Removes ALL(!) databases from the filesystem if they're empty. + + Development utility currently unfit for use. + +Options: + --yes Confirm the action without prompting. + --help Show this message and exit. + + +Command: add-device + Usage: [OPTIONS] + + Add a device to a database + +Options: + --dev, --device-name TEXT The name of the device to be added. If this + string contains spaces or other special + characters normalization is + performed to derive a canonical name [required] + --db, --database DIRECTORY Database in which to add this device. If not + specified use default from config. [env var: + IOTTB_DB] + --guided Add device interactively [env var: + IOTTB_GUIDED_ADD] + --help Show this message and exit. + + +Command: show-cfg + Usage: [OPTIONS] + + Show the current configuration context + +Options: + --cfg-file PATH Path to the config file + -pp Pretty Print + --help Show this message and exit. + + +Command: sniff + Usage: [OPTIONS] [TCPDUMP-ARGS] [DEVICE] + + Sniff packets with tcpdump + +Options: + Testbed sources: + --db, --database TEXT Database of device. Only needed if not current + default. [env var: IOTTB_DB] + --app TEXT Companion app being used during capture + Runtime behaviour: + --unsafe Disable checks for otherwise required options. + [env var: IOTTB_UNSAFE] + --guided [env var: IOTTB_GUIDED] + --pre PATH Script to be executed before main commandis + started. + Tcpdump options: + -i, --interface TEXT Network interface to capture on.If not specified + tcpdump tries to find and appropriate one. [env + var: IOTTB_CAPTURE_INTERFACE] + -a, --address TEXT IP or MAC address to filter packets by. [env var: + IOTTB_CAPTURE_ADDRESS] + -I, --monitor-mode Put interface into monitor mode. + --ff TEXT tcpdump filter as string or file path. [env var: + IOTTB_CAPTURE_FILTER] + -#, --print-pacno Print packet number at beginning of line. True by + default. + -e, --print-ll Print link layer headers. True by default. + -c, --count INTEGER Number of packets to capture. + --help Show this message and exit. + + +Command: show-all + Usage: [OPTIONS] + + Show everything: configuration, databases, and device metadata + +Options: + --help Show this message and exit. + + diff --git a/code/iottb-project/iottb/__init__.py b/code/iottb-project/iottb/__init__.py index 1438731..940a836 100644 --- a/code/iottb-project/iottb/__init__.py +++ b/code/iottb-project/iottb/__init__.py @@ -1,3 +1,5 @@ +from pathlib import Path + from iottb import definitions import logging from iottb.utils.user_interaction import tb_echo @@ -9,3 +11,6 @@ log_dir = definitions.LOGDIR # Ensure logs dir exists before new handlers are registered in main.py if not log_dir.is_dir(): log_dir.mkdir() + +DOCS_FOLDER = Path.cwd() / 'docs' + diff --git a/code/iottb-project/iottb/commands/sniff.py b/code/iottb-project/iottb/commands/sniff.py index 0eef81c..4401862 100644 --- a/code/iottb-project/iottb/commands/sniff.py +++ b/code/iottb-project/iottb/commands/sniff.py @@ -46,6 +46,14 @@ def validate_sniff(ctx, param, value): return value +def run_pre(pre): + pass + + +def run_post(post): + pass + + @click.command('sniff', help='Sniff packets with tcpdump') @optgroup.group('Testbed sources') @optgroup.option('--db', '--database', type=str, envvar='IOTTB_DB', show_envvar=True, @@ -79,10 +87,13 @@ def validate_sniff(ctx, param, value): @click.argument('device', required=False) @click.pass_context def sniff(ctx, device, interface, print_pacno, ff, count, monitor_mode, print_ll, address, db, unsafe, guided, - app, tcpdump_args, **params): + app, tcpdump_args, pre, post, **params): """ Sniff packets from a device """ logger.info('sniff command invoked') - + # Step 0: run pre script: + if pre: + click.echo(f'Running pre command {pre}') + run_pre(pre) # Step1: Load Config config = ctx.obj['CONFIG'] logger.debug(f'Config loaded: {config}') @@ -325,3 +336,6 @@ def sniff(ctx, device, interface, print_pacno, ff, count, monitor_mode, print_ll json.dump(metadata, f, indent=4) click.echo(f'END SNIFF SUBCOMMAND') + if post: + click.echo(f'Running post command {post}') + run_post(post) diff --git a/code/iottb-project/iottb/scripts/generate_help.py b/code/iottb-project/iottb/scripts/generate_help.py index fd4b683..2b4d29d 100755 --- a/code/iottb-project/iottb/scripts/generate_help.py +++ b/code/iottb-project/iottb/scripts/generate_help.py @@ -1,7 +1,9 @@ +from pathlib import Path + import click from io import StringIO import sys - +from iottb import DOCS_FOLDER # Import your CLI app here from iottb.main import cli @@ -28,7 +30,7 @@ def get_help_text(command): def write_help_to_file(cli, filename): """Write help messages of all commands and subcommands to a file.""" - with open(filename, 'w') as f: + with open(filename, 'w+') as f: # main f.write(f"Main Command: iottb\n") f.write(get_help_text(cli)) @@ -49,4 +51,9 @@ def write_help_to_file(cli, filename): if __name__ == "__main__": - write_help_to_file(cli, "help_messages.md") + from iottb import DOCS_FOLDER + print('Must be in project root for this to work properly!') + print(f'CWD is {str(Path.cwd())}') + DOCS_FOLDER.mkdir(exist_ok=True) + write_help_to_file(cli, str(DOCS_FOLDER / "help_messages.md")) + print(f'Wrote help_messages.md to {str(DOCS_FOLDER / "help_messages.md")}')