FetchFromInstance

Execute FetchIncident for a given instance

python · Developer Tools

Source

import re

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


def get_instance_name(args):
    if args.get("instance_name"):
        return args["instance_name"]

    brand_name = args.get("brand_name")
    if brand_name:
        context_modules = demisto.getModules()
        for module_name, module in context_modules.items():
            if module.get("brand") == brand_name and module.get("state") == "active":
                return module_name.replace(" ", "_")

    raise Exception("No instance name was found")


""" MAIN FUNCTION """


def main():
    res = []
    incidents_context = []
    context = {}
    args = demisto.args()
    add_to_context = argToBoolean(args.get("add_to_context"))
    expect_data = argToBoolean(args.get("expect_data"))

    instance_name = get_instance_name(args)
    instance_name = instance_name.replace(" ", "_")
    command = f"!{instance_name}-fetch"

    response = demisto.executeCommand(command, {})

    try:
        if not response and expect_data:
            raise Exception(f"Error occurred while fetching incidents from {instance_name}")

        for inc in response:
            contents = inc.get("Contents", "")
            error_msg_in_incident = demisto.args().get("error_msg_in_incident")
            if error_msg_in_incident and error_msg_in_incident in str(contents):
                return_error(
                    f"Error message '{error_msg_in_incident}' encountered while fetching incidents from"
                    f" {instance_name}: {contents!s}"
                )
            if re.match("invalid character '[a-zA-Z]' looking for beginning of value", str(contents), re.IGNORECASE):
                return_error(f"Error occurred while fetching incidents from {instance_name}: {contents!s}")
            if add_to_context:
                try:
                    for entry in contents:
                        raw_json = ""
                        if isinstance(entry, dict):
                            raw_json = entry.get("rawJSON")  # type: ignore
                        if raw_json:
                            incidents_context.append(json.loads(raw_json))
                except TypeError:
                    return_error("Could not retrieve JSON data from the response contents")

        if not response and not expect_data:
            response = "No data returned"

        context["FetchedIncidents"] = incidents_context
        res.append({"Type": entryTypes["note"], "ContentsFormat": formats["json"], "Contents": response, "EntryContext": context})

    except Exception as ex:
        return_error(ex)

    demisto.results(res)


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