zabbix_export:
  version: '7.0'
  media_types:
    -
      name: iLert
      type: WEBHOOK
      parameters:
        -
          name: .ILERT.ALERT.SOURCE.KEY
          value: '{ALERT.SENDTO}'
        -
          name: .ILERT.INCIDENT.SUMMARY
          value: ''
        -
          name: ALERT.MESSAGE
          value: '{ALERT.MESSAGE}'
        -
          name: ALERT.SUBJECT
          value: '{ALERT.SUBJECT}'
        -
          name: EVENT.ACK.STATUS
          value: '{EVENT.ACK.STATUS}'
        -
          name: EVENT.DATE
          value: '{EVENT.DATE}'
        -
          name: EVENT.ID
          value: '{EVENT.ID}'
        -
          name: EVENT.NAME
          value: '{EVENT.NAME}'
        -
          name: EVENT.NSEVERITY
          value: '{EVENT.NSEVERITY}'
        -
          name: EVENT.OPDATA
          value: '{EVENT.OPDATA}'
        -
          name: EVENT.RECOVERY.DATE
          value: '{EVENT.RECOVERY.DATE}'
        -
          name: EVENT.RECOVERY.TIME
          value: '{EVENT.RECOVERY.TIME}'
        -
          name: EVENT.RECOVERY.VALUE
          value: '{EVENT.RECOVERY.VALUE}'
        -
          name: EVENT.SEVERITY
          value: '{EVENT.SEVERITY}'
        -
          name: EVENT.TAGS
          value: '{EVENT.TAGS}'
        -
          name: EVENT.TIME
          value: '{EVENT.TIME}'
        -
          name: EVENT.UPDATE.ACTION
          value: '{EVENT.UPDATE.ACTION}'
        -
          name: EVENT.UPDATE.DATE
          value: '{EVENT.UPDATE.DATE}'
        -
          name: EVENT.UPDATE.MESSAGE
          value: '{EVENT.UPDATE.MESSAGE}'
        -
          name: EVENT.UPDATE.STATUS
          value: '{EVENT.UPDATE.STATUS}'
        -
          name: EVENT.UPDATE.TIME
          value: '{EVENT.UPDATE.TIME}'
        -
          name: EVENT.VALUE
          value: '{EVENT.VALUE}'
        -
          name: HOST.HOST
          value: '{HOST.HOST}'
        -
          name: HOST.IP
          value: '{HOST.IP}'
        -
          name: HOST.NAME
          value: '{HOST.NAME}'
        -
          name: ITEM.ID1
          value: '{ITEM.ID1}'
        -
          name: ITEM.ID2
          value: '{ITEM.ID2}'
        -
          name: ITEM.ID3
          value: '{ITEM.ID3}'
        -
          name: ITEM.ID4
          value: '{ITEM.ID4}'
        -
          name: ITEM.ID5
          value: '{ITEM.ID5}'
        -
          name: ITEM.NAME1
          value: '{ITEM.NAME1}'
        -
          name: ITEM.NAME2
          value: '{ITEM.NAME2}'
        -
          name: ITEM.NAME3
          value: '{ITEM.NAME3}'
        -
          name: ITEM.NAME4
          value: '{ITEM.NAME4}'
        -
          name: ITEM.NAME5
          value: '{ITEM.NAME5}'
        -
          name: TRIGGER.DESCRIPTION
          value: '{TRIGGER.DESCRIPTION}'
        -
          name: TRIGGER.ID
          value: '{TRIGGER.ID}'
        -
          name: TRIGGER.NAME
          value: '{TRIGGER.NAME}'
        -
          name: TRIGGER.SEVERITY
          value: '{TRIGGER.SEVERITY}'
        -
          name: TRIGGER.STATUS
          value: '{TRIGGER.STATUS}'
        -
          name: TRIGGER.URL
          value: '{TRIGGER.URL}'
        -
          name: TRIGGER.VALUE
          value: '{TRIGGER.VALUE}'
        -
          name: USER.FULLNAME
          value: '{USER.FULLNAME}'
        -
          name: ZABBIX.URL
          value: '{$ZABBIX.URL}'
      script: |
        try {
            var result = { tags: {} },
                params = JSON.parse(value),
                req = new HttpRequest(),
                resp = '';
        
            if (typeof params.HTTPProxy === 'string' && params.HTTPProxy.trim() !== '') {
                req.setProxy(params.HTTPProxy);
            }
            var alertSourceKey = params['.ILERT.ALERT.SOURCE.KEY'];
            if (!alertSourceKey || (typeof alertSourceKey === 'string' && alertSourceKey.trim() === '')) {
                throw 'incorrect value for variable "ILERT.ALERT.SOURCE.KEY". The value must be a non-empty string.';
            }
            delete params['.ILERT.ALERT.SOURCE.KEY'];
            
            var ilertApiBaseURL = "https://api.ilert.com";
            var reqURL = encodeURI(ilertApiBaseURL + "/api/v1/events/zabbix-mt/" + alertSourceKey)
        
            var incidentKey = "zabbix-" + params['EVENT.ID'];
            var incidentViewURL = ilertApiBaseURL + "/api/v1/incidents/resolve-ik/" + alertSourceKey + "/" + incidentKey;
        
            req.addHeader('Accept: application/json');
            req.addHeader('Content-Type: application/json');
        
            Zabbix.log(4, '[iLert Webhook] Sending request:' + JSON.stringify(params));
            resp = req.post(reqURL, JSON.stringify(params));
            Zabbix.log(4, '[iLert Webhook] Receiving response:' + resp);
        
            try {
                resp = JSON.parse(resp);
            }
            catch (error) {
                throw 'incorrect response. iLert returned a non-JSON object.';
            }
        
            if (req.getStatus() == 200) {
                result.tags.__ilert_incident_url = incidentViewURL;
                return JSON.stringify(result);
            }
        
            if (req.getStatus() == 400 && typeof resp === 'object' && typeof resp.code === 'string') {
                if (resp.code === 'NO_OPEN_INCIDENT_WITH_KEY') {
                  return JSON.stringify(result);
                }
                if (resp.code === 'INCIDENT_ALREADY_ACCEPTED') {
                  result.tags.__ilert_incident_url = incidentViewURL;
                  return JSON.stringify(result);
                }
            }
        
            if (typeof resp === 'object' && typeof resp.message === 'string') {
                throw resp.message;
            }
            else {
                throw 'Unknown error.';
            }
        }
        catch (error) {
            Zabbix.log(3, '[iLert Webhook] Notification failed : ' + error);
            throw 'iLert notification failed : ' + error;
        }
      process_tags: 'YES'
      show_event_menu: 'YES'
      event_menu_url: '{EVENT.TAGS.__ilert_incident_url}'
      event_menu_name: 'iLert incident'
      description: |
        Please refer to https://docs.ilert.com/integrations/zabbix/native 
          
        Set global macro {$ZABBIX.URL} with your Zabbix server URL.
        Add a dedicated user with the media type "iLert". You can also rewrite the incident summary via ".ILERT.INCIDENT.SUMMARY" parameter or leave it empty to use the standard pattern.
      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: UPDATE
          subject: 'Updated problem in {EVENT.AGE}: {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}, age is {EVENT.AGE}, acknowledged: {EVENT.ACK.STATUS}.
        -
          event_source: TRIGGERS
          operation_mode: RECOVERY
          subject: 'Resolved in {EVENT.DURATION}: {EVENT.NAME}'
          message: |
            Problem has been resolved at {EVENT.RECOVERY.TIME} on {EVENT.RECOVERY.DATE}
            Problem name: {EVENT.NAME}
            Problem duration: {EVENT.DURATION}
            Host: {HOST.NAME}
            Severity: {EVENT.SEVERITY}
            Original problem ID: {EVENT.ID}
            {TRIGGER.URL}