From 5cc7e2bae09a775151d62963a9306edc20c26100 Mon Sep 17 00:00:00 2001 From: Sebastian Lenzlinger Date: Thu, 2 May 2024 06:01:05 +0200 Subject: [PATCH] Setup testing structure --- .idea/misc.xml | 2 +- .idea/webResources.xml | 14 ++ .idea/workspace.xml | 167 +++++++++++++++++- archive/metadata_utils.py | 2 +- code/kydcap/{main.py => __main__.py} | 20 ++- code/kydcap/config.py | 1 + ..._metadata.py => capture_metadata_model.py} | 0 ...e_metadata.py => device_metadata_model.py} | 0 code/kydcap/subcommands/__init__.py | 0 .../subcommands/initialize_device_root_dir.py | 9 +- code/kydcap/subcommands/sniff.py | 19 +- code/tests/fixtures/__init__.py | 0 code/tests/fixtures/shared_fixtures.py | 15 ++ .../models/test_capture_metadata_model.py | 0 .../models/test_device_metadata_model.py | 0 .../test_initialize_device_root_dir.py | 0 code/tests/subcommands/test_sniff.py | 0 code/tests/test_main.py | 0 .../utils/test_capture_metadata_utils.py | 6 + .../tests/utils/test_device_metadata_utils.py | 0 code/tests/utils/test_tcpdump_utils.py | 0 21 files changed, 235 insertions(+), 20 deletions(-) create mode 100644 .idea/webResources.xml rename code/kydcap/{main.py => __main__.py} (53%) rename code/kydcap/models/{capture_metadata.py => capture_metadata_model.py} (100%) rename code/kydcap/models/{device_metadata.py => device_metadata_model.py} (100%) create mode 100644 code/kydcap/subcommands/__init__.py create mode 100644 code/tests/fixtures/__init__.py create mode 100644 code/tests/fixtures/shared_fixtures.py create mode 100644 code/tests/models/test_capture_metadata_model.py create mode 100644 code/tests/models/test_device_metadata_model.py create mode 100644 code/tests/subcommands/test_initialize_device_root_dir.py create mode 100644 code/tests/subcommands/test_sniff.py create mode 100644 code/tests/test_main.py create mode 100644 code/tests/utils/test_capture_metadata_utils.py create mode 100644 code/tests/utils/test_device_metadata_utils.py create mode 100644 code/tests/utils/test_tcpdump_utils.py diff --git a/.idea/misc.xml b/.idea/misc.xml index 2a01189..0ea184e 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/.idea/webResources.xml b/.idea/webResources.xml new file mode 100644 index 0000000..aa647dc --- /dev/null +++ b/.idea/webResources.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 8828afc..1b59c65 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,7 +4,29 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -83,7 +165,7 @@ - + - + + + + - - + + \ No newline at end of file diff --git a/archive/metadata_utils.py b/archive/metadata_utils.py index 3630093..770fe63 100644 --- a/archive/metadata_utils.py +++ b/archive/metadata_utils.py @@ -3,7 +3,7 @@ from pathlib import Path from pydantic import BaseModel -from kydcap.models.device_metadata import DeviceMetadata +from kydcap.models.device_metadata_model import DeviceMetadata from kydcap.config import DEVICE_METADATA_FILE diff --git a/code/kydcap/main.py b/code/kydcap/__main__.py similarity index 53% rename from code/kydcap/main.py rename to code/kydcap/__main__.py index f2e864a..773ed35 100644 --- a/code/kydcap/main.py +++ b/code/kydcap/__main__.py @@ -1,7 +1,8 @@ #!/usr/bin/env python3 import argparse -from subcommands.sniff import setup_sniff_parser +from kydcap.subcommands.sniff import setup_sniff_parser +from kydcap.subcommands.initialize_device_root_dir import setup_init_root_dir_parser CAP_DIR_PREFIX = ... @@ -15,12 +16,25 @@ def setup_argparse(): subparsers = root_parser.add_subparsers(title="subcommands", required=True, dest="command") setup_sniff_parser(subparsers) + setup_init_root_dir_parser(subparsers) return root_parser -if __name__ == "__main__": +def main(): parser = setup_argparse() args = parser.parse_args() - # if args.command + print(args) + if args.command: + try: + args.func(args) + except KeyboardInterrupt: + print("Received keyboard interrupt. Exiting...") + exit(1) + except Exception as e: + print(f"Error: {e}") # create_capture_directory(args.device_name) + + +if __name__ == "__main__": + main() diff --git a/code/kydcap/config.py b/code/kydcap/config.py index 683b016..e39c53c 100644 --- a/code/kydcap/config.py +++ b/code/kydcap/config.py @@ -1,6 +1,7 @@ from datetime import datetime from enum import Flag, unique, global_enum + DEVICE_METADATA_FILE = "device-metadata.json" CAPTURE_METADATA_FILE = "capture-metadata.json" TODAY_DATE_STRING = datetime.now().strftime("%d%b%Y").lower() diff --git a/code/kydcap/models/capture_metadata.py b/code/kydcap/models/capture_metadata_model.py similarity index 100% rename from code/kydcap/models/capture_metadata.py rename to code/kydcap/models/capture_metadata_model.py diff --git a/code/kydcap/models/device_metadata.py b/code/kydcap/models/device_metadata_model.py similarity index 100% rename from code/kydcap/models/device_metadata.py rename to code/kydcap/models/device_metadata_model.py diff --git a/code/kydcap/subcommands/__init__.py b/code/kydcap/subcommands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/code/kydcap/subcommands/initialize_device_root_dir.py b/code/kydcap/subcommands/initialize_device_root_dir.py index ecbb8ad..88f4ef3 100644 --- a/code/kydcap/subcommands/initialize_device_root_dir.py +++ b/code/kydcap/subcommands/initialize_device_root_dir.py @@ -1,19 +1,20 @@ import pathlib from kydcap.config import DEVICE_METADATA_FILE -from kydcap.models.device_metadata import DeviceMetadata +from kydcap.models.device_metadata_model import DeviceMetadata def setup_init_root_dir_parser(subparsers): parser = subparsers.add_parser("init-device-root", aliases=["idr"]) - parser.add_argument("root_dir", type=pathlib.Path, default=pathlib.Path.cwd()) + parser.add_argument("--root_dir", type=pathlib.Path, default=pathlib.Path.cwd()) group = parser.add_mutually_exclusive_group() - group.add_argument("--dynamic", action="store_false", help="enable guided setup") - group.add_argument("-n", "--name", action="store", required=True, type=str, help="name of device") + group.add_argument("--dynamic", action="store_true", help="enable guided setup", default=False) + group.add_argument("-n", "--name", action="store", type=str, help="name of device") parser.set_defaults(func=handle_idr) def handle_idr(args): + print("Entered kydcap initialize-device-root") root_dir = args.root_dir device_name = None if args.dynamic: diff --git a/code/kydcap/subcommands/sniff.py b/code/kydcap/subcommands/sniff.py index b2446ce..a84600e 100644 --- a/code/kydcap/subcommands/sniff.py +++ b/code/kydcap/subcommands/sniff.py @@ -2,7 +2,7 @@ import subprocess from pathlib import Path from kydcap.config import * -from kydcap.models.device_metadata import DeviceMetadata +from kydcap.models.device_metadata_model import DeviceMetadata def setup_sniff_parser(subparsers): @@ -85,7 +85,18 @@ def handle_sniff(args): pass print('Executing: ' + ' '.join(cmd)) # TODO maybe dump this into file -> put into device metadata - start_time = datetime.now().strftime('%H:%M:%S') - subprocess.run(cmd) - stop_time = datetime.now().strftime('%H:%M:%S') + try: + start_time = datetime.now().strftime('%H:%M:%S') + subprocess.run(cmd) + stop_time = datetime.now().strftime('%H:%M:%S') + except KeyboardInterrupt: + print("Received keyboard interrupt.") + exit(ReturnCodes.ABORTED) + except subprocess.CalledProcessError as e: + print(f"Failed to capture packet: {e}") + exit(ReturnCodes.FAILURE) + except Exception as e: + print(f"Failed to capture packet: {e}") + exit(ReturnCodes.FAILURE) + return ReturnCodes.SUCCESS diff --git a/code/tests/fixtures/__init__.py b/code/tests/fixtures/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/code/tests/fixtures/shared_fixtures.py b/code/tests/fixtures/shared_fixtures.py new file mode 100644 index 0000000..7b714ce --- /dev/null +++ b/code/tests/fixtures/shared_fixtures.py @@ -0,0 +1,15 @@ +import pytest +import tempfile +from pathlib import Path + + +@pytest.fixture(scope='session') +def tmp_dir(): + with tempfile.TemporaryDirectory() as tmp_dir: + yield Path(tmp_dir) + + +@pytest.fixture +def mock_device_metadata_json_(tmp_dir): + with tempfile.TemporaryDirectory() as tmp_dir: + pass diff --git a/code/tests/models/test_capture_metadata_model.py b/code/tests/models/test_capture_metadata_model.py new file mode 100644 index 0000000..e69de29 diff --git a/code/tests/models/test_device_metadata_model.py b/code/tests/models/test_device_metadata_model.py new file mode 100644 index 0000000..e69de29 diff --git a/code/tests/subcommands/test_initialize_device_root_dir.py b/code/tests/subcommands/test_initialize_device_root_dir.py new file mode 100644 index 0000000..e69de29 diff --git a/code/tests/subcommands/test_sniff.py b/code/tests/subcommands/test_sniff.py new file mode 100644 index 0000000..e69de29 diff --git a/code/tests/test_main.py b/code/tests/test_main.py new file mode 100644 index 0000000..e69de29 diff --git a/code/tests/utils/test_capture_metadata_utils.py b/code/tests/utils/test_capture_metadata_utils.py new file mode 100644 index 0000000..26647c8 --- /dev/null +++ b/code/tests/utils/test_capture_metadata_utils.py @@ -0,0 +1,6 @@ +import json +from pathlib import Path +from unittest.mock import mock_open, patch +import pytest + +from kydcap.utils.capture_metadata_utils import set_device_ip_address \ No newline at end of file diff --git a/code/tests/utils/test_device_metadata_utils.py b/code/tests/utils/test_device_metadata_utils.py new file mode 100644 index 0000000..e69de29 diff --git a/code/tests/utils/test_tcpdump_utils.py b/code/tests/utils/test_tcpdump_utils.py new file mode 100644 index 0000000..e69de29