From 090fe58989ae005cefe4051a09cca11e7076a5a3 Mon Sep 17 00:00:00 2001 From: kali Date: Wed, 29 Oct 2025 11:47:38 +0100 Subject: [PATCH] improve errors for playbook parsing --- src/attackmate/playbook_parser.py | 16 +++++++++++++++- src/attackmate/schemas/command_types.py | 10 +++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/attackmate/playbook_parser.py b/src/attackmate/playbook_parser.py index 40a3ba5..c50883e 100644 --- a/src/attackmate/playbook_parser.py +++ b/src/attackmate/playbook_parser.py @@ -136,7 +136,21 @@ def parse_playbook(playbook_file: str, logger: logging.Logger) -> Playbook: except OSError: logger.error(f'Error: Could not open playbook file {target_file}') exit(1) - except ValidationError: + except ValidationError as e: logger.error(f'A Validation error occured when parsing playbook file {playbook_file}') + for error in e.errors(): + if error['type'] == 'missing': + logger.error( + f'Missing field in {error["loc"][-2]} command: {error["loc"][-1]} - {error["msg"]}' + ) + elif error['type'] == 'literal_error': + logger.error( + f'Invalid value in {error["loc"][-2]} command: {error["loc"][-1]} - {error["msg"]}' + ) + elif error['type'] == 'value_error': + logger.error( + f'Value error in command {int(error["loc"][-2]) + 1}: ' + f'{error["loc"][-1]} - {error["msg"]}' + ) logger.error(traceback.format_exc()) exit(1) diff --git a/src/attackmate/schemas/command_types.py b/src/attackmate/schemas/command_types.py index 0e1823c..4a54728 100644 --- a/src/attackmate/schemas/command_types.py +++ b/src/attackmate/schemas/command_types.py @@ -1,14 +1,18 @@ -from typing import List, TypeAlias, Union +from typing import List, Annotated, TypeAlias, Union +from pydantic import Field from attackmate.schemas.command_subtypes import RemotelyExecutableCommand from attackmate.schemas.remote import AttackMateRemoteCommand -Command: TypeAlias = Union[ +Command: TypeAlias = Annotated[ + Union[ RemotelyExecutableCommand, AttackMateRemoteCommand - ] + ], + Field(discriminator='type'), +] Commands: TypeAlias = List[Command]