VectraRUXSyncDetectionSummary

Sync the detection summary from the Vectra platform.

python · Vectra RUX

Source

import demistomock as demisto  # noqa: F401
from CommonServerPython import *  # noqa: F401
from typing import Any
import traceback

MIRRORING_TAG = "Trigger-XSOAR-Mirroring"


# HELPER FUNCTIONS


def handle_error(command_results: list[dict[str, Any]]) -> None:
    """
    Handle the error entries after executing the commands.

    Args:
        command_results (List[Dict[str, Any]]): Command results object.
    Returns:
        Union[None, str]: Returns a string if there is an error, otherwise None.
    """
    if isError(command_results):
        return return_error(command_results[0]["Contents"])
    return None


def map_and_update_detection(data: dict[str, Any], mapper: str, mapper_type: str) -> CommandResults:
    """
    Perform dictionary mapping using pre-configured mappers and update the detection accordingly.

    Args:
        data: Data to map with the mapper.
        mapper: Mapper name to use for mapping data.
        mapper_type: Type of mapping to use in specified mapper(incident type).
    Returns:
        CommandResults: An object containing a human-readable message indicating successful synchronization.
    """
    # Map data to pre-configured mapper.
    mapped_data = demisto.mapObject(data, mapper, mapper_type)
    # Create a new dictionary to store the updated mapped data.
    updated_mapped_data = {"details": data.get("details")}

    for key, value in mapped_data.items():
        if "Process Context" in key:
            # Remove whitespace and convert the key to lowercase to use as a dictionary key.
            new_key = "".join(key.lower().split())
            updated_mapped_data[new_key] = value
    # If there are fields to update, call the 'setIncident' command to update the incident with the latest data.
    demisto.executeCommand("setIncident", updated_mapped_data)
    return CommandResults(readable_output="Detection has been synchronized successfully with EDR process context and summary.")


""" MAIN FUNCTION """


def main():
    try:
        detection_id = demisto.incident().get("CustomFields", {}).get("vectraruxdetectionid")
        command_args = {"detection_ids": detection_id}
        command_result = demisto.executeCommand("vectra-detection-describe", command_args)
        handle_error(command_result)

        tag_command_args = {"detection_id": detection_id}
        tag_list_command_result = demisto.executeCommand("vectra-detection-tag-list", tag_command_args)
        handle_error(tag_list_command_result)

        existing_tags = tag_list_command_result[0].get("Contents", {}).get("tags", [])
        if isinstance(existing_tags, list):
            existing_tags = [t.strip() for t in existing_tags if isinstance(t, str)]
        else:
            existing_tags = []

        if MIRRORING_TAG in existing_tags:
            tag_remove_result = demisto.executeCommand(
                "vectra-detection-tag-remove", {"detection_id": detection_id, "tags": MIRRORING_TAG}
            )
            handle_error(tag_remove_result)

        tag_add_result = demisto.executeCommand("vectra-detection-tag-add", {"detection_id": detection_id, "tags": MIRRORING_TAG})
        handle_error(tag_add_result)

        # Handle command error if there is any
        result = command_result[0].get("Contents", {})
        if isinstance(result, dict):
            detection = result.get("results", [])
            if detection:
                summary = detection[0].get("summary", {})
                process_context_data = detection[0].get("process_context_data", {})
            else:
                summary = {}
                process_context_data = {}
        else:
            summary = {}
            process_context_data = {}
        # Prepare entity json
        data = {"details": summary, "process_context_data": process_context_data}
        result = map_and_update_detection(data, "Vectra RUX - Incoming Mapper", "Vectra RUX Events Detection")
        return_results(result)
    except Exception as ex:
        demisto.error(traceback.format_exc())  # print the traceback
        return_error(f"Failed to execute VectraRUXSyncDetectionSummary. Error: {str(ex)}")


""" ENTRY POINT """

if __name__ in ("__main__", "__builtin__", "builtins"):
    main()

README

Sync the detection summary from the Vectra platform.

Script Data


Name Description
Script Type python3
Tags incident-action-button
Cortex XSOAR Version 6.10.0

Inputs


There are no inputs for this script.

Outputs


There are no outputs for this script.