zabbix_export:
  version: '7.0'
  media_types:
    -
      name: SIGNL4
      type: WEBHOOK
      parameters:
        -
          name: Event_Ack_Status
          value: '{EVENT.ACK.STATUS}'
        -
          name: Event_Date_Time
          value: '{EVENT.DATE} {EVENT.TIME}'
        -
          name: Event_ID
          value: '{EVENT.ID}'
        -
          name: Event_Update_Action
          value: '{EVENT.UPDATE.ACTION}'
        -
          name: Event_Update_Status
          value: '{EVENT.UPDATE.STATUS}'
        -
          name: Hostname
          value: '{HOST.NAME}'
        -
          name: Host_IP
          value: '{HOST.IP}'
        -
          name: Message
          value: '{ALERT.MESSAGE}'
        -
          name: Severity
          value: '{EVENT.SEVERITY}'
        -
          name: Subject
          value: '{ALERT.SUBJECT}'
        -
          name: teamsecret
          value: '{ALERT.SENDTO}'
        -
          name: Trigger_ID
          value: '{TRIGGER.ID}'
        -
          name: Trigger_Status
          value: '{TRIGGER.STATUS}'
        -
          name: User
          value: '{USER.FULLNAME}'
        -
          name: Zabbix_URL
          value: '{$ZABBIX.URL}'
      script: |
        // SIGNL4 Webhook
        try {
            var response,
                payload,
                params = JSON.parse(value),
                endpoint = 'https://connect.signl4.com/webhook/',
                request = new HttpRequest();
        
            if (typeof params.HTTPProxy === 'string' && params.HTTPProxy.trim() !== '') {
                request.setProxy(params.HTTPProxy);
            }
        
            if (typeof params.teamsecret === 'string' && params.teamsecret.trim() !== '') {
                endpoint += params.teamsecret;
                delete params.teamsecret;
            }
            else {
                throw 'The team secret of your SIGNL4 team cannot be empty.';
            }
        
            if (typeof params.Severity === 'string' && params.Severity === '{EVENT.SEVERITY}') {
                params.Severity = 'Not classified';
            }
        
        	if (typeof params.User === 'string' && params.User === '{USER.FULLNAME}') {
                params.User = '';
            }
        
        	if (typeof params.Event_Update_Action === 'string' && params.Event_Update_Action === '{EVENT.UPDATE.ACTION}') {
                params.Event_Update_Action = '';
            }
        
        	// Assemble X-S4-ExternalID for two-way integration
        	// Format: "ZabbixEventID: 222 ZabbixURL: https://your-zabbix-server/zabbix/"
        	params['X-S4-ExternalID'] = 'ZabbixEventID: ' + params.Event_ID;
        	if (typeof params.Zabbix_URL === 'string' && params.Zabbix_URL.indexOf('http') == 0) {
        		// Make sure the URL ends with '/'
        		if (params.Zabbix_URL.charAt(params.Zabbix_URL.length - 1) != '/') {
        			params.Zabbix_URL = params.Zabbix_URL + '/';
        		}
        
        		params['X-S4-ExternalID'] = params['X-S4-ExternalID'] + ' ZabbixURL: ' +  params.Zabbix_URL;
        
        		// Add Link parameter
        		params['Link'] = params.Zabbix_URL + "tr_events.php?triggerid="+params.Trigger_ID + "&eventid=" + params.Event_ID;
        	}
        
        	// Check if this is a new problem or a recovery
        	if (params.Trigger_Status == 'OK') {
        		params['X-S4-Status'] = 'resolved';
        	}
        	else {
        		params['X-S4-Status'] = 'new';
        		params['X-S4-SourceSystem'] = 'Zabbix';
        	}
        
            payload = JSON.stringify(params);
            Zabbix.log(4, '[ SIGNL4 Webhook ] Sending request: ' + payload);
        
            request.addHeader('Content-Type: application/json');
            response = request.post(endpoint, 'payload=' + payload);
        
            Zabbix.log(4, '[ SIGNL4 Webhook ] Received response with status code ' +
                    request.getStatus() + '\n' + response
            );
        
            if (request.getStatus() !== 201) {
                throw 'Request failed with status code ' + request.getStatus() +
                        '. Check debug log for more information.';
            }
        
            return 'OK';
        }
        catch (error) {
            Zabbix.log(4, '[ SIGNL4 Webhook ] ERROR: ' + error);
        
            throw 'Sending failed: ' + error;
        }
      description: |
        SIGNL4 is a mobile alert notification app for powerful alerting, alert management and mobile assignment of work items. It offers alerting via app push, SMS and voice calls including escalations, tracking, and duty scheduling.
        
        Get the app at https://www.signl4.com.
        
        Find out more including an integration video here: https://www.signl4.com/blog/portfolio_item/zabbix-mobile-alert-notification-duty-schedule-escalation/
        
      message_templates:
        -
          event_source: TRIGGERS
          operation_mode: PROBLEM
          subject: 'Problem: {EVENT.NAME}'
          message: |
            Problem started at {EVENT.TIME} on {EVENT.DATE}
            Problem name: {EVENT.NAME}
            Host: {HOST.NAME}
            Severity: {EVENT.SEVERITY}
            Operational data: {EVENT.OPDATA}
            Original problem ID: {EVENT.ID}
            {TRIGGER.URL}
        -
          event_source: TRIGGERS
          operation_mode: RECOVERY
          subject: 'Resolved: {EVENT.NAME}'
          message: |
            Problem has been resolved in {EVENT.DURATION} at {EVENT.RECOVERY.TIME} on {EVENT.RECOVERY.DATE}
            Problem name: {EVENT.NAME}
            Host: {HOST.NAME}
            Severity: {EVENT.SEVERITY}
            Original problem ID: {EVENT.ID}
            {TRIGGER.URL}
        -
          event_source: TRIGGERS
          operation_mode: UPDATE
          subject: 'Updated problem: {EVENT.NAME}'
          message: |
            {USER.FULLNAME} {EVENT.UPDATE.ACTION} problem at {EVENT.UPDATE.DATE} {EVENT.UPDATE.TIME}.
            {EVENT.UPDATE.MESSAGE}
            
            Current problem status is {EVENT.STATUS}, acknowledged: {EVENT.ACK.STATUS}.
        -
          event_source: DISCOVERY
          operation_mode: PROBLEM
          subject: 'Discovery: {DISCOVERY.DEVICE.STATUS} {DISCOVERY.DEVICE.IPADDRESS}'
          message: |
            Discovery rule: {DISCOVERY.RULE.NAME}
            
            Device IP: {DISCOVERY.DEVICE.IPADDRESS}
            Device DNS: {DISCOVERY.DEVICE.DNS}
            Device status: {DISCOVERY.DEVICE.STATUS}
            Device uptime: {DISCOVERY.DEVICE.UPTIME}
            
            Device service name: {DISCOVERY.SERVICE.NAME}
            Device service port: {DISCOVERY.SERVICE.PORT}
            Device service status: {DISCOVERY.SERVICE.STATUS}
            Device service uptime: {DISCOVERY.SERVICE.UPTIME}
        -
          event_source: AUTOREGISTRATION
          operation_mode: PROBLEM
          subject: 'Autoregistration: {HOST.HOST}'
          message: |
            Host name: {HOST.HOST}
            Host IP: {HOST.IP}
            Agent port: {HOST.PORT}
