MicroFocusSMAX
Fetch SMAX cases and automate differen SMAX case management actions.
Case Management · MicroFocus SMAX
Details
| ID | MicroFocusSMAX |
|---|---|
| Provider | OpenText |
| Category | Case Management |
| From Version | 6.0.0 |
| Docker Image | demisto/python3:3.12.8.3296088 |
| Supported Modules | Agentix XSIAM |
README
Fetch SMAX incidents, requests and automate different SMAX case management actions
This integration was integrated and tested with version 2021.08 of MicroFocus SMAX
Configure MicroFocus SMAX in Cortex
| Parameter | Description | Required |
|---|---|---|
| Object To Fetch | False | |
| Your SMAX Management URL | True | |
| Tenant ID | The tenant ID is the number following TENANTID= in your management URL | False |
| Username | The admin credentials used to integration with SMAX | True |
| Password | True | |
| Fetch Filter | Fetch filter , example: Status = ‘Ready’” for Incident queries, see “REST API collection query protocol” in SMAX documentation to know how to use the filter | False |
| Fields To Fetch | Fields to return, for example: “Priority,Category” for an entity of type “Incident | False |
| Fetch Limit | The maximum number of incidents to fetch per fetch command | False |
| Fetch Start | Fetch start in days | False |
| Trust any certificate (not secure) | False | |
| Use system proxy settings | False |
Commands
You can execute these commands from the CLI, as part of an automation, or in a playbook.
After you successfully execute a command, a DBot message appears in the War Room with the command details.
microfocus-smax-get-entity
Get any entity details
Base Command
microfocus-smax-get-entity
Input
| Argument Name | Description | Required |
|---|---|---|
| entity_type | Entity type, for example: “Incident”, the type is case-sensitive. Possible values are: . | Required |
| entity_id | Entity Id . | Required |
| entity_fields | Fields to return, for example: “Priority,Category” for an entity of type “Incident”. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| MicroFocus.SMAX.Entities.properties.Id | String | Entity Id |
| MicroFocus.SMAX.Entities.properties.Name | String | Entity name |
Command Example
!microfocus-smax-get-entity entity_type="Incident" entity_id="16989" entity_fields="Description,Urgency,Status,RegisteredForActualService"
Context Example
{
"MicroFocus": {
"SMAX": {
"Entities": {
"entity_type": "Incident",
"properties": {
"Description": "Test Description",
"DisplayLabel": "test66122",
"Id": "16989",
"LastUpdateTime": 1635339214960,
"RegisteredForActualService": "11639",
"Status": "Ready",
"Urgency": "SlightDisruption"
},
"related_properties": {}
}
}
}
}
Human Readable Output
Entity Details
Description DisplayLabel Id LastUpdateTime RegisteredForActualService Status Type Urgency Test Description test66122 16989 1635339214960 11639 Ready Incident SlightDisruption
microfocus-smax-query-entities
Query entities’ details using a collection query filter
Base Command
microfocus-smax-query-entities
Input
| Argument Name | Description | Required |
|---|---|---|
| entity_type | Entity type, for example: “Incident”, the type is case-sensitive. | Required |
| query_filter | Query filter , example: Status = ‘Ready’” for Incident queries, see “REST API collection query protocol” in SMAX documentation to know how to use the filter. | Optional |
| entity_fields | Fields to return, for example: “Priority,Category” for an entity of type “Incident”. | Optional |
| order_by | The order query parameter specifies the order in which the returned resources are placed, example: “Id desc”. | Optional |
| size | Specify the maximum number of resources requested to be returned. | Optional |
| skip | Specify how many resources should be skipped by specifying the starting index of the returned result. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| MicroFocus.SMAX.Entities.properties.Id | String | Entity Id |
| MicroFocus.SMAX.Entities.properties.Name | String | Entity name |
| MicroFocus.SMAX.Query.query_time | String | Query time |
| MicroFocus.SMAX.Query.total_count | String | Query results total count |
| MicroFocus.SMAX.Query.completion_status | String | Query result status |
Command Example
!microfocus-smax-query-entities entity_type="Incident" query_filter="Status = 'Ready'" entity_fields="Status,Urgency" order_by="Id desc" size="5"
Context Example
{
"MicroFocus": {
"SMAX": {
"Entities": [
{
"entity_type": "Incident",
"properties": {
"Id": "17658",
"LastUpdateTime": 1635338444483,
"Status": "Ready",
"Urgency": "NoDisruption"
},
"related_properties": {}
},
{
"entity_type": "Incident",
"properties": {
"Id": "17656",
"LastUpdateTime": 1635331698499,
"Status": "Ready",
"Urgency": "SlightDisruption"
},
"related_properties": {}
},
{
"entity_type": "Incident",
"properties": {
"Id": "17652",
"LastUpdateTime": 1635256251981,
"Status": "Ready",
"Urgency": "NoDisruption"
},
"related_properties": {}
},
{
"entity_type": "Incident",
"properties": {
"Id": "17650",
"LastUpdateTime": 1635247508242,
"Status": "Ready",
"Urgency": "SlightDisruption"
},
"related_properties": {}
},
{
"entity_type": "Incident",
"properties": {
"Id": "17647",
"LastUpdateTime": 1635247121852,
"Status": "Ready",
"Urgency": "NoDisruption"
},
"related_properties": {}
}
],
"Query": {
"completion_status": "OK",
"errorDetailsList": [],
"errorDetailsMetaList": [],
"query_time": 1635341363698808,
"total_count": 47
}
}
}
}
Human Readable Output
Result Details
Id LastUpdateTime Status Type Urgency 17658 1635338444483 Ready Incident NoDisruption 17656 1635331698499 Ready Incident SlightDisruption 17652 1635256251981 Ready Incident NoDisruption 17650 1635247508242 Ready Incident SlightDisruption 17647 1635247121852 Ready Incident NoDisruption
microfocus-smax-create-entities
Create new entities
Base Command
microfocus-smax-create-entities
Input
| Argument Name | Description | Required |
|---|---|---|
| entities | A list of new entity objects to creates, please review the Bulk API documentation for more information. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| MicroFocus.SMAX.Entities.properties.Id | String | Entity Id |
| MicroFocus.SMAX.Entities.properties.Name | String | Entity name |
| MicroFocus.SMAX.Entities.properties.completion_status | String | Query result status |
Command Example
!microfocus-smax-create-entities entities=`[ { "entity_type": "Incident", "properties": { "DisplayLabel": "Test incident", "Description": "Test incident description", "RegisteredForActualService": "11639", "Urgency": "NoDisruption" } } ]`
Context Example
{
"MicroFocus": {
"SMAX": {
"Entities": {
"completion_status": "OK",
"entity_type": "Incident",
"properties": {
"Id": "17013",
"LastUpdateTime": 1635341339329
},
"related_properties": {}
}
}
}
}
Human Readable Output
Entities Creation Details
CompletionStatus Id LastUpdateTime Type OK 17013 1635341339329 Incident
microfocus-smax-update-entities
Update entities
Base Command
microfocus-smax-update-entities
Input
| Argument Name | Description | Required |
|---|---|---|
| entities | A list of updated entity objects, please review the Bulk API documentation for more information. | Required |
Context Output
| Path | Type | Description |
|---|---|---|
| MicroFocus.SMAX.Entities.properties.Id | String | Entity Id |
| MicroFocus.SMAX.Entities.properties.Name | String | Entity name |
| MicroFocus.SMAX.Entities.properties.completion_status | String | Query result status |
Command Example
!microfocus-smax-update-entities entities=`[ { "entity_type": "Incident", "properties": { "Id": "16989", "Description": "Test Description" } } ]`
Context Example
{
"MicroFocus": {
"SMAX": {
"Entities": {
"completion_status": "OK",
"entity_type": "Incident",
"properties": {
"Id": "16989",
"LastUpdateTime": 1635339214960
},
"related_properties": {}
}
}
}
}
Human Readable Output
Entities Update Details
CompletionStatus Id LastUpdateTime Type OK 16989 1635339214960 Incident
microfocus-smax-create-incident
Create a new incident
Base Command
microfocus-smax-create-incident
Input
| Argument Name | Description | Required |
|---|---|---|
| incident_name | Incident name. | Required |
| incident_description | Incident description. | Required |
| impacted_service | Impacted service by the incident, you must provide a service id. | Required |
| requested_by | Incident requested by, you must provide a user id. | Optional |
| incident_urgency | Incident urgency level. Possible values are: NoDisruption, SlightDisruption, SevereDisruption, TotalLossOfService. | Optional |
| impact_scope | Incident impact scope. Possible values are: SingleUser, MultipleUsers, SiteOrDepartment, Enterprise. | Optional |
| service_desk_group | Service desk group, you have to provide a group id. | Optional |
| other_properities | An object of other properities. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| MicroFocus.SMAX.Entities.properties.Id | String | Entity Id |
| MicroFocus.SMAX.Entities.properties.Name | String | Entity name |
| MicroFocus.SMAX.Entities.properties.completion_status | String | Query result status |
Command Example
!microfocus-smax-create-incident incident_name="Test incident" incident_description="Test incident description" impacted_service="11639" other_properities=`{"Status": "Ready","Urgency": "NoDisruption"}`
Context Example
{
"MicroFocus": {
"SMAX": {
"Entities": {
"completion_status": "OK",
"entity_type": "Incident",
"properties": {
"Id": "17015",
"LastUpdateTime": 1635341345342
},
"related_properties": {}
}
}
}
}
Human Readable Output
Incident Creation Results
CompletionStatus Id LastUpdateTime Type OK 17015 1635341345342 Incident
microfocus-smax-update-incident
Update an incident
Base Command
microfocus-smax-update-incident
Input
| Argument Name | Description | Required |
|---|---|---|
| incident_id | Incident Id. | Required |
| incident_description | Incident description. | Optional |
| incident_urgency | Incident urgency level. Possible values are: NoDisruption, SlightDisruption, SevereDisruption, TotalLossOfService. | Optional |
| impact_scope | Incident impact scope. Possible values are: SingleUser, MultipleUsers, SiteOrDepartment, Enterprise. | Optional |
| incident_status | Incident status. Possible values are: Ready, InProgress, Pending, Suspended, Complete. | Optional |
| incident_closure_category | Incident closure category, you have to provide a category Id. | Optional |
| incident_completion_code | Incident completion code. | Optional |
| incident_solution | Incident solution details. | Optional |
| other_properities | An object of other properities. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| MicroFocus.SMAX.Entities.properties.Id | String | Entity Id |
| MicroFocus.SMAX.Entities.properties.Name | String | Entity name |
| MicroFocus.SMAX.Entities.properties.completion_status | String | Query result status |
Command Example
!microfocus-smax-update-incident incident_id="17007" incident_description="Test Description" incident_status="Complete" incident_solution="Test Solution"
Context Example
{
"MicroFocus": {
"SMAX": {
"Entities": {
"completion_status": "OK",
"entity_type": "Incident",
"properties": {
"Id": "17007",
"LastUpdateTime": 1635339537768
},
"related_properties": {}
}
}
}
}
Human Readable Output
Incident Update Results
CompletionStatus Id LastUpdateTime Type OK 17007 1635339537768 Incident
microfocus-smax-create-request
Create a new request
Base Command
microfocus-smax-create-request
Input
| Argument Name | Description | Required |
|---|---|---|
| request_name | Request name. | Required |
| request_description | Request description. | Required |
| requested_by | Requested by, you must provide a user id. | Required |
| requested_for | Requested for, you must provide a user id. | Required |
| request_urgency | Request urgency level. Possible values are: NoDisruption, SlightDisruption, SevereDisruption, TotalLossOfService. | Optional |
| impact_scope | Request impact scope. Possible values are: SingleUser, MultipleUsers, SiteOrDepartment, Enterprise. | Optional |
| other_properities | An object of other properities. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| MicroFocus.SMAX.Entities.properties.Id | String | Entity Id |
| MicroFocus.SMAX.Entities.properties.Name | String | Entity name |
| MicroFocus.SMAX.Entities.properties.completion_status | String | Query result status |
Command Example
!microfocus-smax-create-request request_name="Test Request" request_description="Test Request Description" requested_by="10388" requested_for="10388"
Context Example
{
"MicroFocus": {
"SMAX": {
"Entities": {
"completion_status": "OK",
"entity_type": "Request",
"properties": {
"Id": "17549",
"LastUpdateTime": 1635341351250
},
"related_properties": {}
}
}
}
}
Human Readable Output
Request Creation Results
CompletionStatus Id LastUpdateTime Type OK 17549 1635341351250 Request
microfocus-smax-update-request
Update a request
Base Command
microfocus-smax-update-request
Input
| Argument Name | Description | Required |
|---|---|---|
| request_id | Request Id. | Required |
| request_description | Request description. | Optional |
| request_urgency | Request urgency level. Possible values are: NoDisruption, SlightDisruption, SevereDisruption, TotalLossOfService. | Optional |
| impact_scope | Incident impact scope. Possible values are: SingleUser, MultipleUsers, SiteOrDepartment, Enterprise. | Optional |
| request_status | Request status. Possible values are: RequestStatusReady, RequestStatusInProgress, RequestStatusPending, RequestStatusSuspended, RequestStatusComplete, RequestStatusPendingParent, RequestStatusRejected, RequestStatusPendingVendor, RequestStatusPendingExternalServiceDesk, RequestStatusPendingSpecialOperation. | Optional |
| request_note | Request update note. | Optional |
| other_properities | An object of other properities. | Optional |
Context Output
| Path | Type | Description |
|---|---|---|
| MicroFocus.SMAX.Entities.properties.Id | String | Entity Id |
| MicroFocus.SMAX.Entities.properties.Name | String | Entity name |
| MicroFocus.SMAX.Entities.properties.completion_status | String | Query result status |
Command Example
!microfocus-smax-update-request request_id="17009" request_description="Test Description" request_status="RequestStatusPendingSpecialOperation"
Context Example
{
"MicroFocus": {
"SMAX": {
"Entities": {
"completion_status": "OK",
"entity_type": "Request",
"properties": {
"Id": "17009",
"LastUpdateTime": 1635339631068
},
"related_properties": {}
}
}
}
}
Human Readable Output
Request Update Results
CompletionStatus Id LastUpdateTime Type OK 17009 1635339631068 Request
Configuration parameters
object_to_fetch— Object To Fetchurl— Your SMAX Management URL (required)tenant_id— Tenant IDcredentials— Username (required)fetch_query_filter— Fetch Filterfetch_fields— Fields To Fetchfetch_limit— Fetch Limitfetch_start— Fetch Startinsecure— Trust any certificate (not secure)proxy— Use system proxy settingsincidentType— Incident typeincidentFetchInterval— Incidents Fetch IntervalisFetch— Fetch incidents
Commands (8)
-
microfocus-smax-create-entitiesCreate new entities.
-
microfocus-smax-create-incidentCreate a new incident.
-
microfocus-smax-create-requestCreate a new request.
-
microfocus-smax-get-entityGet any entity details.
-
microfocus-smax-query-entitiesQuery entities' details using a collection query filter.
-
microfocus-smax-update-entitiesUpdate entities.
-
microfocus-smax-update-incidentUpdate an incident.
-
microfocus-smax-update-requestUpdate a request.
import traceback from typing import Any import requests import urllib3 from CommonServerPython import * urllib3.disable_warnings() # pylint: disable=no-member """ CONSTANTS """ DATE_FORMAT = "%Y-%m-%dT%H:%M:%SZ" """ CLIENT CLASS """ class Client(BaseClient): def __init__(self, base_url: str, token: object, tenant_id: str, use_ssl: bool, use_proxy: bool, **kwargs): super().__init__(base_url, verify=use_ssl, proxy=use_proxy, **kwargs) self.headers = {"Cookie": f"SMAX_AUTH_TOKEN={token}"} self.tenant_id = tenant_id def get_entity(self, entity_type, entity_id, entity_fields): url_suffix = f"rest/{self.tenant_id}/ems/{entity_type}/{entity_id}" params = {"layout": entity_fields} response = self._http_request(method="GET", url_suffix=url_suffix, headers=self.headers, params=params) return response def query_entities(self, entity_type, query_filter, entity_fields, order_by, size, skip): url_suffix = f"rest/{self.tenant_id}/ems/{entity_type}" params = {"layout": entity_fields, "meta": "TotalCount,Count"} if query_filter: params.update({"filter": query_filter}) if order_by: params.update({"order": order_by}) if size: params.update({"size": size}) if skip: params.update({"skip": skip}) response = self._http_request(method="GET", url_suffix=url_suffix, headers=self.headers, params=params) return response def bulk_action(self, action_type, entities): if type(entities) is str: entities = json.loads(entities) url_suffix = f"rest/{self.tenant_id}/ems/bulk" payload = {"entities": entities, "operation": action_type} response = self._http_request(method="POST", url_suffix=url_suffix, headers=self.headers, json_data=payload) return response """ HELPER FUNCTIONS """ def login(server: str, tenant: str, username: str, password: str, verify_certificate: bool): response = requests.post( f"{server}/auth/authentication-endpoint/authenticate/token?TENANTID={tenant}", verify=verify_certificate, json={"Login": username, "Password": password}, ) token = response.text if not token: raise DemistoException(f"Authorization Error: please check your credentials. \n\nError:\n{response}") return token def validate_fetch_params(fetch_limit, fetch_start): try: fetch_limit = int(fetch_limit) except Exception as e: raise DemistoException(f"Fetch limit has to be a number, Error Details: {e}") if not fetch_limit or fetch_limit > 200: raise DemistoException("Fetch limit has to be in a range between 1 and 200") try: fetch_start = int(fetch_start) except Exception as e: raise DemistoException(f"Fetch start has to be a number, Error Details: {e}") if not fetch_start: raise DemistoException("Fetch start is not specified") """ COMMAND FUNCTIONS """ def test_module(client: Client, username, fetch_limit, fetch_start) -> str: client.query_entities( entity_type="Person", query_filter=f"Name startswith ('{username}')", order_by=None, entity_fields="Id", size=None, skip=None, ) validate_fetch_params(fetch_limit=fetch_limit, fetch_start=fetch_start) return "ok" def fetch_incidents_command( client: Client, object_to_fetch="Incident", fetch_query_filter=None, fetch_fields=None, fetch_limit="100", fetch_start="1" ): incidents = [] validate_fetch_params(fetch_limit=fetch_limit, fetch_start=fetch_start) if fetch_fields: fetch_fields = "DisplayLabel,Id,EmsCreationTime" + fetch_fields else: fetch_fields = "DisplayLabel,Id,EmsCreationTime" last_run = demisto.getLastRun() if last_run and "start_time" in last_run: start_time = last_run.get("start_time") + 1 else: start_time = round((datetime.now() - timedelta(days=int(fetch_start))).timestamp() * 1000) if fetch_query_filter: fetch_query_filter = f"EmsCreationTime btw ({start_time},{round(datetime.now().timestamp() * 1000)})" + fetch_query_filter else: fetch_query_filter = f"EmsCreationTime btw ({start_time},{round(datetime.now().timestamp() * 1000)})" results = client.query_entities( entity_type=object_to_fetch, query_filter=fetch_query_filter, order_by="Id desc", entity_fields=fetch_fields, size=fetch_limit, skip=None, ) for entity in results.get("entities"): properties = entity.get("properties") created_at_epoch = int(properties.get("EmsCreationTime")) created_at_date = datetime.fromtimestamp(round(created_at_epoch / 1000), timezone.utc) entity_id = properties.get("Id") raw_json = {"Type": entity.get("entity_type")} raw_json.update(properties) inc = { "name": f"SMAX {object_to_fetch}: {entity_id}", "occurred": created_at_date.isoformat(), "rawJSON": json.dumps(raw_json), } incidents.append(inc) if created_at_epoch > start_time: start_time = created_at_epoch incidents.reverse() demisto.setLastRun({"start_time": start_time}) demisto.incidents(incidents) def get_entity_command(client: Client, args: dict[str, Any]) -> CommandResults: entity_type = args.get("entity_type", None) entity_id = args.get("entity_id", None) entity_fields = args.get("entity_fields", None) readable_entity = {} if not (entity_type and entity_id): raise ValueError("Entity Type and ID are not specified") if entity_fields: entity_fields = "DisplayLabel,Id," + entity_fields else: entity_fields = "DisplayLabel,Id" result = client.get_entity(entity_type=entity_type, entity_id=entity_id, entity_fields=entity_fields) if result.get("entities"): entity = result.get("entities")[0] readable_entity["Type"] = entity.get("entity_type") readable_entity.update(entity.get("properties")) readable_output = tableToMarkdown("Entity Details:", readable_entity) return CommandResults( outputs_prefix="MicroFocus.SMAX.Entities", outputs_key_field="properties.Id", readable_output=readable_output, outputs=entity, ) else: return CommandResults(readable_output="The entity is not found") def query_entities_command(client: Client, args: dict[str, Any]): entity_type = args.get("entity_type", None) entity_fields = args.get("entity_fields", None) query_filter = args.get("query_filter", None) order_by = args.get("order_by", None) size = args.get("size", None) skip = args.get("skip", None) readable_entities = [] if not entity_type: raise ValueError("Entity Type is not specified") if entity_fields: entity_fields = "Name,Id," + entity_fields else: entity_fields = "Name,Id" results = client.query_entities( entity_type=entity_type, entity_fields=entity_fields, query_filter=query_filter, order_by=order_by, size=size, skip=skip ) if results.get("entities"): for entity in results.get("entities"): readable_entity = {"Type": entity.get("entity_type")} readable_entity.update(entity.get("properties")) readable_entities.append(readable_entity) meta_data = results.get("meta") count_readable_output = tableToMarkdown( "Result Total Count:", {"Query Time": meta_data.get("query_time"), "Total Count": meta_data.get("total_count")} ) results_readable_output = tableToMarkdown("Result Details:", readable_entities) return [ CommandResults( outputs_prefix="MicroFocus.SMAX.Query", outputs_key_field="query_time", readable_output=count_readable_output, outputs=results.get("meta"), ), CommandResults( outputs_prefix="MicroFocus.SMAX.Entities", outputs_key_field="properties.Id", readable_output=results_readable_output, outputs=results.get("entities"), ), ] else: return CommandResults(readable_output="No entities found") def create_entities_command(client: Client, args: dict[str, Any]) -> CommandResults: entities = args.get("entities", None) readable_entities = [] context_entities = [] if not entities: raise ValueError("Entities are not specified") result = client.bulk_action(action_type="CREATE", entities=entities) bulk_results = result.get("entity_result_list") for entity in bulk_results: entity_object = entity.get("entity") completion_status = entity.get("completion_status") context_entity = {"completion_status": completion_status} context_entity.update(entity_object) context_entities.append(context_entity) readable_entity = {"Type": entity_object.get("entity_type"), "CompletionStatus": completion_status} readable_entity.update(entity_object.get("properties")) readable_entities.append(readable_entity) results_readable_output = tableToMarkdown("Entities Creation Details:", readable_entities) return CommandResults( outputs_prefix="MicroFocus.SMAX.Entities", outputs_key_field="properties.Id", readable_output=results_readable_output, outputs=context_entities, ) def update_entities_command(client: Client, args: dict[str, Any]) -> CommandResults: entities = args.get("entities", None) readable_entities = [] context_entities = [] if not entities: raise ValueError("Entities are not specified") result = client.bulk_action(action_type="UPDATE", entities=entities) bulk_results = result.get("entity_result_list") for entity in bulk_results: entity_object = entity.get("entity") completion_status = entity.get("completion_status") context_entity = {"completion_status": completion_status} context_entity.update(entity_object) context_entities.append(context_entity) readable_entity = {"Type": entity_object.get("entity_type"), "CompletionStatus": completion_status} readable_entity.update(entity_object.get("properties")) readable_entities.append(readable_entity) results_readable_output = tableToMarkdown("Entities Update Details:", readable_entities) return CommandResults( outputs_prefix="MicroFocus.SMAX.Entities", outputs_key_field="properties.Id", readable_output=results_readable_output, outputs=context_entities, ) def create_incident_command(client: Client, args: dict[str, Any]) -> CommandResults: readable_entities = [] context_entities = [] incident_name = args.get("incident_name") incident_description = args.get("incident_description") impacted_service = args.get("impacted_service") requested_by = args.get("requested_by", None) incident_urgency = args.get("incident_urgency", None) impact_scope = args.get("impact_scope", None) service_desk_group = args.get("service_desk_group", None) other_properities = args.get("other_properities", None) incident_properities = { "DisplayLabel": incident_name, "Description": incident_description, "RegisteredForActualService": impacted_service, } if requested_by: incident_properities["RequestedByPerson"] = requested_by if incident_urgency: incident_properities["Urgency"] = incident_urgency if impact_scope: incident_properities["ImpactScope"] = impact_scope if service_desk_group: incident_properities["ServiceDeskGroup"] = service_desk_group if other_properities: incident_properities.update(json.loads(other_properities)) incident_object = {"entity_type": "Incident", "properties": incident_properities} result = client.bulk_action(action_type="CREATE", entities=[incident_object]) bulk_results = result.get("entity_result_list") for entity in bulk_results: entity_object = entity.get("entity") completion_status = entity.get("completion_status") context_entity = {"completion_status": completion_status} context_entity.update(entity_object) context_entities.append(context_entity) readable_entity = {"Type": entity_object.get("entity_type"), "CompletionStatus": completion_status} readable_entity.update(entity_object.get("properties")) readable_entities.append(readable_entity) results_readable_output = tableToMarkdown("Incident Creation Results:", readable_entities) return CommandResults( outputs_prefix="MicroFocus.SMAX.Entities", outputs_key_field="properties.Id", readable_output=results_readable_output, outputs=context_entities, ) def update_incident_command(client: Client, args: dict[str, Any]) -> CommandResults: readable_entities = [] context_entities = [] incident_id = args.get("incident_id") incident_description = args.get("incident_description", None) incident_urgency = args.get("incident_urgency", None) incident_scope = args.get("incident_scope", None) incident_status = args.get("incident_status", None) incident_closure_category = args.get("incident_closure_category", None) incident_completion_code = args.get("incident_completion_code", None) incident_solution = args.get("incident_solution", None) other_properities = args.get("other_properities", None) incident_properities = {"Id": incident_id} if incident_description: incident_properities["Description"] = incident_description if incident_urgency: incident_properities["Urgency"] = incident_urgency if incident_scope: incident_properities["ImpactScope"] = incident_scope if incident_status: incident_properities["Status"] = incident_status if incident_closure_category: incident_properities["ClosureCategory"] = incident_closure_category if incident_completion_code: incident_properities["CompletionCode"] = incident_completion_code if incident_solution: incident_properities["Solution"] = incident_solution if other_properities: incident_properities.update(json.loads(other_properities)) request_object = {"entity_type": "Incident", "properties": incident_properities} result = client.bulk_action(action_type="UPDATE", entities=[request_object]) bulk_results = result.get("entity_result_list") for entity in bulk_results: entity_object = entity.get("entity") completion_status = entity.get("completion_status") context_entity = {"completion_status": completion_status} context_entity.update(entity_object) context_entities.append(context_entity) readable_entity = {"Type": entity_object.get("entity_type"), "CompletionStatus": completion_status} readable_entity.update(entity_object.get("properties")) readable_entities.append(readable_entity) results_readable_output = tableToMarkdown("Incident Update Results:", readable_entities) return CommandResults( outputs_prefix="MicroFocus.SMAX.Entities", outputs_key_field="properties.Id", readable_output=results_readable_output, outputs=context_entities, ) def create_request_command(client: Client, args: dict[str, Any]) -> CommandResults: readable_entities = [] context_entities = [] request_name = args.get("request_name") request_description = args.get("request_description") requested_by = args.get("requested_by") requested_for = args.get("requested_for") request_urgency = args.get("request_urgency", None) impact_scope = args.get("impact_scope", None) other_properities = args.get("other_properities", None) request_properities = { "DisplayLabel": request_name, "Description": request_description, "RequestedByPerson": requested_by, "RequestedForPerson": requested_for, } if request_urgency: request_properities["Urgency"] = request_urgency if impact_scope: request_properities["ImpactScope"] = impact_scope if other_properities: request_properities.update(json.loads(other_properities)) request_object = {"entity_type": "Request", "properties": request_properities} result = client.bulk_action(action_type="CREATE", entities=[request_object]) bulk_results = result.get("entity_result_list") for entity in bulk_results: entity_object = entity.get("entity") completion_status = entity.get("completion_status") context_entity = {"completion_status": completion_status} context_entity.update(entity_object) context_entities.append(context_entity) readable_entity = {"Type": entity_object.get("entity_type"), "CompletionStatus": completion_status} readable_entity.update(entity_object.get("properties")) readable_entities.append(readable_entity) results_readable_output = tableToMarkdown("Request Creation Results:", readable_entities) return CommandResults( outputs_prefix="MicroFocus.SMAX.Entities", outputs_key_field="properties.Id", readable_output=results_readable_output, outputs=context_entities, ) def update_request_command(client: Client, args: dict[str, Any]) -> CommandResults: readable_entities = [] context_entities = [] request_id = args.get("request_id") request_description = args.get("request_description", None) request_urgency = args.get("request_urgency", None) impact_scope = args.get("impact_scope", None) request_status = args.get("request_status", None) request_note = args.get("request_note", None) other_properities = args.get("other_properities", None) request_properities = {"Id": request_id} if request_description: request_properities["Description"] = request_description if request_urgency: request_properities["Urgency"] = request_urgency if impact_scope: request_properities["ImpactScope"] = impact_scope if request_status: request_properities["Status"] = request_status if request_note: request_properities["ClosureCategory"] = request_note if other_properities: request_properities.update(json.loads(other_properities)) request_object = {"entity_type": "Request", "properties": request_properities} result = client.bulk_action(action_type="UPDATE", entities=[request_object]) bulk_results = result.get("entity_result_list") for entity in bulk_results: entity_object = entity.get("entity") completion_status = entity.get("completion_status") context_entity = {"completion_status": completion_status} context_entity.update(entity_object) context_entities.append(context_entity) readable_entity = {"Type": entity_object.get("entity_type"), "CompletionStatus": completion_status} readable_entity.update(entity_object.get("properties")) readable_entities.append(readable_entity) results_readable_output = tableToMarkdown("Request Update Results:", readable_entities) return CommandResults( outputs_prefix="MicroFocus.SMAX.Entities", outputs_key_field="properties.Id", readable_output=results_readable_output, outputs=context_entities, ) """ MAIN FUNCTION """ def main() -> None: args = demisto.args() params = demisto.params() base_url = params.get("url") tenant_id = params.get("tenant_id") object_to_fetch = params.get("object_to_fetch") fetch_query_filter = params.get("fetch_query_filter") fetch_fields = params.get("fetch_fields") fetch_start = params.get("fetch_start") fetch_limit = params.get("fetch_limit") verify_certificate = not params.get("insecure", False) proxy = not params.get("insecure", False) username = params.get("credentials", {}).get("identifier") password = params.get("credentials", {}).get("password") handle_proxy() token = login(base_url, tenant_id, username, password, verify_certificate) demisto.debug(f"Command being called is {demisto.command()}") try: client = Client(base_url=base_url, token=token, tenant_id=tenant_id, use_ssl=verify_certificate, use_proxy=proxy) if demisto.command() == "test-module": result = test_module(client, username, fetch_start=fetch_start, fetch_limit=fetch_limit) return_results(result) if demisto.command() == "fetch-incidents": fetch_incidents_command( client, object_to_fetch=object_to_fetch, fetch_query_filter=fetch_query_filter, fetch_fields=fetch_fields, fetch_limit=fetch_limit, fetch_start=fetch_start, ) elif demisto.command() == "microfocus-smax-get-entity": return_results(get_entity_command(client, args)) elif demisto.command() == "microfocus-smax-query-entities": return_results(query_entities_command(client, args)) elif demisto.command() == "microfocus-smax-create-entities": return_results(create_entities_command(client, args)) elif demisto.command() == "microfocus-smax-update-entities": return_results(update_entities_command(client, args)) elif demisto.command() == "microfocus-smax-create-incident": return_results(create_incident_command(client, args)) elif demisto.command() == "microfocus-smax-update-incident": return_results(update_incident_command(client, args)) elif demisto.command() == "microfocus-smax-create-request": return_results(create_request_command(client, args)) elif demisto.command() == "microfocus-smax-update-request": return_results(update_request_command(client, args)) except Exception as e: demisto.error(traceback.format_exc()) return_error(f"Failed to execute {demisto.command()} command.\nError:\n{e!s}") """ ENTRY POINT """ if __name__ in ("__main__", "__builtin__", "builtins"): main()