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.
233 lines
8.8 KiB
233 lines
8.8 KiB
1 year ago
|
zabbix_export:
|
||
|
version: '7.0'
|
||
|
media_types:
|
||
|
-
|
||
|
name: Line
|
||
|
type: WEBHOOK
|
||
|
parameters:
|
||
|
-
|
||
|
name: alert_message
|
||
|
value: '{ALERT.MESSAGE}'
|
||
|
-
|
||
|
name: alert_subject
|
||
|
value: '{ALERT.SUBJECT}'
|
||
|
-
|
||
|
name: bot_token
|
||
|
value: '<PLACE BOT TOKEN>'
|
||
|
-
|
||
|
name: event_id
|
||
|
value: '{EVENT.ID}'
|
||
|
-
|
||
|
name: event_nseverity
|
||
|
value: '{EVENT.NSEVERITY}'
|
||
|
-
|
||
|
name: event_source
|
||
|
value: '{EVENT.SOURCE}'
|
||
|
-
|
||
|
name: event_update_status
|
||
|
value: '{EVENT.UPDATE.STATUS}'
|
||
|
-
|
||
|
name: event_value
|
||
|
value: '{EVENT.VALUE}'
|
||
|
-
|
||
|
name: send_to
|
||
|
value: '{ALERT.SENDTO}'
|
||
|
-
|
||
|
name: trigger_description
|
||
|
value: '{TRIGGER.DESCRIPTION}'
|
||
|
-
|
||
|
name: trigger_id
|
||
|
value: '{TRIGGER.ID}'
|
||
|
-
|
||
|
name: zabbix_url
|
||
|
value: '{$ZABBIX.URL}'
|
||
|
script: |
|
||
|
function sendMessage(to, messages, params) {
|
||
|
var response,
|
||
|
request = new HttpRequest();
|
||
|
|
||
|
if (typeof params.HTTPProxy === 'string' && params.HTTPProxy.trim() !== '') {
|
||
|
request.setProxy(params.HTTPProxy);
|
||
|
}
|
||
|
|
||
|
request.addHeader('Content-Type: application/json');
|
||
|
request.addHeader('Authorization: Bearer ' + params.bot_token);
|
||
|
|
||
|
response = request.post('https://api.line.me/v2/bot/message/push', JSON.stringify({
|
||
|
"to": to,
|
||
|
"messages": messages
|
||
|
}));
|
||
|
|
||
|
if (request.getStatus() !== 200) {
|
||
|
throw response;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function validateParams(params) {
|
||
|
if (typeof params.bot_token !== 'string' || params.bot_token.trim() === '') {
|
||
|
throw 'Field "bot_token" cannot be empty';
|
||
|
}
|
||
|
|
||
|
if ([0, 1, 2, 3].indexOf(parseInt(params.event_source)) === -1) {
|
||
|
throw 'Incorrect "event_source" parameter given: "' + params.event_source + '".\nMust be 0-3.';
|
||
|
}
|
||
|
|
||
|
if (params.event_source !== '0') {
|
||
|
params.event_nseverity = '0';
|
||
|
params.event_severity = 'Not classified';
|
||
|
params.event_update_status = '0';
|
||
|
}
|
||
|
|
||
|
if (params.event_source === '1' || params.event_source === '2') {
|
||
|
params.event_value = '1';
|
||
|
}
|
||
|
|
||
|
if ([0, 1, 2, 3, 4, 5].indexOf(parseInt(params.event_nseverity)) === -1) {
|
||
|
throw 'Incorrect "event_nseverity" parameter given: ' + params.event_nseverity + '\nMust be 0-5.';
|
||
|
}
|
||
|
|
||
|
if (params.event_update_status !== '0' && params.event_update_status !== '1') {
|
||
|
throw 'Incorrect "event_update_status" parameter given: ' + params.event_update_status + '\nMust be 0 or 1.';
|
||
|
}
|
||
|
|
||
|
if (params.event_value !== '0' && params.event_value !== '1') {
|
||
|
throw 'Incorrect "event_value" parameter given: ' + params.event_value + '\nMust be 0 or 1.';
|
||
|
}
|
||
|
|
||
|
if (isNaN(params.trigger_id) && params.event_source === '0') {
|
||
|
throw 'field "trigger_id" is not a number';
|
||
|
}
|
||
|
|
||
|
if (typeof params.zabbix_url !== 'string' || params.zabbix_url.trim() === '') {
|
||
|
throw 'Field "zabbix_url" cannot be empty';
|
||
|
}
|
||
|
|
||
|
if (!/^(http|https):\/\/.+/.test(params.zabbix_url)) {
|
||
|
throw 'Field "zabbix_url" must contain a schema';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function getZabbixProblemLink(params) {
|
||
|
return params.zabbix_url + (params.zabbix_url.endsWith('/') ? '' : '/') + 'tr_events.php?triggerid=' + params.trigger_id + '&eventid=' + params.event_id;
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
var params = JSON.parse(value);
|
||
|
|
||
|
validateParams(params);
|
||
|
|
||
|
severity_emoji = [
|
||
|
"\u26AA",
|
||
|
"\uD83D\uDD35",
|
||
|
"\uD83D\uDFE4",
|
||
|
"\uD83D\uDFE1",
|
||
|
"\uD83D\uDFE0",
|
||
|
"\uD83D\uDD34",
|
||
|
];
|
||
|
|
||
|
// If its a trigger and a recovery operation and not an update operation.
|
||
|
if (params.event_source === '0' && params.event_value === '0' && params.event_update_status === '0') {
|
||
|
var line_message = [
|
||
|
{
|
||
|
"type": "text",
|
||
|
"text": '\u2705 ' + params.alert_subject + '\n\n' + params.alert_message + '\n' + params.trigger_description + '\n\n' + getZabbixProblemLink(params)
|
||
|
}
|
||
|
];
|
||
|
}
|
||
|
// If its a trigger and its a problem.
|
||
|
else if (params.event_source === '0' && params.event_value === '1') {
|
||
|
var line_message = [
|
||
|
{
|
||
|
"type": "text",
|
||
|
"text": severity_emoji[params.event_nseverity] + ' ' + params.alert_subject + '\n\n' + params.alert_message + '\n' + params.trigger_description + '\n\n' + getZabbixProblemLink(params)
|
||
|
}
|
||
|
];
|
||
|
}
|
||
|
// If its a trigger and its an update operation.
|
||
|
else if (params.event_source === '0' && params.event_update_status === '1') {
|
||
|
var line_message = [
|
||
|
{
|
||
|
"type": "text",
|
||
|
"text": '\u2733 ' + severity_emoji[params.event_nseverity] + ' ' + params.alert_subject + '\n\n' + params.alert_message + '\n' + params.trigger_description + '\n\n' + getZabbixProblemLink(params)
|
||
|
}
|
||
|
];
|
||
|
}
|
||
|
else {
|
||
|
var line_message = [
|
||
|
{
|
||
|
"type": "text",
|
||
|
"text": params.alert_subject + '\n\n' + params.alert_message + '\n'
|
||
|
}
|
||
|
];
|
||
|
}
|
||
|
|
||
|
sendMessage(params.send_to, line_message, params);
|
||
|
|
||
|
return 'OK';
|
||
|
}
|
||
|
catch (err) {
|
||
|
Zabbix.log(4, '[ Line Webhook ] Line notification failed : ' + err);
|
||
|
throw 'Line notification failed : ' + err;
|
||
|
}
|
||
|
description: |
|
||
|
Please refer to setup guide here: https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates/media/line
|
||
|
|
||
|
Set bot_token parameter to your Line bot token.
|
||
|
When assigning Line media to the Zabbix user - add the ID of the target recipient. Use a userId, groupId, or roomId value.
|
||
|
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}
|
||
|
-
|
||
|
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}
|
||
|
-
|
||
|
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: 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}
|