import demistomock as demisto # noqa: F401 from CommonServerPython import * # noqa: F401 import base64 import hashlib import json import os import requests from CommonServerUserPython import * handle_proxy() VERIFY_CERTIFICATE = not demisto.params().get("insecure", False) URL = demisto.params()["server"] XML_NS = demisto.params()["xml_ns"] USERNAME = demisto.params()["username"] PASSWORD = demisto.params()["password"] HEADERS = {"Content-Type": "text/xml", "SOAPAction": ""} GET_TICKET_BODY = """ sams {password_digest} {base64_binary} {req_time}
? Remedy sams {date} UTC 1
? ? ? ? {service_request_id}
""" CREATE_TICKET_BODY = """ sams {password_digest} {base64_binary} {req_time}
? Remedy !svcautomationdev {date} UTC 1
{details}
True test New 47103 {requester_ntid} {requester_pernr} {contact_email} {contact_name} {contact_phone} {requester_email} {requester_name} {requester_phone} {requester_work_city} {requester_work_location} {requester_work_street} Web Demisto Pending
test
test
""" def http_request(body=""): # pragma: no cover """Makes an API call with the given arguments""" response = requests.post(URL, data=body, headers=HEADERS, verify=VERIFY_CERTIFICATE) if response.status_code < 200 or response.status_code >= 300: if response.status_code == 404: return_error("Request Failed. with status: 404. Cannot find the requested resource. Check your Server URL") elif response.status_code == 500: json_result = json.loads(xml2json(response.content)) return_error( "Request Failed. with status: " + str(response.status_code) + ". Reason is: " + str(json_result["Envelope"]["Body"]["Fault"]["faultstring"]) ) else: return_error("Request Failed. with status: " + str(response.status_code) + ". Reason is: " + str(response.reason)) json_result = json.loads(xml2json(response.content)) if "Envelope" in json_result and "Body" in json_result["Envelope"] and "Fault" in json_result["Envelope"]["Body"]: return_error("Request Failed. Reason is: " + json_result["Envelope"]["Body"]["Fault"]["faultstring"]) return json_result def prettify_get_ticket(json_result): ticket = json_result["Envelope"]["Body"]["getResponse"]["return"]["Body"] if not ticket: return_error(json_result["Envelope"]["Body"]["getResponse"]["return"]["Header"]) pretty_ticket = { "ServiceRequestId": ticket["ServiceRequestId"], "ServiceRequestStatus": ticket["ServiceRequestStatus"], "Priority": ticket["Priority"], } if "Created" in ticket and "When" in ticket["Created"]: pretty_ticket["Date"] = ticket["Created"]["When"]["Date"] pretty_ticket["Time"] = ticket["Created"]["When"]["Time"] if "Details" in ticket: pretty_ticket["Details"] = ticket["Details"] if "SourceReference" in ticket: pretty_ticket["SourceReference"] = ticket["SourceReference"] if "RequesterContactInformation" in ticket: if "RequesterEmail" in ticket["RequesterContactInformation"]: pretty_ticket["RequesterEmail"] = ticket["RequesterContactInformation"]["RequesterEmail"] if "RequesterName" in ticket["RequesterContactInformation"]: pretty_ticket["RequesterName"] = ticket["RequesterContactInformation"]["RequesterName"] if "RequesterPhone" in ticket["RequesterContactInformation"]: pretty_ticket["RequesterPhone"] = ticket["RequesterContactInformation"]["RequesterPhone"] if "RequesterWorkCity" in ticket["RequesterContactInformation"]: pretty_ticket["RequesterWorkCity"] = ticket["RequesterContactInformation"]["RequesterWorkCity"] if "RequesterWorkLocation" in ticket["RequesterContactInformation"]: pretty_ticket["RequesterWorkLocation"] = ticket["RequesterContactInformation"]["RequesterWorkLocation"] if "RequesterWorkStreet" in ticket["RequesterContactInformation"]: pretty_ticket["RequesterWorkStreet"] = ticket["RequesterContactInformation"]["RequesterWorkStreet"] if "ContactInformation" in ticket["RequesterContactInformation"]: if "ContactEmail" in ticket["RequesterContactInformation"]["ContactInformation"]: pretty_ticket["ContactEmail"] = ticket["RequesterContactInformation"]["ContactInformation"]["ContactEmail"] if "ContactPhone" in ticket["RequesterContactInformation"]["ContactInformation"]: pretty_ticket["ContactPhone"] = ticket["RequesterContactInformation"]["ContactInformation"]["ContactPhone"] if "ContactName" in ticket["RequesterContactInformation"]["ContactInformation"]: pretty_ticket["ContactName"] = ticket["RequesterContactInformation"]["ContactInformation"]["ContactName"] return pretty_ticket @logger def remedy_get_ticket(service_request_id): now = datetime.utcnow() req_time = now.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z" date = now.strftime("%Y-%m-%d") time = now.strftime("%H:%M:%S") nonce = os.urandom(16) base64_binary = base64.b64encode(nonce).decode("ascii") # Password_Digest = Base64 (SHA-1 (nonce + createtime + password)) hash_object = hashlib.sha1(nonce + req_time.encode("utf-8") + PASSWORD.encode("utf-8")) # nosec digest_string = hash_object.digest() password_digest = base64.b64encode(digest_string).decode("ascii") body = GET_TICKET_BODY.format( xml_ns=XML_NS, password_digest=password_digest, base64_binary=base64_binary, req_time=str(req_time), date=date, time=time, service_request_id=service_request_id, ) response = http_request(body) return response def remedy_get_ticket_command(): service_request_id = demisto.args()["service_request_id"] response = remedy_get_ticket(service_request_id) pretty_ticket = prettify_get_ticket(response) demisto.results( { "Type": entryTypes["note"], "ContentsFormat": formats["json"], "Contents": response, "ReadableContentsFormat": formats["markdown"], "HumanReadable": tableToMarkdown( "Ticket:", pretty_ticket, ["ServiceRequestId", "Priority", "ServiceRequestStatus", "RequesterEmail", "RequesterName", "RequesterPhone"], ), "EntryContext": {"Remedy.Ticket(val.ServiceRequestId == obj.ServiceRequestId)": pretty_ticket}, } ) def prettify_create_ticket(json_result, requester_phone, requester_name, requester_email): ticket = json_result["Envelope"]["Body"]["createResponse"]["return"]["Body"] if not ticket: return_error(json_result["Envelope"]["Body"]["createResponse"]["return"]["Header"]) pretty_ticket = {"ServiceRequestId": ticket["ServiceRequestId"]} pretty_ticket["RequesterPhone"] = requester_phone pretty_ticket["RequesterName"] = requester_name pretty_ticket["RequesterEmail"] = requester_email return pretty_ticket @logger def remedy_create_ticket( details, requester_ntid, requester_email, requester_name, requester_phone, requester_work_city, requester_work_location, requester_work_street, requester_pernr="?", contact_email="?", contact_name="?", contact_phone="?", ): now = datetime.utcnow() req_time = now.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z" date = now.strftime("%Y-%m-%d") time = now.strftime("%H:%M:%S") nonce = os.urandom(16) base64_binary = base64.b64encode(nonce).decode("ascii") # Password_Digest = Base64 (SHA-1 (nonce + createtime + password)) hash_object = hashlib.sha1(nonce + req_time.encode("utf-8") + PASSWORD.encode("utf-8")) # nosec digest_string = hash_object.digest() password_digest = base64.b64encode(digest_string).decode("ascii") body = CREATE_TICKET_BODY.format( xml_ns=XML_NS, password_digest=password_digest, base64_binary=base64_binary, req_time=str(req_time), date=date, time=time, details=details, requester_ntid=requester_ntid, requester_email=requester_email, requester_name=requester_name, requester_phone=requester_phone, requester_work_city=requester_work_city, requester_work_location=requester_work_location, requester_work_street=requester_work_street, requester_pernr=requester_pernr, contact_email=contact_email, contact_name=contact_name, contact_phone=contact_phone, ) response = http_request(body) return response def remedy_create_ticket_command(): args = demisto.args() details = args["details"] requester_ntid = args["requester_ntid"] requester_pernr = args.get("requester_pernr", None) contact_email = args.get("contact_email", None) contact_name = args.get("contact_name", None) contact_phone = args.get("contact_phone", None) requester_email = args["requester_email"] requester_name = args["requester_name"] requester_phone = args["requester_phone"] requester_work_city = args["requester_work_city"] requester_work_location = args["requester_work_location"] requester_work_street = args["requester_work_street"] response = remedy_create_ticket( details, requester_ntid, requester_email, requester_name, requester_phone, requester_work_city, requester_work_location, requester_work_street, requester_pernr, contact_email, contact_name, contact_phone, ) pretty_ticket = prettify_create_ticket(response, requester_phone, requester_name, requester_email) ec_create = { "ServiceRequestId": response["Envelope"]["Body"]["createResponse"]["return"]["Body"]["ServiceRequestId"], "Details": details, "RequesterNTID": requester_ntid, "RequesterPERNR": requester_pernr, "RequesterEmail": requester_email, "RequesterName": requester_name, "RequesterPhone": requester_phone, "RequesterWorkCity": requester_work_city, "RequesterWorkLocation": requester_work_location, "RequesterWorkStreet": requester_work_street, "ContactEmail": contact_email, "ContactName": contact_name, "ContactPhone": contact_phone, } demisto.results( { "Type": entryTypes["note"], "ContentsFormat": formats["json"], "Contents": response, "ReadableContentsFormat": formats["markdown"], "HumanReadable": tableToMarkdown( "Ticket:", pretty_ticket, ["ServiceRequestId", "RequesterEmail", "RequesterName", "RequesterPhone"] ), "EntryContext": {"Remedy.Ticket(val.ServiceRequestId == obj.ServiceRequestId)": ec_create}, } ) def remedy_update_ticket_command(): raise DemistoException("This is a deprecated command") """ EXECUTION CODE """ LOG(f"command is {demisto.command()}") try: if demisto.command() == "test-module": remedy_get_ticket("SR000552078") demisto.results("ok") elif demisto.command() == "remedy-get-ticket": remedy_get_ticket_command() elif demisto.command() == "remedy-create-ticket": remedy_create_ticket_command() elif demisto.command() == "remedy-update-ticket": remedy_update_ticket_command() except Exception as e: return_error(str(e))