SumoLogicLinkSignalIncidents

Command to link associated Signal Incidents to the Insight Incident.

python · Sumo Logic Cloud SIEM

Source

import traceback
from typing import Any

import demistomock as demisto  # noqa: F401
from CommonServerPython import *  # noqa: F401

""" STANDALONE FUNCTION """


def find_field_from_labels(labels: list, type_name: str) -> Any:
    for entry in labels:
        if entry["type"] == type_name:
            return entry["value"]
    return None


""" COMMAND FUNCTION """


def link_incidents_command(args: dict[str, Any]) -> CommandResults:
    """Find and link the Signal incidents to the current Insight incident.

    :param args
    :return: Result of link action
    :rtype: CommandResults
    """
    result: dict = {}
    demisto.debug(f"Initializing {result=}")

    if "id" not in demisto.args():
        cur_incident = demisto.incident()
    else:
        incident_id = demisto.args()["id"]
        search_raw = demisto.executeCommand("getIncidents", {"query": f"id:{incident_id}"})
        if search_raw[0]["Contents"]["total"] == 0:
            result = {"message": f"Incident ID {incident_id} not found"}
            cur_incident = None
        else:
            cur_incident = search_raw[0]["Contents"]["data"][0]
    if cur_incident is not None and cur_incident["rawType"] != "Sumo Logic Insight":
        result = {"message": "Please run this on a valid Sumo Logic Insight incident only"}
    elif cur_incident is not None:
        linked_signal_ids = []
        signal_sumoids = []

        signals_str = find_field_from_labels(cur_incident.get("labels"), "signals")
        if signals_str is not None:
            signals = safe_load_json(signals_str)
            for signal_obj in signals:
                signal_sumoids.append(signal_obj.get("id"))
        # print('IDs of associated signals on Sumo Logic side:', signal_sumoids)
        query = " or ".join([f"alertid={id}" for id in signal_sumoids])
        search_results = demisto.executeCommand("SearchIncidentsV2", {"query": query})
        if "Contents" in search_results[0]:
            content_raw = search_results[0].get("Contents")
            if content_raw is not None:
                real_search_results = content_raw[0]
                if real_search_results.get("Contents").get("data") is not None:
                    for signal in real_search_results.get("Contents").get("data"):
                        signal_id = signal.get("id")
                        if signal_id is not None:
                            linked_signal_ids.append(signal_id)
            else:
                # print(search_results)
                result = {"message": "Cannot find any Signal Incident to link"}
        # print('Current Incident ID:' + cur_incident.get('id'))
        if len(linked_signal_ids) > 0:
            # print('Found these signal incidents:', linked_signal_ids)
            call_result = demisto.executeCommand(
                "linkIncidents", {"incidentId": cur_incident.get("id"), "linkedIncidentIDs": ",".join(linked_signal_ids)}
            )
            result = {"message": call_result[0]["Contents"]}
        else:
            result = {"message": "Cannot find any Signal Incident to link"}

    return CommandResults(
        outputs_prefix="BaseScript",
        outputs_key_field="",
        outputs=result,
    )


""" MAIN FUNCTION """


def main():
    try:
        return_results(link_incidents_command(demisto.args()))
    except Exception as ex:
        demisto.error(traceback.format_exc())  # print the traceback
        return_error(f"Failed to execute SumoLogicLinkSignalIncidents. Error: {ex!s}")


""" ENTRY POINT """


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