SetIndicatorAgentix
Updates the properties of an existing indicator and associates the indicator with related issues if they exist.
python · Common Scripts
Source
import demistomock as demisto from CommonServerPython import * from CommonServerUserPython import * def set_indicator_if_exist(args: dict): """ Sets an indicator in the system only if it already exists. Args: args (dict): Args of the script. Returns: str: The result of setting the indicator or an error message. """ # Check if indicator exists indicator_value = args.get("value") if not any(key in args for key in ["type", "verdict", "tags", "related_issues"]): outputs = { "Value": indicator_value, "Result": "Please provide at least one argument to update: type, verdict, tags, or related_issues.", } return CommandResults(outputs=outputs, outputs_key_field="Value", outputs_prefix="SetIndicator") demisto.debug(f"Checking if {indicator_value} exists by running findIndicators.") exists = execute_command("findIndicators", {"value": indicator_value}) if not exists: outputs = {"Value": indicator_value, "Result": "Indicator does not exist."} return CommandResults(outputs=outputs, outputs_key_field="Value", outputs_prefix="SetIndicator") success_results = "" error_result = "" related_issues = argToList(args.pop("related_issues", "")) # Set indicator with provided properties if any(key in args for key in ["type", "verdict", "tags"]): demisto.debug("running setIndicator command.") execute_command("setIndicator", args) success_results += "Successfully set indicator properties.\n" # Associate the indicator to the provided related issues and alert if don't exist. if related_issues: raw_issues_found = execute_command("core-get-issues", {"issue_id": related_issues}) if not isinstance(raw_issues_found, list) or not raw_issues_found: issues_found: list[dict] = [] else: # Structure: [[issue_dict1, issue_dict2, ...], {'filtered_count': int, 'returned_count': int}] first = raw_issues_found[0] issues_found = first if isinstance(first, list) else [] existing_issues_ids = [] for existing_issue in issues_found: demisto.debug(f"Processing issue: {existing_issue}.") issue_id = existing_issue.get("internal_id") if issue_id: existing_issues_ids.append(issue_id) demisto.debug(f"Found the following issues: {existing_issues_ids}.") existing_set = set(existing_issues_ids) related_issues = set(related_issues) diff_issues = related_issues - existing_set demisto.debug(f"The following issues were provided as related issues but don't exist: {diff_issues}.") if diff_issues: error_result = f"The following issues were provided as related issues but don't exist: {diff_issues}." issues_associated = [] for issue in existing_issues_ids: demisto.debug(f"running associateIndicatorsToIssue command with issue id {issue}.") execute_command( "associateIndicatorsToAlert", {"issueId": issue, "indicatorsValues": indicator_value}, ) issues_associated.append(issue) if issues_associated: success_results += f"Successfully associated indicator to the following issues {issues_associated}. " final_outputs = success_results + error_result outputs = {"Value": indicator_value, "Result": final_outputs} final_results = [] if success_results: final_results.append( CommandResults( readable_output=success_results, outputs=outputs, outputs_key_field="Value", outputs_prefix="SetIndicator", ) ) if error_result: final_results.append(CommandResults(readable_output=error_result, entry_type=4)) return final_results def main(): try: return_results(set_indicator_if_exist(demisto.args())) except Exception as ex: return_error(f"Failed to execute SetIndicator. Error: {str(ex)}") if __name__ in ("__main__", "__builtin__", "builtins"): # pragma: no cover main()