From 2bd2235497c93b793a441cfb620404efc1d23f71 Mon Sep 17 00:00:00 2001 From: Menachem Weinfeld Date: Sun, 2 Jul 2023 21:27:34 +0300 Subject: [PATCH 1/6] Add new input - instance_name --- .../playbook-Delete_Custom_Content.yml | 9 ++ .../Scripts/DeleteContent/DeleteContent.py | 136 ++++++++++++------ 2 files changed, 100 insertions(+), 45 deletions(-) diff --git a/Packs/ContentManagement/Playbooks/playbook-Delete_Custom_Content.yml b/Packs/ContentManagement/Playbooks/playbook-Delete_Custom_Content.yml index 9a43feb8e902..c2818f8c9010 100644 --- a/Packs/ContentManagement/Playbooks/playbook-Delete_Custom_Content.yml +++ b/Packs/ContentManagement/Playbooks/playbook-Delete_Custom_Content.yml @@ -55,6 +55,8 @@ tasks: scriptarguments: uri: simple: /content/bundle + using: + simple: ${inputs.instance_name} separatecontext: false continueonerrortype: "" view: |- @@ -127,6 +129,8 @@ tasks: simple: ${inputs.dry_run} include_ids_dict: simple: ${GetIdsFromCustomContent.included_ids} + using: + simple: ${inputs.instance_name} separatecontext: false continueonerrortype: "" view: |- @@ -400,6 +404,11 @@ inputs: required: true description: If true, will not actually delete any content entities. playbookInputQuery: +- key: instance_name + value: {} + required: false + description: Core REST API instance name to use. + playbookInputQuery: outputs: [] tests: - No tests (auto formatted) diff --git a/Packs/ContentManagement/Scripts/DeleteContent/DeleteContent.py b/Packs/ContentManagement/Scripts/DeleteContent/DeleteContent.py index e94af6c57dfc..8fab83e295da 100644 --- a/Packs/ContentManagement/Scripts/DeleteContent/DeleteContent.py +++ b/Packs/ContentManagement/Scripts/DeleteContent/DeleteContent.py @@ -9,6 +9,7 @@ SCRIPT_NAME = 'DeleteContent' CORE_PACKS_LIST_URL = "https://raw.githubusercontent.com/demisto/content/master/Tests/Marketplace/core_packs_list.json" +INSTANCE_NAME = demisto.args().get('using') def verify_search_response_in_list(response: Any, id: str) -> str: @@ -73,19 +74,22 @@ class PlaybookAPI(EntityAPI): def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': f'/playbook/{specific_id}'}, + {'uri': f'/playbook/{specific_id}', + 'using': INSTANCE_NAME}, fail_on_error=False) def search_all(self) -> Tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/playbook/search', - 'body': {'page': 0, 'size': 100}}, + 'body': {'page': 0, 'size': 100}, + 'using': INSTANCE_NAME}, fail_on_error=False) def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/playbook/delete', - 'body': {'id': specific_id}}, + 'body': {'id': specific_id}, + 'using': INSTANCE_NAME}, fail_on_error=False) def verify_specific_search_response(self, response: dict | str, id: str) -> str: @@ -104,19 +108,22 @@ class IntegrationAPI(EntityAPI): def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/settings/integration/search', - 'body': {'page': 0, 'size': 100, 'query': f'name:"{specific_id}"'}}, + 'body': {'page': 0, 'size': 100, 'query': f'name:"{specific_id}"'}, + 'using': INSTANCE_NAME}, fail_on_error=False) def search_all(self) -> Tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/settings/integration/search', - 'body': {'page': 0, 'size': 100}}, + 'body': {'page': 0, 'size': 100}, + 'using': INSTANCE_NAME}, fail_on_error=False) def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/settings/integration-conf/delete', - 'body': {'id': specific_id}}, + 'body': {'id': specific_id}, + 'using': INSTANCE_NAME}, fail_on_error=False) def verify_specific_search_response(self, response: dict | str | list, id: str) -> str: @@ -139,19 +146,22 @@ class ScriptAPI(EntityAPI): def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/automation/search', - 'body': {'page': 0, 'size': 1, 'query': f'id:"{specific_id}"'}}, + 'body': {'page': 0, 'size': 1, 'query': f'id:"{specific_id}"'}, + 'using': INSTANCE_NAME}, fail_on_error=False) def search_all(self) -> Tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/automation/search', - 'body': {'page': 0, 'size': 100}}, + 'body': {'page': 0, 'size': 100}, + 'using': INSTANCE_NAME}, fail_on_error=False) def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/automation/delete', - 'body': {'script': {'id': specific_id}}}, + 'body': {'script': {'id': specific_id}}, + 'using': INSTANCE_NAME}, fail_on_error=False) def verify_specific_search_response(self, response: dict | str | list, id: str) -> str: @@ -171,17 +181,20 @@ class IncidentFieldAPI(EntityAPI): def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': '/incidentfields'}, + {'uri': '/incidentfields', + 'using': INSTANCE_NAME}, fail_on_error=False) def search_all(self) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': '/incidentfields'}, + {'uri': '/incidentfields', + 'using': INSTANCE_NAME}, fail_on_error=False) def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-delete', - {'uri': f'/incidentfield/{specific_id}'}, + {'uri': f'/incidentfield/{specific_id}', + 'using': INSTANCE_NAME}, fail_on_error=False) def verify_specific_search_response(self, response: dict | str, id: str) -> str: @@ -196,17 +209,20 @@ class PreProcessingRuleAPI(EntityAPI): def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': '/preprocess/rules'}, + {'uri': '/preprocess/rules', + 'using': INSTANCE_NAME}, fail_on_error=False) def search_all(self) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': '/preprocess/rules'}, + {'uri': '/preprocess/rules', + 'using': INSTANCE_NAME}, fail_on_error=False) def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-delete', - {'uri': f'/preprocess/rule/{specific_id}'}, + {'uri': f'/preprocess/rule/{specific_id}', + 'using': INSTANCE_NAME}, fail_on_error=False) def verify_specific_search_response(self, response: dict | str | list, id: str) -> str: @@ -221,17 +237,20 @@ class WidgetAPI(EntityAPI): def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': f'/widgets/{specific_id}'}, + {'uri': f'/widgets/{specific_id}', + 'using': INSTANCE_NAME}, fail_on_error=False) def search_all(self) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': '/widgets'}, + {'uri': '/widgets', + 'using': INSTANCE_NAME}, fail_on_error=False) def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-delete', - {'uri': f'/widgets/{specific_id}'}, + {'uri': f'/widgets/{specific_id}', + 'using': INSTANCE_NAME}, fail_on_error=False) def verify_specific_search_response(self, response: dict | str, id: str) -> str: @@ -251,17 +270,20 @@ class DashboardAPI(EntityAPI): def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': f'/dashboards/{specific_id}'}, + {'uri': f'/dashboards/{specific_id}', + 'using': INSTANCE_NAME}, fail_on_error=False) def search_all(self) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': '/dashboards'}, + {'uri': '/dashboards', + 'using': INSTANCE_NAME}, fail_on_error=False) def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-delete', - {'uri': f'/dashboards/{specific_id}'}, + {'uri': f'/dashboards/{specific_id}', + 'using': INSTANCE_NAME}, fail_on_error=False) def verify_specific_search_response(self, response: dict | str, id: str) -> str: @@ -281,17 +303,20 @@ class ReportAPI(EntityAPI): def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': f'/reports/{specific_id}'}, + {'uri': f'/reports/{specific_id}', + 'using': INSTANCE_NAME}, fail_on_error=False) def search_all(self) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': '/reports'}, + {'uri': '/reports', + 'using': INSTANCE_NAME}, fail_on_error=False) def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-delete', - {'uri': f'/report/{specific_id}'}, + {'uri': f'/report/{specific_id}', + 'using': INSTANCE_NAME}, fail_on_error=False) def verify_specific_search_response(self, response: dict | str, id: str) -> str: @@ -306,18 +331,21 @@ class IncidentTypeAPI(EntityAPI): def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': '/incidenttypes/export'}, + {'uri': '/incidenttypes/export', + 'using': INSTANCE_NAME}, fail_on_error=False) def search_all(self) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': '/incidenttypes/export'}, + {'uri': '/incidenttypes/export', + 'using': INSTANCE_NAME}, fail_on_error=False) def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/incidenttype/delete', - 'body': {'id': specific_id}}, + 'body': {'id': specific_id}, + 'using': INSTANCE_NAME}, fail_on_error=False) def verify_specific_search_response(self, response: dict | str | list, id: str) -> str: @@ -332,18 +360,21 @@ class ClassifierAPI(EntityAPI): def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': f'/classifier/{specific_id}'}, + {'uri': f'/classifier/{specific_id}', + 'using': INSTANCE_NAME}, fail_on_error=False) def search_all(self) -> Tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/classifier/search', - 'body': {'page': 0, 'size': 100}}, + 'body': {'page': 0, 'size': 100}, + 'using': INSTANCE_NAME}, fail_on_error=False) def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-delete', - {'uri': f'/classifier/{specific_id}'}, + {'uri': f'/classifier/{specific_id}', + 'using': INSTANCE_NAME}, fail_on_error=False) def verify_specific_search_response(self, response: dict | str | list, id: str) -> str: @@ -366,17 +397,20 @@ class ReputationAPI(EntityAPI): def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': '/reputation/export'}, + {'uri': '/reputation/export', + 'using': INSTANCE_NAME}, fail_on_error=False) def search_all(self) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': '/reputation/export'}, + {'uri': '/reputation/export', + 'using': INSTANCE_NAME}, fail_on_error=False) def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-delete', - {'uri': f'/reputation/{specific_id}'}, + {'uri': f'/reputation/{specific_id}', + 'using': INSTANCE_NAME}, fail_on_error=False) def verify_specific_search_response(self, response: dict | str | list, id: str) -> str: @@ -391,18 +425,21 @@ class LayoutAPI(EntityAPI): def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': f'/layout/{specific_id}'}, + {'uri': f'/layout/{specific_id}', + 'using': INSTANCE_NAME}, fail_on_error=False) def search_all(self) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': '/layouts'}, + {'uri': '/layouts', + 'using': INSTANCE_NAME}, fail_on_error=False) def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': f'/layout/{specific_id}/remove', - 'body': {}}, + 'body': {}, + 'using': INSTANCE_NAME}, fail_on_error=False) def verify_specific_search_response(self, response: dict | str | list, id: str) -> str: @@ -418,18 +455,21 @@ class JobAPI(EntityAPI): def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/jobs/search', - 'body': {'page': 0, 'size': 1, 'query': f'name:"{specific_id}"'}}, + 'body': {'page': 0, 'size': 1, 'query': f'name:"{specific_id}"'}, + 'using': INSTANCE_NAME}, fail_on_error=False) def search_all(self) -> Tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/jobs/search', - 'body': {'page': 0, 'size': 100}}, + 'body': {'page': 0, 'size': 100}, + 'using': INSTANCE_NAME}, fail_on_error=False) def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-delete', - {'uri': f'jobs/{specific_id}'}, + {'uri': f'jobs/{specific_id}', + 'using': INSTANCE_NAME}, fail_on_error=False) def verify_specific_search_response(self, response: dict | str, id: str) -> str: @@ -456,18 +496,21 @@ class ListAPI(EntityAPI): def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': f'/lists/download/{specific_id}'}, + {'uri': f'/lists/download/{specific_id}', + 'using': INSTANCE_NAME}, fail_on_error=False) def search_all(self) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': '/lists/names'}, + {'uri': '/lists/names', + 'using': INSTANCE_NAME}, fail_on_error=False) def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/lists/delete', - 'body': {'id': specific_id}}, + 'body': {'id': specific_id}, + 'using': INSTANCE_NAME}, fail_on_error=False) def verify_specific_search_response(self, response: Union[dict, str], id: str) -> str: @@ -492,17 +535,20 @@ def __init__(self, proxy_skip=True, verify=True): def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': f'/contentpacks/installed/{specific_id}'}, + {'uri': f'/contentpacks/installed/{specific_id}', + 'using': INSTANCE_NAME}, fail_on_error=False) def search_all(self) -> Tuple[bool, dict | str]: return execute_command('demisto-api-get', - {'uri': '/contentpacks/installed-expired'}, + {'uri': '/contentpacks/installed-expired', + 'using': INSTANCE_NAME}, fail_on_error=False) def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: return execute_command('demisto-api-delete', - {'uri': f'/contentpacks/installed/{specific_id}'}, + {'uri': f'/contentpacks/installed/{specific_id}', + 'using': INSTANCE_NAME}, fail_on_error=False) def verify_specific_search_response(self, response: Union[dict, str], id: str) -> str: From 77ea60ed38c0e28ce2278395ae2d109c6b2df8e6 Mon Sep 17 00:00:00 2001 From: Menachem Weinfeld Date: Sun, 2 Jul 2023 21:31:17 +0300 Subject: [PATCH 2/6] pre-commit --- .../Scripts/DeleteContent/DeleteContent.py | 118 +++++++++--------- 1 file changed, 56 insertions(+), 62 deletions(-) diff --git a/Packs/ContentManagement/Scripts/DeleteContent/DeleteContent.py b/Packs/ContentManagement/Scripts/DeleteContent/DeleteContent.py index 8fab83e295da..da2bc1e772b7 100644 --- a/Packs/ContentManagement/Scripts/DeleteContent/DeleteContent.py +++ b/Packs/ContentManagement/Scripts/DeleteContent/DeleteContent.py @@ -2,7 +2,6 @@ from CommonServerPython import * from abc import ABC, abstractmethod -from typing import Tuple import requests import json @@ -46,15 +45,15 @@ class EntityAPI(ABC): name = '' @abstractmethod - def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def search_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: pass @abstractmethod - def search_all(self) -> Tuple[bool, dict | str]: + def search_all(self) -> tuple[bool, dict | str]: pass @abstractmethod - def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def delete_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: pass @abstractmethod @@ -72,20 +71,20 @@ def parse_all_entities_response(self, response) -> list: class PlaybookAPI(EntityAPI): name = 'playbook' - def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def search_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': f'/playbook/{specific_id}', 'using': INSTANCE_NAME}, fail_on_error=False) - def search_all(self) -> Tuple[bool, dict | str]: + def search_all(self) -> tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/playbook/search', 'body': {'page': 0, 'size': 100}, 'using': INSTANCE_NAME}, fail_on_error=False) - def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def delete_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/playbook/delete', 'body': {'id': specific_id}, @@ -105,21 +104,21 @@ def parse_all_entities_response(self, response: dict | str | list) -> list: class IntegrationAPI(EntityAPI): name = 'integration' - def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def search_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/settings/integration/search', 'body': {'page': 0, 'size': 100, 'query': f'name:"{specific_id}"'}, 'using': INSTANCE_NAME}, fail_on_error=False) - def search_all(self) -> Tuple[bool, dict | str]: + def search_all(self) -> tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/settings/integration/search', 'body': {'page': 0, 'size': 100}, 'using': INSTANCE_NAME}, fail_on_error=False) - def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def delete_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/settings/integration-conf/delete', 'body': {'id': specific_id}, @@ -143,21 +142,21 @@ class ScriptAPI(EntityAPI): name = 'script' always_excluded = ['CommonServerUserPowerShell', 'CommonServerUserPython', 'CommonUserServer', SCRIPT_NAME] - def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def search_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/automation/search', 'body': {'page': 0, 'size': 1, 'query': f'id:"{specific_id}"'}, 'using': INSTANCE_NAME}, fail_on_error=False) - def search_all(self) -> Tuple[bool, dict | str]: + def search_all(self) -> tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/automation/search', 'body': {'page': 0, 'size': 100}, 'using': INSTANCE_NAME}, fail_on_error=False) - def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def delete_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/automation/delete', 'body': {'script': {'id': specific_id}}, @@ -179,19 +178,19 @@ def parse_all_entities_response(self, response: dict | str | list) -> list: class IncidentFieldAPI(EntityAPI): name = 'incidentfield' - def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def search_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': '/incidentfields', 'using': INSTANCE_NAME}, fail_on_error=False) - def search_all(self) -> Tuple[bool, dict | str]: + def search_all(self) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': '/incidentfields', 'using': INSTANCE_NAME}, fail_on_error=False) - def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def delete_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-delete', {'uri': f'/incidentfield/{specific_id}', 'using': INSTANCE_NAME}, @@ -207,19 +206,19 @@ def get_name_by_id(self, response: dict | str, id: str) -> str: class PreProcessingRuleAPI(EntityAPI): name = 'pre-process-rule' - def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def search_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': '/preprocess/rules', 'using': INSTANCE_NAME}, fail_on_error=False) - def search_all(self) -> Tuple[bool, dict | str]: + def search_all(self) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': '/preprocess/rules', 'using': INSTANCE_NAME}, fail_on_error=False) - def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def delete_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-delete', {'uri': f'/preprocess/rule/{specific_id}', 'using': INSTANCE_NAME}, @@ -235,19 +234,19 @@ def get_name_by_id(self, response: dict | str | list, id: str) -> str: class WidgetAPI(EntityAPI): name = 'widget' - def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def search_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': f'/widgets/{specific_id}', 'using': INSTANCE_NAME}, fail_on_error=False) - def search_all(self) -> Tuple[bool, dict | str]: + def search_all(self) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': '/widgets', 'using': INSTANCE_NAME}, fail_on_error=False) - def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def delete_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-delete', {'uri': f'/widgets/{specific_id}', 'using': INSTANCE_NAME}, @@ -268,19 +267,19 @@ def parse_all_entities_response(self, response: dict | str | list) -> list: class DashboardAPI(EntityAPI): name = 'dashboard' - def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def search_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': f'/dashboards/{specific_id}', 'using': INSTANCE_NAME}, fail_on_error=False) - def search_all(self) -> Tuple[bool, dict | str]: + def search_all(self) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': '/dashboards', 'using': INSTANCE_NAME}, fail_on_error=False) - def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def delete_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-delete', {'uri': f'/dashboards/{specific_id}', 'using': INSTANCE_NAME}, @@ -301,19 +300,19 @@ def parse_all_entities_response(self, response: dict | str | list) -> list: class ReportAPI(EntityAPI): name = 'report' - def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def search_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': f'/reports/{specific_id}', 'using': INSTANCE_NAME}, fail_on_error=False) - def search_all(self) -> Tuple[bool, dict | str]: + def search_all(self) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': '/reports', 'using': INSTANCE_NAME}, fail_on_error=False) - def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def delete_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-delete', {'uri': f'/report/{specific_id}', 'using': INSTANCE_NAME}, @@ -329,19 +328,19 @@ def get_name_by_id(self, response: dict | str, id: str) -> str: class IncidentTypeAPI(EntityAPI): name = 'incidenttype' - def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def search_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': '/incidenttypes/export', 'using': INSTANCE_NAME}, fail_on_error=False) - def search_all(self) -> Tuple[bool, dict | str]: + def search_all(self) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': '/incidenttypes/export', 'using': INSTANCE_NAME}, fail_on_error=False) - def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def delete_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/incidenttype/delete', 'body': {'id': specific_id}, @@ -358,20 +357,20 @@ def get_name_by_id(self, response: dict | str | list, id: str) -> str: class ClassifierAPI(EntityAPI): name = 'classifier' - def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def search_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': f'/classifier/{specific_id}', 'using': INSTANCE_NAME}, fail_on_error=False) - def search_all(self) -> Tuple[bool, dict | str]: + def search_all(self) -> tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/classifier/search', 'body': {'page': 0, 'size': 100}, 'using': INSTANCE_NAME}, fail_on_error=False) - def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def delete_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-delete', {'uri': f'/classifier/{specific_id}', 'using': INSTANCE_NAME}, @@ -395,19 +394,19 @@ class MapperAPI(ClassifierAPI): class ReputationAPI(EntityAPI): name = 'reputation' - def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def search_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': '/reputation/export', 'using': INSTANCE_NAME}, fail_on_error=False) - def search_all(self) -> Tuple[bool, dict | str]: + def search_all(self) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': '/reputation/export', 'using': INSTANCE_NAME}, fail_on_error=False) - def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def delete_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-delete', {'uri': f'/reputation/{specific_id}', 'using': INSTANCE_NAME}, @@ -423,19 +422,19 @@ def get_name_by_id(self, response: dict | str | list, id: str) -> str: class LayoutAPI(EntityAPI): name = 'layoutscontainer' - def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def search_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': f'/layout/{specific_id}', 'using': INSTANCE_NAME}, fail_on_error=False) - def search_all(self) -> Tuple[bool, dict | str]: + def search_all(self) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': '/layouts', 'using': INSTANCE_NAME}, fail_on_error=False) - def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def delete_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': f'/layout/{specific_id}/remove', 'body': {}, @@ -452,21 +451,21 @@ def get_name_by_id(self, response: dict | str | list, id: str) -> str: class JobAPI(EntityAPI): name = 'job' - def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def search_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/jobs/search', 'body': {'page': 0, 'size': 1, 'query': f'name:"{specific_id}"'}, 'using': INSTANCE_NAME}, fail_on_error=False) - def search_all(self) -> Tuple[bool, dict | str]: + def search_all(self) -> tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/jobs/search', 'body': {'page': 0, 'size': 100}, 'using': INSTANCE_NAME}, fail_on_error=False) - def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def delete_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-delete', {'uri': f'jobs/{specific_id}', 'using': INSTANCE_NAME}, @@ -474,17 +473,15 @@ def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: def verify_specific_search_response(self, response: dict | str, id: str) -> str: job_params = {} - if isinstance(response, dict): - if search_results := response.get('data'): - job_params = search_results[0] + if isinstance(response, dict) and (search_results := response.get('data')): + job_params = search_results[0] return job_params.get("id", '') if job_params and job_params.get("id") else '' def get_name_by_id(self, response: dict | str, id: str) -> str: job_params = {} - if isinstance(response, dict): - if search_results := response.get('data'): - job_params = search_results[0] + if isinstance(response, dict) and (search_results := response.get('data')): + job_params = search_results[0] return get_the_name_of_specific_id(job_params, id) def parse_all_entities_response(self, response: dict | str | list) -> list: @@ -494,19 +491,19 @@ def parse_all_entities_response(self, response: dict | str | list) -> list: class ListAPI(EntityAPI): name = 'list' - def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def search_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': f'/lists/download/{specific_id}', 'using': INSTANCE_NAME}, fail_on_error=False) - def search_all(self) -> Tuple[bool, dict | str]: + def search_all(self) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': '/lists/names', 'using': INSTANCE_NAME}, fail_on_error=False) - def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def delete_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-post', {'uri': '/lists/delete', 'body': {'id': specific_id}, @@ -533,19 +530,19 @@ def __init__(self, proxy_skip=True, verify=True): core_packs_response = requests.get(CORE_PACKS_LIST_URL, verify=verify) self.always_excluded = json.loads(core_packs_response.text).get("core_packs_list") + self.always_excluded - def search_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def search_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': f'/contentpacks/installed/{specific_id}', 'using': INSTANCE_NAME}, fail_on_error=False) - def search_all(self) -> Tuple[bool, dict | str]: + def search_all(self) -> tuple[bool, dict | str]: return execute_command('demisto-api-get', {'uri': '/contentpacks/installed-expired', 'using': INSTANCE_NAME}, fail_on_error=False) - def delete_specific_id(self, specific_id: str) -> Tuple[bool, dict | str]: + def delete_specific_id(self, specific_id: str) -> tuple[bool, dict | str]: return execute_command('demisto-api-delete', {'uri': f'/contentpacks/installed/{specific_id}', 'using': INSTANCE_NAME}, @@ -558,7 +555,7 @@ def get_name_by_id(self, response: dict | str, id: str) -> str: return get_the_name_of_specific_id(response, id) -def search_and_delete_existing_entity(id: str, entity_api: EntityAPI, dry_run: bool = True) -> Tuple[bool, str]: +def search_and_delete_existing_entity(id: str, entity_api: EntityAPI, dry_run: bool = True) -> tuple[bool, str]: """Searches the machine for previously configured entity_types with the given id. Args: @@ -614,7 +611,7 @@ def search_for_all_entities(entity_api: EntityAPI) -> list: def get_and_delete_entities(entity_api: EntityAPI, excluded_ids: list = [], included_ids: list = [], dry_run: bool = True - ) -> Tuple[list[dict], list[dict], list]: + ) -> tuple[list[dict], list[dict], list]: """Search and delete entities with provided EntityAPI. Args: @@ -680,10 +677,7 @@ def get_deletion_status(excluded: list, included: list, deleted: list, undeleted if undeleted_ids == excluded: return True else: - for excluded_id in excluded: - if excluded_id in deleted_ids: - return False - return True + return all(excluded_id not in deleted_ids for excluded_id in excluded) elif included: if set(deleted_ids) == set(included): @@ -697,7 +691,7 @@ def get_deletion_status(excluded: list, included: list, deleted: list, undeleted def handle_content_entity(entity_api: EntityAPI, included_ids_dict: Optional[dict], excluded_ids_dict: Optional[dict], - dry_run: bool) -> Tuple[bool, dict, dict]: + dry_run: bool) -> tuple[bool, dict, dict]: excluded_ids = excluded_ids_dict.get(entity_api.name, []) if excluded_ids_dict else [] included_ids = included_ids_dict.get(entity_api.name, []) if included_ids_dict else [] From 8a8d08d8a51cc1c99773465ac9230facbfad30aa Mon Sep 17 00:00:00 2001 From: Menachem Weinfeld Date: Sun, 2 Jul 2023 21:45:41 +0300 Subject: [PATCH 3/6] Update RN and Docker image --- .../playbook-Delete_Custom_Content_README.md | 1 + Packs/ContentManagement/ReleaseNotes/1_2_10.md | 13 +++++++++++++ .../Scripts/DeleteContent/DeleteContent.yml | 2 +- Packs/ContentManagement/pack_metadata.json | 2 +- 4 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 Packs/ContentManagement/ReleaseNotes/1_2_10.md diff --git a/Packs/ContentManagement/Playbooks/playbook-Delete_Custom_Content_README.md b/Packs/ContentManagement/Playbooks/playbook-Delete_Custom_Content_README.md index fc8424ab15cd..4038023ffd9a 100644 --- a/Packs/ContentManagement/Playbooks/playbook-Delete_Custom_Content_README.md +++ b/Packs/ContentManagement/Playbooks/playbook-Delete_Custom_Content_README.md @@ -31,6 +31,7 @@ core-api-download | **Name** | **Description** | **Default Value** | **Required** | | --- | --- | --- | --- | | dry_run | If true, will not actually delete any content entities. | true | Required | +| instance_name | Core REST API instance name to use. | | Optional | ## Playbook Outputs diff --git a/Packs/ContentManagement/ReleaseNotes/1_2_10.md b/Packs/ContentManagement/ReleaseNotes/1_2_10.md new file mode 100644 index 000000000000..4b8f86a055ad --- /dev/null +++ b/Packs/ContentManagement/ReleaseNotes/1_2_10.md @@ -0,0 +1,13 @@ + +#### Playbooks + +##### Delete Custom Content + +- Added new inputs `instance_name` - the Core REST API instance name to use. + +#### Scripts + +##### DeleteContent +- Updated the Docker image to: *demisto/python3:3.10.12.63474*. + +- Added the option to specify `Core REST API` instance to use by setting the **using** value when running the script. diff --git a/Packs/ContentManagement/Scripts/DeleteContent/DeleteContent.yml b/Packs/ContentManagement/Scripts/DeleteContent/DeleteContent.yml index e5c73d05fd05..5ab1172ce112 100644 --- a/Packs/ContentManagement/Scripts/DeleteContent/DeleteContent.yml +++ b/Packs/ContentManagement/Scripts/DeleteContent/DeleteContent.yml @@ -66,7 +66,7 @@ tags: timeout: 3600 type: python subtype: python3 -dockerimage: demisto/python3:3.10.12.62631 +dockerimage: demisto/python3:3.10.12.63474 tests: - No tests (auto formatted) fromversion: 6.0.0 diff --git a/Packs/ContentManagement/pack_metadata.json b/Packs/ContentManagement/pack_metadata.json index 78cba52a0a33..72fd59602006 100644 --- a/Packs/ContentManagement/pack_metadata.json +++ b/Packs/ContentManagement/pack_metadata.json @@ -2,7 +2,7 @@ "name": "XSOAR CI/CD", "description": "This pack enables you to orchestrate your XSOAR system configuration.", "support": "xsoar", - "currentVersion": "1.2.9", + "currentVersion": "1.2.10", "author": "Cortex XSOAR", "url": "https://www.paloaltonetworks.com/cortex", "email": "", From c5b3aa79565abb72ae0d469dd47207c069f564f3 Mon Sep 17 00:00:00 2001 From: Menachem Weinfeld Date: Mon, 3 Jul 2023 00:09:21 +0300 Subject: [PATCH 4/6] Fix the input using --- .../Playbooks/playbook-Delete_Custom_Content.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Packs/ContentManagement/Playbooks/playbook-Delete_Custom_Content.yml b/Packs/ContentManagement/Playbooks/playbook-Delete_Custom_Content.yml index c2818f8c9010..ada6f9046214 100644 --- a/Packs/ContentManagement/Playbooks/playbook-Delete_Custom_Content.yml +++ b/Packs/ContentManagement/Playbooks/playbook-Delete_Custom_Content.yml @@ -56,7 +56,8 @@ tasks: uri: simple: /content/bundle using: - simple: ${inputs.instance_name} + complex: + root: inputs.instance_name separatecontext: false continueonerrortype: "" view: |- @@ -130,7 +131,8 @@ tasks: include_ids_dict: simple: ${GetIdsFromCustomContent.included_ids} using: - simple: ${inputs.instance_name} + complex: + root: inputs.instance_name separatecontext: false continueonerrortype: "" view: |- From 592edeefabaf73b475a65fd3187aec61c8afa418 Mon Sep 17 00:00:00 2001 From: Menachem Weinfeld Date: Mon, 3 Jul 2023 10:11:00 +0300 Subject: [PATCH 5/6] Add pack ignore PB106 --- Packs/ContentManagement/.pack-ignore | 2 +- Packs/ContentManagement/ReleaseNotes/1_2_10.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Packs/ContentManagement/.pack-ignore b/Packs/ContentManagement/.pack-ignore index 738f17a5bfa2..b4049f51fe4b 100644 --- a/Packs/ContentManagement/.pack-ignore +++ b/Packs/ContentManagement/.pack-ignore @@ -35,7 +35,7 @@ ignore=RM106 ignore=PB106 [file:playbook-Delete_Custom_Content.yml] -ignore=PB105 +ignore=PB105,PB106 [known_words] cliname diff --git a/Packs/ContentManagement/ReleaseNotes/1_2_10.md b/Packs/ContentManagement/ReleaseNotes/1_2_10.md index 4b8f86a055ad..6da52d52bdb3 100644 --- a/Packs/ContentManagement/ReleaseNotes/1_2_10.md +++ b/Packs/ContentManagement/ReleaseNotes/1_2_10.md @@ -3,7 +3,7 @@ ##### Delete Custom Content -- Added new inputs `instance_name` - the Core REST API instance name to use. +- Added new inputs `instance_name` (which `Core REST API` instance to use). #### Scripts From 690a4732ff4a87ee8182f9b381323c13e784a4bb Mon Sep 17 00:00:00 2001 From: Menachem Weinfeld Date: Mon, 3 Jul 2023 12:15:42 +0300 Subject: [PATCH 6/6] Fix how to get the input --- .../Playbooks/playbook-Delete_Custom_Content.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Packs/ContentManagement/Playbooks/playbook-Delete_Custom_Content.yml b/Packs/ContentManagement/Playbooks/playbook-Delete_Custom_Content.yml index ada6f9046214..c2818f8c9010 100644 --- a/Packs/ContentManagement/Playbooks/playbook-Delete_Custom_Content.yml +++ b/Packs/ContentManagement/Playbooks/playbook-Delete_Custom_Content.yml @@ -56,8 +56,7 @@ tasks: uri: simple: /content/bundle using: - complex: - root: inputs.instance_name + simple: ${inputs.instance_name} separatecontext: false continueonerrortype: "" view: |- @@ -131,8 +130,7 @@ tasks: include_ids_dict: simple: ${GetIdsFromCustomContent.included_ids} using: - complex: - root: inputs.instance_name + simple: ${inputs.instance_name} separatecontext: false continueonerrortype: "" view: |-