SIGNL4

SIGNL4 offers critical alerting, incident response and service dispatching for operating critical infrastructure. It alerts you persistently via app push, SMS text, voice calls, and email including tracking, escalation, on-call duty scheduling and collaboration.

Messaging and Conferencing · SIGNL4

Details

IDSIGNL4
ProviderDerdack GmbH
CategoryMessaging and Conferencing
From Version5.0.0
Docker Imagedemisto/python3:3.12.8.3296088
Supported ModulesAgentix Cloud Runtime Security Cloud Posture Security XSIAM EDR Cortex Cloud

README

SIGNL4 offers critical alerting, incident response and service dispatching for operating critical infrastructure. It alerts you persistently via app push, SMS text, voice calls, and email including tracking, escalation, on-call duty scheduling and collaboration.

Configure SIGNL4 on Cortex XSOAR

  1. Navigate to Settings > Integrations > Servers & Services.
  2. Search for SIGNL4.
  3. Click Add instance to create and configure a new integration instance.

    Parameter Description Required
    SIGNL4 team or integration secret   True
    Use system proxy settings   False
  4. Click Test to validate the URLs, token, and connection.

Commands

You can execute these commands from the Cortex XSOAR CLI, as part of an automation, or in a playbook.
After you successfully execute a command, a SIGNL4 alert is either triggered or closed.

signl4_alert


Sends a mobile alert to a SIGNL4 team.

Base Command

signl4_alert

Input

Argument Name Description Required
title The title of the SIGNL4 alert. Required
message The message of the SIGNL4 alert. Required
s4_external_id The external ID is used to reference the alert in order to close it later.  
s4_service The SIGNL4 category to use for this alert. Optional
s4_location Transmit location information (‘latitude, longitude’) with your event and display a map in the mobile app. Optional
s4_alerting_scenario If this event triggers an, allows to control how SIGNL4 notifies the team. single_ack: Only one person needs to acknowledge this alert. multi_ack: The alert must be confirmed by the number of people who are on duty at the time this alert is created. emergency: All people in the team are notified regardless of their duty status and must acknowledge the alert, which is also assigned to the built-in emergency category. Optional
s4_filtering Specify a boolean value of true or false to apply event filtering for this event, or not. If set to true, the event will only trigger a notification to the team, if it contains at least one keyword from one of your services and system categories (i.e. it is whitelisted). Optional

Context Output

Path Type Description
SIGNL4.AlertCreated.eventId String SIGNL4 event ID.

Command example

!signl4-alert name="Test Alert"

Context Example

{
    "title": "Alert from Cortex XSOAR",
    "message": "Hello world.",
    "s4_external_id": "id1234"
}

Human Readable Output

SIGNL4 alert created


{
        "s4_external_id": "id1234"
}

signl4_close


Close a SIGNL4 alert.

Base Command

signl4_close_alert

Input

Argument Name Description Required
s4_external_id The external ID is used to reference the open alert which shall be closed.  

Context Output

Path Type Description
SIGNL4.AlertClosed.eventId String SIGNL4 event ID.

Command example

!signl4_close_alert name="Close Alert"

Context Example

{
        "s4_external_id": "id1234"
}

Human Readable Output

SIGNL4 alert closed


{
        "s4_external_id": "id1234"
}

This is how a SIGNL4 might look like in the mobile app:

SIGNL4 Alert

Configuration parameters

  • secret — Team or Integration Secret (required)
  • proxy — Use system proxy settings

Commands (2)

  • signl4_alert

    Trigger a SIGNL4 alert.

  • signl4_close_alert

    Close an alert in SIGNL4

from CommonServerPython import *


class Client(BaseClient):
    def send_signl4_alert(self, json_data):
        payload = {
            "Title": json_data.get("title"),
            "Message": json_data.get("message"),
            "X-S4-ExternalID": json_data.get("s4_external_id"),
            "X-S4-Status": "new",
            "X-S4-Service": json_data.get("s4_service"),
            "X-S4-Location": json_data.get("s4_location"),
            "X-S4-AlertingScenario": json_data.get("s4_alerting_scenario"),
            "X-S4-Filtering": argToBoolean(json_data.get("s4_filtering", False)),
            "X-S4-SourceSystem": "CortexXSOAR",
        }

        return self._http_request(method="POST", json_data=payload)

    def close_signl4_alert(self, json_data):
        payload = {
            "X-S4-ExternalID": json_data.get("s4_external_id"),
            "X-S4-Status": "resolved",
            "X-S4-SourceSystem": "CortexXSOAR",
        }

        return self._http_request(method="POST", json_data=payload)


def test_module(client):
    """
    Performs basic get request to get item samples
    """
    payload = {"title": "Test Alert from Cortex XSOAR", "X-S4-SourceSystem": "CortexXSOAR"}
    result = client.send_signl4_alert(json_data=payload)
    if "eventId" in result:
        demisto.results("ok")
    else:
        error_code = result["error_code"]
        description = result["description"]
        demisto.results(f"{error_code} {description}")


def send_signl4_alert(client, json_data):
    result = client.send_signl4_alert(json_data)

    r = CommandResults(
        outputs_prefix="SIGNL4.AlertCreated",
        outputs_key_field="eventId",
        outputs=result,
        readable_output=tableToMarkdown("SIGNL4 alert created", result),
        raw_response=result,
    )
    return r


def close_signl4_alert(client, json_data):
    result = client.close_signl4_alert(json_data)

    r = CommandResults(
        outputs_prefix="SIGNL4.AlertClosed",
        outputs_key_field="eventId",
        outputs=result,
        readable_output=tableToMarkdown("SIGNL4 alert closed", result),
        raw_response=result,
    )
    return r


def main():
    params = demisto.params()
    args = demisto.args()
    command = demisto.command()

    secret = params.get("secret", {}).get("password")

    if not secret:
        raise DemistoException("Team or integration secret must be provided.")
    demisto.debug(f"Command is {command}")

    try:
        # Remove proxy if not set to true in params
        handle_proxy()
        proxy = params.get("proxy", False)

        client = Client(base_url=f"https://connect.signl4.com/webhook/{secret}", proxy=proxy)

        if command == "test-module":
            test_module(client)
        elif command == "signl4_alert":
            return_results(send_signl4_alert(client, json_data=args))
        elif command == "signl4_close_alert":
            return_results(close_signl4_alert(client, json_data=args))

    except Exception as ex:
        return_error(str(ex))


if __name__ == "__builtin__" or __name__ == "builtins":
    main()