You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

224 lines
7.7 KiB

zabbix_export:
version: '7.0'
media_types:
-
name: 'Event-Driven Ansible'
type: WEBHOOK
parameters:
-
name: acknowledged
value: '{EVENT.ACK.STATUS}'
-
name: endpoint
value: /endpoint
-
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_object
value: '{EVENT.OBJECT}'
-
name: event_severity
value: '{EVENT.SEVERITY}'
-
name: event_source
value: '{EVENT.SOURCE}'
-
name: event_tags
value: '{EVENT.TAGSJSON}'
-
name: event_time
value: '{EVENT.TIME}'
-
name: event_value
value: '{EVENT.VALUE}'
-
name: host_groups
value: '{TRIGGER.HOSTGROUP.NAME}'
-
name: host_host
value: '{HOST.HOST}'
-
name: host_id
value: '{HOST.ID}'
-
name: host_ip
value: '{HOST.IP}'
-
name: host_port
value: '{HOST.PORT}'
-
name: HTTPProxy
-
name: monitoring_source
value: 'Zabbix sever'
-
name: operation_data
value: '{EVENT.OPDATA}'
-
name: send_to
value: '{ALERT.SENDTO}'
-
name: subject
value: '{ALERT.SUBJECT}'
-
name: trigger_description
value: '{TRIGGER.DESCRIPTION}'
-
name: trigger_id
value: '{TRIGGER.ID}'
-
name: trigger_name
value: '{TRIGGER.NAME}'
script: |
var Eda = {
params: {},
setParams: function (params) {
var required_params = [
'send_to',
'event_source',
'event_value',
'event_date',
'event_time'],
integer_fields = [
'event_id',
'event_nseverity',
'event_object',
'event_source',
'event_value',
'host_id',
'trigger_id'];
required_params.forEach(function (field) {
if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') {
throw 'Required param is not set: "' + field + '".';
}
});
Eda.params = params;
integer_fields.forEach(function (key) {
if (typeof Eda.params[key] !== 'undefined') {
if (isNaN(Eda.params[key])) {
throw 'Parameter "' + key + '" must be integer. Given value: ' + Eda.params[key];
}
Eda.params[key] = parseInt(Eda.params[key]);
}
});
// Check type of event. Possible values: 0 - Trigger
if (params.event_source != 0) {
throw ('Incorrect "event_source" parameter given: ' + params.event_source
+ '\nOnly trigger-based events are supported');
}
// Check trigger update and trigger resolve events
if (params.event_source == 0 && params.event_value != 1) {
throw ('Incorrect "event_value" parameter given: "' + params.event_value
+ '".\nOnly trigger-based events of problem are supported');
}
// Check endpoint
Eda.params.endpoint = (Eda.params.endpoint.startsWith('/'))
? Eda.params.endpoint : '/' + Eda.params.endpoint;
// Prepare groups
Eda.params.host_groups = (typeof Eda.params['host_groups'] !== 'undefined')
? this.prepareHostgroups(Eda.params.host_groups): []
// Prepare tags
Eda.params.event_tags = (typeof Eda.params['event_tags'] !== 'undefined')
? this.transformTags(Eda.params.event_tags): {}
// Prepare timestamp
Eda.params.event_datetime_timestamp = this.getTimestamp(
Eda.params.event_date, Eda.params.event_time)
},
setProxy: function (HTTPProxy) {
Eda.HTTPProxy = HTTPProxy;
},
prepareHostgroups: function (hostgroups) {
var host_groups = [];
hostgroups.split(',').forEach(function (group) {
group = group.trim();
if (group.length > 0) {
host_groups.push(group);
}
});
return host_groups;
},
getTimestamp: function (date, time) {
try {
return Date.parse(date.split('.').join('-') + 'T' + time + '.000Z') / 1000 + new Date().getTimezoneOffset() * 60;
} catch (_) {}
throw ('Failed to parse event time.');
},
transformTags: function (event_tags) {
var tags = {};
if (event_tags) {
try {
JSON.parse(event_tags).forEach(function (object) {
var tag = object['tag'];
tags[tag] = tags[tag] || [];
tags[tag].push(object['value']);
});
} catch (error) {
throw 'Event tags format is invalid.';
}
}
return tags;
},
sendMessage: function () {
var response, request = new HttpRequest();
var url = Eda.params['send_to'] + Eda.params['endpoint'];
var data = JSON.stringify(Eda.params);
Zabbix.log(4, '[ Event-Driven Ansible webhook ] URL: ' + url + ' data: ' + data);
if (typeof Eda.HTTPProxy !== 'undefined' && Eda.HTTPProxy !== '') {
request.setProxy(Eda.HTTPProxy);
}
request.addHeader('Content-Type: application/json');
response = request.post(url, data);
Zabbix.log(4, '[ Event-Driven Ansible webhook ] HTTP code: ' + request.getStatus()
+ ' response: ' + response);
if (request.getStatus() !== 200) {
throw 'Request failed with status code ' + request.getStatus() + ': ' + response;
}
}
};
try {
var params = JSON.parse(value);
Eda.setParams(params);
Eda.setProxy(params.HTTPProxy);
Eda.sendMessage();
return true;
}
catch (error) {
Zabbix.log(3, '[ Event-Driven Ansible webhook ] notification failed: ' + error);
throw 'Sending failed: ' + error;
}
message_templates:
-
event_source: TRIGGERS
operation_mode: PROBLEM
subject: 'Event ID: {EVENT.ID}, Host: {HOST.HOST}, Problem: {EVENT.NAME}'