-- Copyright (C) 2001-2025 Zabbix SIA
-- This program is free software: you can redistribute it and/or modify it under the terms of
-- the GNU Affero General Public License as published by the Free Software Foundation, version 3.
-- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-- without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- See the GNU Affero General Public License for more details.
-- You should have received a copy of the GNU Affero General Public License along with this program.
-- If not, see <https://www.gnu.org/licenses/>.
FIELDS|roleid|name |type|readonly|
ROW |1 |User role |1 |0 |
ROW |2 |Admin role |2 |0 |
ROW |3 |Super admin role|3 |1 |
ROW |4 |Guest role |1 |0 |
ROW |1 |b21d61561974b06cbeb97a71ca880e92f0fc06d49ac3246280afb88dfa6050a6|
FIELDS|userid|username|name |surname |passwd |url |autologin|autologout|refresh|rows_per_page|roleid|
ROW |1 |Admin |Zabbix|Administrator|$2y$10$92nDno4n0Zm7Ej7Jfsz8WukBfgSS/U0QkIuu8WkJPihXBb2A1UrEK| |1 |0 |30s |50 |3 |
ROW |2 |guest | | |$2y$10$89otZrRNmde97rIyzclecuk6LwKAsHN0BcvoOKGjbT.BwMBfm7G06| |0 |15m |30s |50 |4 |
FIELDS|groupid|name |flags|uuid |type|
ROW |1 |Templates |0 |7df96b18c230490a9a0a9e2307226338|1 |
ROW |2 |Linux servers |0 |dc579cd7a1a34222933f24f52a68bcd8|0 |
ROW |4 |Zabbix servers |0 |6f6799aa69e844b4b3918f779f2abf08|0 |
ROW |5 |Discovered hosts |0 |f2481361f99448eea617b7b1d4765566|0 |
ROW |6 |Virtual machines |0 |137f19e6e2dc4219b33553b812627bc2|0 |
ROW |7 |Hypervisors |0 |1b837a3c078647049a0c00c61b4d57b5|0 |
ROW |9 |Templates/Network devices |0 |36bff6c29af64692839d077febfc7079|1 |
ROW |10 |Templates/Operating systems |0 |846977d1dfed4968bc5f8bdb363285bc|1 |
ROW |11 |Templates/Server hardware |0 |e960332b3f6c46a1956486d4f3f99fce|1 |
ROW |12 |Templates/Applications |0 |a571c0d144b14fd4a87a9d9b2aa9fcd6|1 |
ROW |13 |Templates/Databases |0 |748ad4d098d447d492bb935c907f652f|1 |
ROW |14 |Templates/Virtualization |0 |02e4df4f20b848e79267641790f241da|1 |
ROW |15 |Templates/Telephony |0 |1d12408342854fd5a4436dd6d5d1bd4a|1 |
ROW |16 |Templates/SAN |0 |7c2cb727f85b492d88cd56e17127c64d|1 |
ROW |17 |Templates/Video surveillance|0 |d37f71c7e3f7469bab645852a69a2018|1 |
ROW |18 |Templates/Power |0 |3dcd5bbe90534f9e8eb5c2d53756af63|1 |
ROW |19 |Applications |0 |a571c0d144b14fd4a87a9d9b2aa9fcd6|0 |
ROW |20 |Databases |0 |748ad4d098d447d492bb935c907f652f|0 |
ROW |21 |Templates/Cloud |0 |c2c162144c2d4c5491c8801193af4945|1 |
FIELDS|druleid|proxyid|name |iprange |delay|status|concurrency_max|
ROW |2 |NULL |Local network|192.168.0.1-254|1h |1 |0 |
FIELDS|dcheckid|druleid|type|key_ |snmp_community|ports|snmpv3_securityname|snmpv3_securitylevel|snmpv3_authpassphrase|snmpv3_privpassphrase|uniq|snmpv3_authprotocol|snmpv3_privprotocol|snmpv3_contextname|host_source|name_source|allow_redirect|
ROW |2 |2 |9 |system.uname| |10050| |0 | | |0 |0 |0 | |1 |0 |0 |
FIELDS|mediatypeid|type|name |smtp_server |smtp_helo |smtp_email |exec_path|gsm_modem |username|passwd|smtp_port|smtp_security|smtp_verify_peer|smtp_verify_host|smtp_authentication|maxsessions|maxattempts|attempt_interval|message_format|script |timeout|process_tags|show_event_menu|event_menu_url |event_menu_name |description |provider|
ROW |1 |0 |Email |mail.example.com |example.com|zabbix@example.com| | | | |25 |0 |0 |0 |0 |1 |3 |10s |0 | |30s |0 |0 | | | |0 |
ROW |3 |2 |SMS | | | | |/dev/ttyS0| | |25 |0 |0 |0 |0 |1 |3 |10s |1 | |30s |0 |0 | | | |0 |
ROW |4 |0 |Email (HTML) |mail.example.com |example.com|zabbix@example.com| | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 | |30s |0 |0 | | | |0 |
ROW |5 |4 |Mattermost | | | | | | | |25 |0 |0 |0 |0 |1 |1 |10s |1 |var SEVERITY_COLORS = [&eol; '#97AAB3', '#7499FF', '#FFC859',&eol; '#FFA059', '#E97659', '#E45959'&eol;];&eol;&eol;var RESOLVE_COLOR = '#009900';&eol;&eol;var SEND_MODE_HANDLERS = {&eol; alarm: handlerAlarm,&eol; event: handlerEvent&eol;};&eol;&eol;if (!String.prototype.format) {&eol; String.prototype.format = function() {&eol; var args = arguments;&eol;&eol; return this.replace(/{(\d+)}/g, function(match, number) {&eol; return number in args&eol; ? args[number]&eol; : match&eol; ;&eol; });&eol; };&eol;}&eol;&eol;function isEventProblem(params) {&eol; return params.event_value == 1&eol; && params.event_update_status == 0&eol; ;&eol;}&eol;&eol;function isEventUpdate(params) {&eol; return params.event_value == 1&eol; && params.event_update_status == 1&eol; ;&eol;}&eol;&eol;function isEventResolve(params) {&eol; return params.event_value == 0;&eol;}&eol;&eol;function getPermalink(mattermost_url, team_name, postid) {&eol; return '{0}/{1}/pl/{2}'.format(&eol; mattermost_url.replace(/\/+$/, ''),&eol; team_name,&eol; postid&eol; );&eol;}&eol;&eol;function getChannel(send_to) {&eol; switch (true) {&eol; case /.+\/#.+/.test(send_to):&eol; return getChannelByName(send_to);&eol;&eol; case /@.+/.test(send_to):&eol; return getDirectChannel(send_to);&eol;&eol; default:&eol; return getChannelByID(send_to);&eol; }&eol;}&eol;&eol;function getChannelByName(send_to) {&eol; var team_chan = send_to&eol; .trim()&eol; .split('/#');&eol;&eol; var resp = JSON.parse(req.get(&eol; Mattermost.channel_byname.format(team_chan[0], team_chan[1]),&eol; JSON.stringify(fields)&eol; )&eol; );&eol;&eol; if (req.getStatus() != 200) {&eol; throw '[{0}] {1}'.format(resp.status_code, resp.message);&eol; }&eol;&eol; return resp;&eol;}&eol;&eol;function getDirectChannel(send_to) {&eol; Zabbix.log(5, '[ Mattermost Webhook ] Call {0}({1})'.format(&eol; arguments.callee.name,&eol; JSON.stringify(arguments)&eol; ));&eol;&eol; var teamUser = send_to&eol; .trim()&eol; .split('/@'),&eol; bot = getBotUser(),&eol; user = getUserByName(teamUser[1]);&eol;&eol; var resp = JSON.parse(req.post(&eol; Mattermost.direct_channel,&eol; JSON.stringify([bot.id, user.id])&eol; )&eol; );&eol;&eol; Zabbix.log(5, '[ Mattermost Webhook ] Result {0}: {1}'.format(&eol; arguments.callee.name,&eol; JSON.stringify(resp)&eol; ));&eol;&eol; if (req.getStatus() != 201) {&eol; throw '[{0}] {1}'.format(resp.status_code, resp.message);&eol; }&eol;&eol; resp.team_name = teamUser[0];&eol;&eol; return resp;&eol;}&eol;&eol;function getChannelByID(channelID) {&eol; Zabbix.log(5, '[ Mattermost Webhook ] Call {0}({1})'.format(&eol; arguments.callee.name,&eol; JSON.stringify(arguments)&eol; ));&eol;&eol; var resp = JSON.parse(req.get(&eol; Mattermost.get_channel.format(channelID),&eol; JSON.stringify(fields)&eol; )&eol; );&eol;&eol; Zabbix.log(5, '[ Mattermost Webhook ] Result {0}: {1}'.format(&eol; arguments.callee.name,&eol; JSON.stringify(resp)&eol; ));&eol;&eol; if (req.getStatus() != 200) {&eol; throw '[{0}] {1}'.format(resp.status_code, resp.message);&eol; }&eol;&eol; return resp;&eol;}&eol;&eol;function getBotUser() {&eol; Zabbix.log(5, '[ Mattermost Webhook ] Call {0}({1})'.format(&eol; arguments.callee.name,&eol; JSON.stringify(arguments)&eol; ));&eol;&eol; var resp = JSON.parse(req.get(&eol; Mattermost.bot_user,&eol; JSON.stringify(fields)&eol; )&eol; );&eol;&eol; Zabbix.log(5, '[ Mattermost Webhook ] Result {0}: {1}'.format(&eol; arguments.callee.name,&eol; JSON.stringify(resp)&eol; ));&eol;&eol; if (req.getStatus() != 200) {&eol; throw '[{0}] {1}'.format(resp.status_code, resp.message);&eol; }&eol;&eol; return resp;&eol;}&eol;&eol;function getUserByName(userName) {&eol; Zabbix.log(5, '[ Mattermost Webhook ] Call {0}({1})'.format(&eol; arguments.callee.name,&eol; JSON.stringify(arguments)&eol; ));&eol;&eol; var resp = JSON.parse(req.get(&eol; Mattermost.user_byname.format(userName),&eol; JSON.stringify(fields)&eol; )&eol; );&eol;&eol; Zabbix.log(5, '[ Mattermost Webhook ] Result {0}: {1}'.format(&eol; arguments.callee.name,&eol; JSON.stringify(resp)&eol; ));&eol;&eol; if (req.getStatus() != 200) {&eol
ROW |6 |4 |Opsgenie | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var method,&eol; Media = {&eol; params: {},&eol; name: '',&eol; labels: [],&eol; HTTPProxy: '',&eol;&eol; setParams: function (params) {&eol; if (typeof params !== 'object') {&eol; return;&eol; }&eol;&eol; Media.params = params;&eol; Media.params.api += Media.params.api.endsWith('/') ? '' : '/';&eol; Media.params.web += Media.params.web.endsWith('/') ? '' : '/';&eol; },&eol;&eol; setProxy: function (HTTPProxy) {&eol; if (typeof HTTPProxy !== 'undefined' && HTTPProxy.trim() !== '') {&eol; Media.HTTPProxy = HTTPProxy;&eol; }&eol; },&eol;&eol; setTags: function(event_tags_json) {&eol; if (typeof event_tags_json !== 'undefined' && event_tags_json !== ''&eol; && event_tags_json !== '{EVENT.TAGSJSON}') {&eol;&eol; try {&eol; var tags = JSON.parse(event_tags_json),&eol; label;&eol;&eol; tags.forEach(function (tag) {&eol; if (typeof tag.tag === 'string') {&eol; label = (tag.tag + (typeof tag.value !== 'undefined'&eol; && tag.value !== '' ? (':' + tag.value) : '')).replace(/\s/g, '_');&eol; Media.labels.push(label);&eol; }&eol; });&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ ' + Media.name + ' Webhook ] Failed to parse "event_tags_json" param');&eol; }&eol; }&eol; },&eol;&eol; request: function (method, query, data, allow_404) {&eol; if (typeof(allow_404) === 'undefined') {&eol; allow_404 = false;&eol; }&eol;&eol; ['api', 'token'].forEach(function (field) {&eol; if (typeof Media.params !== 'object' &pipe;&pipe; typeof Media.params[field] === 'undefined'&eol; &pipe;&pipe; Media.params[field] === '') {&eol; throw 'Required ' + Media.name + ' param is not set: "' + field + '".';&eol; }&eol; });&eol;&eol; var response,&eol; url = Media.params.api + query,&eol; request = new HttpRequest();&eol;&eol; request.addHeader('Content-Type: application/json');&eol; request.addHeader('Authorization: ' + Media.params.token);&eol; request.setProxy(Media.HTTPProxy);&eol;&eol; if (typeof data !== 'undefined') {&eol; data = JSON.stringify(data);&eol; }&eol;&eol; Zabbix.log(4, '[ ' + Media.name + ' Webhook ] Sending request: ' +&eol; url + ((typeof data === 'string') ? ('\n' + data) : ''));&eol;&eol; switch (method) {&eol; case 'get':&eol; response = request.get(url, data);&eol; break;&eol;&eol; case 'post':&eol; response = request.post(url, data);&eol; break;&eol;&eol; case 'put':&eol; response = request.put(url, data);&eol; break;&eol;&eol; default:&eol; throw 'Unsupported HTTP request method: ' + method;&eol; }&eol;&eol; Zabbix.log(4, '[ ' + Media.name + ' Webhook ] Received response with status code ' +&eol; request.getStatus() + '\n' + response);&eol;&eol; if (response !== null) {&eol; try {&eol; response = JSON.parse(response);&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ ' + Media.name + ' Webhook ] Failed to parse response.');&eol; response = null;&eol; }&eol; }&eol;&eol; if ((request.getStatus() < 200 &pipe;&pipe; request.getStatus() >= 300)&eol; && (!allow_404 &pipe;&pipe; request.getStatus() !== 404)) {&eol; var message = 'Request failed with status code ' + request.getStatus();&eol;&eol; if (response !== null) {&eol; if (typeof response.errors === 'object' && Object.keys(response.errors).length > 0) {&eol; message += ': ' + JSON.stringify(response.errors);&eol; }&eol; else if (typeof response.errorMessages === 'object' && Object.keys(response.errorMessages).length > 0) {&eol; message += ': ' + JSON.stringify(response.errorMessages);&eol; }&eol; else if (typeof response.message === 'string') {&eol; message += ': ' + response.message;&eol; }&eol; }&eol;&eol; throw message + ' Check debug log for more information.';&eol; }&eol;&eol; return {&eol; status: request.getSta
ROW |7 |4 |PagerDuty | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |try {&eol;&eol; var params = JSON.parse(value),&eol; req = new HttpRequest(),&eol; fields = {},&eol; resp = '';&eol;&eol; // Correspondence between the PagerDuty and Zabbix severity level&eol; var severityMapping = [&eol; 'info', // Not classified&eol; 'info', // Information&eol; 'warning', // Warning&eol; 'warning', // Average&eol; 'error', // High&eol; 'critical' // Disaster&eol; ];&eol;&eol; if (!severityMapping[params.severity]) {&eol; params.severity = '0';&eol; }&eol;&eol; if (typeof params.HTTPProxy === 'string' && params.HTTPProxy.trim() !== '') {&eol; req.setProxy(params.HTTPProxy);&eol; }&eol;&eol; if (isNaN(parseInt(params.eventid)) &pipe;&pipe; params.eventid < 1) {&eol; throw 'incorrect value for variable "eventid". The value must be a positive number.';&eol; }&eol; if (params.eventname.length < 1) {&eol; throw 'incorrect value for variable "eventname". The value must be a non-empty string.';&eol; }&eol; if (isNaN(parseInt(params.severity)) &pipe;&pipe; (params.severity < 0 && params.severity > 5)) {&eol; throw 'incorrect value for variable "severity". The value must be a number 0..5.';&eol; }&eol;&eol; if ([0, 1, 2, 3].indexOf(parseInt(params.event_source)) === -1) {&eol; throw 'Incorrect "event_source" parameter given: "' + params.event_source + '".\nMust be 0-3.';&eol; }&eol; // Check {EVENT.VALUE} for trigger-based and internal events.&eol; if (params.eventvalue !== '0' && params.eventvalue !== '1'&eol; && (params.event_source === '0' &pipe;&pipe; params.event_source === '3')) {&eol; throw 'Incorrect "eventvalue" parameter given: "' + params.eventvalue + '".\nMust be 0 or 1.';&eol; }&eol;&eol; if (params.event_source === '0') {&eol; if (params.hostname.length < 1) {&eol; throw 'incorrect value for variable "hostname". The value must be a non-empty string.';&eol; }&eol; if (isNaN(parseInt(params.triggerid)) &pipe;&pipe; params.triggerid < 1) {&eol; throw 'incorrect value for variable "triggerid". The value must be a positive number.';&eol; }&eol; if (params.eventack != 'Yes' && params.eventack != 'No') {&eol; throw 'incorrect value for variable "eventack". The value must be Yes or No.';&eol; }&eol; if (isNaN(parseInt(params.eventupdate)) &pipe;&pipe; (params.eventupdate < 0 &pipe;&pipe; params.eventupdate > 1)) {&eol; throw 'incorrect value for variable "eventupdate". The value must be 0 or 1.';&eol; }&eol; }&eol;&eol;&eol;&eol; req.addHeader('Content-Type: application/json');&eol;&eol; fields.routing_key = params.token;&eol; fields.dedup_key = params.eventid;&eol;&eol; if (((params.eventvalue == 1) && (params.eventupdate == 0)) &pipe;&pipe; params.event_source !== '0') {&eol; fields.event_action = 'trigger';&eol; fields.payload = {&eol; summary: params.eventname,&eol; source: (params.event_source === '1') ? 'Discovery' : params.hostname + ' : ' + params.hostip,&eol; severity: severityMapping[params.severity],&eol; };&eol; &eol; if (params.event_source === '0') {&eol; fields.payload.custom_details = {&eol; 'Event date': params.eventdate,&eol; 'Event time': params.eventtime,&eol; 'Trigger description': params.triggerdesc,&eol; 'Trigger opdata': params.triggeropdata,&eol; 'Event tags': params.eventtags,&eol; 'Event host': params.hostname,&eol; 'Event host ip': params.hostip&eol; };&eol; fields.links = [{&eol; href: params.url + '/tr_events.php?triggerid=' + params.triggerid + '&eventid=' + params.eventid,&eol; text: 'Event link'&eol; }];&eol; }&eol; else {&eol; fields.payload.custom_details = {&eol; 'Alert message': params.alert_message&eol; };&eol; }&eol;&eol; fields.client = 'Zabbix';&eol; fields.client_url = params.url;&eol; }&eol; else if ((params.eventvalue == 1) && (params.eventupdate == 1) && (params.eventack == 'Yes'))&eol; fields.event_action = 'acknowledge';&eol; else if (params.eventvalue == 0) {&eol; fields.event_action = 'resolve';&eol; fields.payload = {&eol; summary: params.eventname,&eol; source: (params.event_source === '1') ? 'Discovery' : params.hostname + ' : ' + params.hostip,&eol; severity: severityMapping[params.se
ROW |8 |4 |Pushover | | | | | | | |25 |0 |0 |0 |0 |0 |3 |10s |1 |try {&eol; var params = JSON.parse(value),&eol; request = new HttpRequest(),&eol; data,&eol; response,&eol; severities = [&eol; {name: 'not_classified', color: '#97AAB3'},&eol; {name: 'information', color: '#7499FF'},&eol; {name: 'warning', color: '#FFC859'},&eol; {name: 'average', color: '#FFA059'},&eol; {name: 'high', color: '#E97659'},&eol; {name: 'disaster', color: '#E45959'},&eol; {name: 'resolved', color: '#009900'},&eol; {name: 'default', color: '#000000'}&eol; ],&eol; priority;&eol;&eol; if (typeof params.HTTPProxy === 'string' && params.HTTPProxy.trim() !== '') {&eol; request.setProxy(params.HTTPProxy);&eol; }&eol;&eol; if ([0, 1, 2, 3].indexOf(parseInt(params.event_source)) === -1) {&eol; throw 'Incorrect "event_source" parameter given: "' + params.event_source + '".\nMust be 0-3.';&eol; }&eol;&eol; if (params.event_value !== '0' && params.event_value !== '1'&eol; && (params.event_source === '0' &pipe;&pipe; params.event_source === '3')) {&eol; throw 'Incorrect "event_value" parameter given: ' + params.event_value + '\nMust be 0 or 1.';&eol; }&eol;&eol; if ([0, 1, 2, 3, 4, 5].indexOf(parseInt(params.event_nseverity)) === -1) {&eol; params.event_nseverity = '7';&eol; }&eol;&eol; if (params.event_value === '0') {&eol; params.event_nseverity = '6';&eol; }&eol;&eol; priority = params['priority_' + severities[params.event_nseverity].name] &pipe;&pipe; params.priority_default;&eol;&eol; if (isNaN(priority) &pipe;&pipe; priority < -2 &pipe;&pipe; priority > 2) {&eol; throw '"priority" should be -2..2';&eol; }&eol;&eol; if (params.event_source === '0' && isNaN(params.triggerid)) {&eol; throw 'field "triggerid" is not a number';&eol; }&eol;&eol; if (isNaN(params.eventid)) {&eol; throw 'field "eventid" is not a number';&eol; }&eol;&eol; if (typeof params.message !== 'string' &pipe;&pipe; params.message.trim() === '') {&eol; throw 'field "message" cannot be empty';&eol; }&eol;&eol; data = {&eol; token: params.token,&eol; user: params.user,&eol; title: params.title,&eol; message: params.message,&eol; url: (params.event_source === '0') &eol; ? params.url + '/tr_events.php?triggerid=' + params.triggerid + '&eventid=' + params.eventid&eol; : params.url,&eol; url_title: params.url_title,&eol; priority: priority&eol; };&eol;&eol; if (priority == 2) {&eol; if (isNaN(params.retry) &pipe;&pipe; params.retry < 30) {&eol; throw 'field "retry" should be a number with value of at least 30 if "priority" is set to 2';&eol; }&eol;&eol; if (isNaN(params.expire) &pipe;&pipe; params.expire > 10800) {&eol; throw 'field "expire" should be a number with value of at most 10800 if "priority" is set to 2';&eol; }&eol;&eol; data.retry = params.retry;&eol; data.expire = params.expire;&eol; }&eol;&eol; data = JSON.stringify(data);&eol; Zabbix.log(4, '[ Pushover Webhook ] Sending request: ' + params.endpoint + '\n' + data);&eol;&eol; request.addHeader('Content-Type: application/json');&eol; response = request.post(params.endpoint, data);&eol;&eol; Zabbix.log(4, '[ Pushover Webhook ] Received response with status code ' + request.getStatus() + '\n' + response);&eol;&eol; if (response !== null) {&eol; try {&eol; response = JSON.parse(response);&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ Pushover Webhook ] Failed to parse response received from Pushover');&eol; response = null;&eol; }&eol; }&eol;&eol; if (request.getStatus() != 200 &pipe;&pipe; response === null &pipe;&pipe; typeof response !== 'object' &pipe;&pipe; response.status !== 1) {&eol; if (response !== null && typeof response === 'object' && typeof response.errors === 'object'&eol; && typeof response.errors[0] === 'string') {&eol; throw response.errors[0];&eol; }&eol; else {&eol; throw 'Unknown error. Check debug log for more information.';&eol; }&eol; }&eol;&eol; return 'OK';&eol;}&eol;catch (error) {&eol; Zabbix.log(4, '[ Pushover Webhook ] Pushover notification failed: ' + error);&eol; throw 'Pushover notification failed: ' + error;&eol;}|30s |0 |0 | | |Please refer to setup guide here: https://git.zabbix.c
ROW |9 |4 |Slack | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var SEVERITY_COLORS = [&eol; '#97AAB3', '#7499FF', '#FFC859',&eol; '#FFA059', '#E97659', '#E45959'&eol;];&eol;&eol;var RESOLVE_COLOR = '#009900';&eol;&eol;var SLACK_MODE_HANDLERS = {&eol; alarm: handlerAlarm,&eol; event: handlerEvent&eol;};&eol;&eol;&eol;if (!String.prototype.format) {&eol; String.prototype.format = function() {&eol; var args = arguments;&eol;&eol; return this.replace(/{(\d+)}/g, function(match, number) {&eol; return number in args&eol; ? args[number]&eol; : match&eol; ;&eol; });&eol; };&eol;}&eol;&eol;function isEventProblem(params) {&eol; return params.event_value == 1&eol; && params.event_update_status == 0&eol; ;&eol;}&eol;&eol;function isEventUpdate(params) {&eol; return params.event_value == 1&eol; && params.event_update_status == 1&eol; ;&eol;}&eol;&eol;function isEventResolve(params) {&eol; return params.event_value == 0;&eol;}&eol;&eol;function getPermalink(channelId, messageTimestamp) {&eol; var req = new HttpRequest();&eol;&eol; if (typeof params.HTTPProxy === 'string' && params.HTTPProxy.trim() !== '') {&eol; req.setProxy(params.HTTPProxy);&eol; }&eol;&eol; req.addHeader('Content-Type: application/x-www-form-urlencoded; charset=utf-8');&eol; req.addHeader('Authorization: Bearer ' + params.bot_token);&eol;&eol; var query = '{0}?channel={1}&message_ts={2}'.format(&eol; Slack.getPermalink,&eol; encodeURIComponent(channelId),&eol; encodeURIComponent(messageTimestamp)),&eol; resp = JSON.parse(req.get(query));&eol;&eol; if (req.getStatus() != 200 &pipe;&pipe; !resp.ok &pipe;&pipe; resp.ok === 'false') {&eol; throw 'message was created, but getting message link was failed with reason "' + resp.error + '"';&eol; }&eol;&eol; return resp.permalink;&eol;}&eol;&eol;function createProblemURL(zabbix_url, triggerid, eventid, event_source) {&eol; var problem_url = '';&eol; if (event_source === '0') {&eol; problem_url = '{0}/tr_events.php?triggerid={1}&eventid={2}'&eol; .format(&eol; zabbix_url,&eol; triggerid,&eol; eventid&eol; );&eol; }&eol; else {&eol; problem_url = zabbix_url;&eol; }&eol;&eol; return problem_url;&eol;}&eol;&eol;function handlerAlarm(params) {&eol; var fields = {&eol; channel: params.channel,&eol; as_user: params.slack_as_user,&eol; };&eol;&eol; if (isEventProblem(params)) {&eol; fields.attachments = [&eol; createMessage(&eol; SEVERITY_COLORS[params.event_nseverity] &pipe;&pipe; 0,&eol; params.event_date,&eol; params.event_time,&eol; createProblemURL(params.zabbix_url, params.trigger_id, params.event_id, params.event_source)&eol; )&eol; ];&eol;&eol; var resp = JSON.parse(req.post(Slack.postMessage, JSON.stringify(fields)));&eol;&eol; if (req.getStatus() != 200 &pipe;&pipe; !resp.ok &pipe;&pipe; resp.ok === 'false') {&eol; throw resp.error;&eol; }&eol;&eol; result.tags = {&eol; ['__message_ts_' + params.channel]: resp.ts,&eol; ['__channel_id_' + params.channel]: resp.channel,&eol; ['__message_link_' + params.channel]: getPermalink(resp.channel, resp.ts),&eol; };&eol;&eol; }&eol; else if (isEventUpdate(params)) {&eol; try {&eol; var channel_event_tags = JSON.parse(params.event_tags);&eol; } catch (error) {&eol; throw 'Cannot process event tags: ' + error;&eol; }&eol;&eol; if (Array.isArray(channel_event_tags)) {&eol; for (i in channel_event_tags) {&eol; if (channel_event_tags[i].tag.includes('__message_ts_' + params.channel)) {&eol; fields.thread_ts = channel_event_tags[i].value;&eol; break;&eol; }&eol; }&eol; }&eol;&eol; fields.attachments = [&eol; createMessage(&eol; SEVERITY_COLORS[params.event_nseverity] &pipe;&pipe; 0,&eol; params.event_update_date,&eol; params.event_update_time,&eol; createProblemURL(params.zabbix_url, params.trigger_id, params.event_id, params.event_source),&eol; true&eol; )&eol; ];&eol;&eol; resp = JSON.parse(req.post(Slack.postMessage, JSON.stringify(fields)));&eol;&eol; if (req.getStatus() != 200 &pipe;&pipe; !resp.ok &pipe;&pipe; resp.ok === 'false') {&eol; throw resp.error;&eol; }&eol;
ROW |10 |4 |Discord | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var SEVERITY_COLORS = [&eol; '#97AAB3', // Not classified.&eol; '#7499FF', // Information.&eol; '#FFC859', // Warning.&eol; '#FFA059', // Average.&eol; '#E97659', // High.&eol; '#E45959', // Disaster.&eol; '#009900' // Resolved.&eol;];&eol;&eol;function stringTruncate(str, len) {&eol; return str.length > len ? str.substring(0, len - 3) + '...' : str;&eol;}&eol;&eol;try {&eol; Zabbix.log(4, '[ Discord Webhook ] Executed with params: ' + value);&eol;&eol; var params = JSON.parse(value);&eol;&eol; if (!params.discord_endpoint) {&eol; throw 'Cannot get discord_endpoint';&eol; }&eol; else {&eol; params.discord_endpoint = params.discord_endpoint.replace('/api/', '/api/v7/') + '?wait=True';&eol; }&eol;&eol; params.zabbix_url = (params.zabbix_url.endsWith('/'))&eol; ? params.zabbix_url.slice(0, -1) : params.zabbix_url;&eol;&eol; if ([0, 1, 2, 3, 4].indexOf(parseInt(params.event_source)) === -1) {&eol; throw 'Incorrect "event_source" parameter given: "' + params.event_source + '".\nMust be 0-4.';&eol; }&eol;&eol; // Set params to true for non trigger-based events.&eol; if (params.event_source !== '0') {&eol; params.use_default_message = 'true';&eol; params.event_nseverity = '0';&eol; }&eol;&eol; // Check {EVENT.VALUE} for trigger-based and internal events.&eol; if (params.event_value !== '0' && params.event_value !== '1'&eol; && (params.event_source === '0' &pipe;&pipe; params.event_source === '3')) {&eol; throw 'Incorrect "event_value" parameter given: "' + params.event_value + '".\nMust be 0 or 1.';&eol; }&eol;&eol; // Check {EVENT.UPDATE.STATUS} only for trigger-based events.&eol; if (params.event_update_status !== '0' && params.event_update_status !== '1' && params.event_source === '0') {&eol; throw 'Incorrect "event_update_status" parameter given: "' + params.event_update_status + '".\nMust be 0 or 1.';&eol; }&eol;&eol; if (params.event_value == 0) {&eol; params.event_nseverity = '6';&eol; }&eol;&eol; if (!SEVERITY_COLORS[params.event_nseverity]) {&eol; throw 'Incorrect "event_nseverity" parameter given: ' + params.event_nseverity + '\nMust be 0-5.';&eol; }&eol;&eol; var color = parseInt(SEVERITY_COLORS[params.event_nseverity].replace('#', ''), 16),&eol; fields = [],&eol; body = {&eol; embeds: [&eol; {&eol; color: color &pipe;&pipe; 0,&eol; url: (params.event_source === '0')&eol; ? params.zabbix_url + '/tr_events.php?triggerid=' + params.trigger_id +&eol; '&eventid=' + params.event_id&eol; : params.zabbix_url&eol; }&eol; ]&eol; };&eol;&eol; // Default message from {ALERT.MESSAGE}.&eol; if (params.use_default_message.toLowerCase() == 'true') {&eol; body.embeds[0].title = stringTruncate(params.alert_subject, 256);&eol; body.embeds[0].description = stringTruncate(params.alert_message, 2048);&eol; }&eol; else {&eol; fields.push(&eol; {&eol; name: 'Host',&eol; value: params.host_name + ' [' + params.host_ip + ']'&eol; }&eol; );&eol;&eol; // Resolved message.&eol; if (params.event_value == 0 && params.event_update_status == 0) {&eol; body.embeds[0].title = stringTruncate('OK: ' + params.event_name, 256);&eol; fields.push(&eol; {&eol; name: 'Recovery time',&eol; value: params.event_recovery_time + ' ' + params.event_recovery_date,&eol; inline: 'True'&eol; }&eol; );&eol; }&eol;&eol; // Problem message.&eol; else if (params.event_value == 1 && params.event_update_status == 0) {&eol; body.embeds[0].title = stringTruncate('PROBLEM: ' + params.event_name, 256);&eol; fields.push(&eol; {&eol; name: 'Event time',&eol; value: params.event_time + ' ' + params.event_date,&eol; inline: 'True'&eol; }&eol; );&eol; }&eol;&eol; // Update message.&eol; else if (params.event_update_status == 1) {&eol; body.embeds[0].title = stringTruncate('UPDATE: ' + params.event_name, 256);&eol; body.embeds[0].description = params.event_update_user + ' ' + params.event_update_action + '.';&eol;&eol; if (params.event_update_message) {&eol; body.embeds[0].description += ' Comment:\n>>> ' + p
ROW |11 |4 |SIGNL4 | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |// SIGNL4 Webhook&eol;try {&eol; var response,&eol; payload,&eol; params = JSON.parse(value),&eol; endpoint = 'https://connect.signl4.com/webhook/',&eol; request = new HttpRequest();&eol;&eol; if (typeof params.HTTPProxy === 'string' && params.HTTPProxy.trim() !== '') {&eol; request.setProxy(params.HTTPProxy);&eol; }&eol;&eol; if (typeof params.teamsecret === 'string' && params.teamsecret.trim() !== '') {&eol; endpoint += params.teamsecret;&eol; delete params.teamsecret;&eol; }&eol; else {&eol; throw 'The team secret of your SIGNL4 team cannot be empty.';&eol; }&eol;&eol; if (typeof params.Severity === 'string' && params.Severity === '{EVENT.SEVERITY}') {&eol; params.Severity = 'Not classified';&eol; }&eol;&eol;&tab;if (typeof params.User === 'string' && params.User === '{USER.FULLNAME}') {&eol; params.User = '';&eol; }&eol;&eol;&tab;if (typeof params.Event_Update_Action === 'string' && params.Event_Update_Action === '{EVENT.UPDATE.ACTION}') {&eol; params.Event_Update_Action = '';&eol; }&eol;&eol;&tab;// Assemble X-S4-ExternalID for two-way integration&eol;&tab;// Format: "ZabbixEventID: 222 ZabbixURL: https://your-zabbix-server/zabbix/"&eol;&tab;params['X-S4-ExternalID'] = 'ZabbixEventID: ' + params.Event_ID;&eol;&tab;if (typeof params.Zabbix_URL === 'string' && params.Zabbix_URL.indexOf('http') == 0) {&eol;&tab;&tab;// Make sure the URL ends with '/'&eol;&tab;&tab;if (params.Zabbix_URL.charAt(params.Zabbix_URL.length - 1) != '/') {&eol;&tab;&tab;&tab;params.Zabbix_URL = params.Zabbix_URL + '/';&eol;&tab;&tab;}&eol;&eol;&tab;&tab;params['X-S4-ExternalID'] = params['X-S4-ExternalID'] + ' ZabbixURL: ' + params.Zabbix_URL;&eol;&eol;&tab;&tab;// Add Link parameter&eol;&tab;&tab;params['Link'] = params.Zabbix_URL + "tr_events.php?triggerid="+params.Trigger_ID + "&eventid=" + params.Event_ID;&eol;&tab;}&eol;&eol;&tab;// Check if this is a new problem or a recovery&eol;&tab;if (params.Trigger_Status == 'OK') {&eol;&tab;&tab;params['X-S4-Status'] = 'resolved';&eol;&tab;}&eol;&tab;else {&eol;&tab;&tab;params['X-S4-Status'] = 'new';&eol;&tab;&tab;params['X-S4-SourceSystem'] = 'Zabbix';&eol;&tab;}&eol;&eol; payload = JSON.stringify(params);&eol; Zabbix.log(4, '[ SIGNL4 Webhook ] Sending request: ' + payload);&eol;&eol; request.addHeader('Content-Type: application/json');&eol; response = request.post(endpoint, 'payload=' + payload);&eol;&eol; Zabbix.log(4, '[ SIGNL4 Webhook ] Received response with status code ' +&eol; request.getStatus() + '\n' + response&eol; );&eol;&eol; if (request.getStatus() !== 201) {&eol; throw 'Request failed with status code ' + request.getStatus() +&eol; '. Check debug log for more information.';&eol; }&eol;&eol; return 'OK';&eol;}&eol;catch (error) {&eol; Zabbix.log(4, '[ SIGNL4 Webhook ] ERROR: ' + error);&eol;&eol; throw 'Sending failed: ' + error;&eol;}|30s |0 |0 | | |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.&eol;&eol;Get the app at https://www.signl4.com.&eol;&eol;Find out more including an integration video here: https://www.signl4.com/blog/portfolio_item/zabbix-mobile-alert-notification-duty-schedule-escalation/ |0 |
ROW |12 |4 |Jira | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var Jira = {&eol; params: {},&eol;&eol; setParams: function (params) {&eol; if (typeof params !== 'object') {&eol; return;&eol; }&eol;&eol; Jira.params = params;&eol; if (typeof Jira.params.url === 'string') {&eol; if (!Jira.params.url.endsWith('/')) {&eol; Jira.params.url += '/';&eol; }&eol;&eol; Jira.params.url += 'rest/api/latest/';&eol; }&eol; },&eol;&eol; setProxy: function (HTTPProxy) {&eol; Jira.HTTPProxy = HTTPProxy;&eol; },&eol;&eol; setTags: function (event_tags_json) {&eol; if (typeof event_tags_json !== 'undefined' && event_tags_json !== ''&eol; && event_tags_json !== '{EVENT.TAGSJSON}') {&eol; try {&eol; var tags = JSON.parse(event_tags_json),&eol; label;&eol;&eol; Jira.labels = [];&eol;&eol; tags.forEach(function (tag) {&eol; if (typeof tag.tag !== 'undefined' && typeof tag.value !== 'undefined'&eol; && !tag.tag.startsWith('__zbx')) {&eol; label = (tag.tag + (tag.value ? (':' + tag.value) : '')).replace(/\s/g, '_');&eol; if (label.length < 256) {&eol; Jira.labels.push(label);&eol; }&eol; }&eol; });&eol; }&eol; catch (error) {&eol; // Code is not missing here.&eol; }&eol; }&eol; },&eol;&eol; escapeMarkup: function (str) {&eol; var length = str.length,&eol; result = '',&eol; markup = ['{', '&pipe;', '}', '~', '_', '\\', '[', ']', '^', '<', '>', '?', '!', '#', '+', '*', '&'];&eol;&eol; for (var i = 0; i < length; i++) {&eol; var char = str[i];&eol;&eol; result += (markup.indexOf(char) !== -1) ? ('&#' + str[i].charCodeAt() + ';') : char;&eol; }&eol;&eol; return result;&eol; },&eol;&eol; addCustomFields: function (data, fields) {&eol; if (typeof fields === 'object' && Object.keys(fields).length) {&eol; var schemaData = Jira.request('get', 'field/').response,&eol; schema = {};&eol;&eol; schemaData.forEach(function (item) {&eol; schema[item.id] = item.schema;&eol; });&eol;&eol; Object.keys(fields).forEach(function (field) {&eol; if (typeof schema[field] === 'object' && schema[field].type) {&eol; switch (schema[field].type) {&eol; case 'number':&eol; data.fields[field] = parseInt(fields[field]);&eol; break;&eol;&eol; case 'datetime':&eol; if (fields[field].match(/\d+[.-]\d+[.-]\d+T\d+:\d+:\d+/) !== null) {&eol; data.fields[field] = fields[field].replace(/\./g, '-');&eol; }&eol; break;&eol;&eol; case 'option':&eol; data.fields[field] = { value: fields[field] };&eol; break;&eol;&eol; case 'array':&eol; if (schema[field].items === 'option') {&eol; data.fields[field] = [{ value: fields[field] }];&eol; } else {&eol; data.fields[field] = [fields[field]];&eol; }&eol; break;&eol;&eol; default:&eol; data.fields[field] = fields[field];&eol; }&eol; }&eol; });&eol; }&eol; else {&eol; Zabbix.log(4, '[ Jira Webhook ] Failed to retrieve field schema.');&eol; }&eol; return data;&eol; },&eol;&eol; request: function (method, query, data) {&eol; ['url', 'user', 'password', 'project_key', 'issue_type'].forEach(function (field) {&eol; if (typeof Jira.params !== 'object' &pipe;&pipe; typeof Jira.params[field] === 'undefined'&eol; &pipe;&pipe; Jira.params[field] === '') {&eol; throw 'Required Jira param is not set: "' + field + '".';&eol; }&eol; });&eol;&eol; var response,&eol; url = Jira.params.url + query,&eol; request = new HttpRequest();&eol;&eol; request.addHeader('Content-Type: application/json');&eol; request.addHeader('Authorization: Basic ' + btoa(Jira.params.user + ':' + Jira.params.pas
ROW |14 |4 |MS Teams | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var SEVERITY_COLORS = [&eol; '#97AAB3', // Not classified.&eol; '#7499FF', // Information.&eol; '#FFC859', // Warning.&eol; '#FFA059', // Average.&eol; '#E97659', // High.&eol; '#E45959', // Disaster.&eol; '#009900', // Resolved.&eol; '#000000' // Default.&eol;];&eol;&eol;try {&eol; var params = JSON.parse(value);&eol;&eol; if (typeof params.teams_endpoint !== 'string' &pipe;&pipe; params.teams_endpoint.trim() === '') {&eol; throw 'Cannot get teams_endpoint';&eol; }&eol; else if (!params.teams_endpoint.startsWith('http')) {&eol; throw 'Invalid MS Teams webhook URL: ' + params.teams_endpoint;&eol; }&eol;&eol; params.zabbix_url = (params.zabbix_url.endsWith('/'))&eol; ? params.zabbix_url.slice(0, -1) : params.zabbix_url;&eol;&eol; if ([0, 1, 2, 3, 4].indexOf(parseInt(params.event_source)) === -1) {&eol; throw 'Incorrect "event_source" parameter given: "' + params.event_source + '".\nMust be 0-4.';&eol; }&eol;&eol; // Set "use_default_message" to true for non trigger-based events.&eol; if (params.event_source !== '0') {&eol; params.use_default_message = 'true';&eol; }&eol;&eol; // Check {EVENT.VALUE} for trigger-based and internal events.&eol; if (params.event_value !== '0' && params.event_value !== '1'&eol; && (params.event_source === '0' &pipe;&pipe; params.event_source === '3')) {&eol; throw 'Incorrect "event_value" parameter given: "' + params.event_value + '".\nMust be 0 or 1.';&eol; }&eol;&eol; // Check {EVENT.UPDATE.STATUS} only for trigger-based events.&eol; if (params.event_update_status !== '0' && params.event_update_status !== '1' && params.event_source === '0') {&eol; throw 'Incorrect "event_update_status" parameter given: "' + params.event_update_status + '".\nMust be 0 or 1.';&eol; }&eol;&eol; if (params.event_value == 0) {&eol; params.event_nseverity = '6';&eol; }&eol;&eol; if (!SEVERITY_COLORS[params.event_nseverity]) {&eol; params.event_nseverity = '7';&eol; }&eol;&eol; var request = new HttpRequest(),&eol; facts = [],&eol; body = {&eol; themeColor: SEVERITY_COLORS[params.event_nseverity].replace('#', ''),&eol; summary: params.alert_subject,&eol; sections: [&eol; {&eol; markdown: 'false',&eol; activityTitle: params.alert_subject,&eol; text: (params.use_default_message.toLowerCase() == 'true')&eol; ? params.alert_message&eol; : params.trigger_description&eol; }&eol; ],&eol; potentialAction: [&eol; {&eol; '@type': 'OpenUri',&eol; name: (params.event_source === '0')&eol; ? 'Event Info'&eol; : 'Zabbix Home',&eol; targets: [&eol; {&eol; os: 'default',&eol; uri: (params.event_source === '0')&eol; ? params.zabbix_url + '/tr_events.php?triggerid=' +&eol; params.trigger_id + '&eventid=' + params.event_id&eol; : params.zabbix_url&eol; }&eol; ]&eol; }&eol; ]&eol; };&eol;&eol; if (params.use_default_message.toLowerCase() !== 'true') {&eol; // Problem message.&eol; if (params.event_value === '1' && params.event_update_status === '0') {&eol; facts.push({&eol; name: 'Event time',&eol; value: params.event_time + ' ' + params.event_date&eol; });&eol; facts.push({&eol; name: 'Host',&eol; value: params.host_name + ' [' + params.host_ip + ']'&eol; });&eol;&eol; }&eol; // Update message.&eol; else if (params.event_update_status === '1') {&eol; body.sections[0].text = params.event_update_user + ' ' + params.event_update_action + '.';&eol;&eol; if (params.event_update_message) {&eol; body.sections[0].text += '<br>Message:<br>' + params.event_update_message;&eol; }&eol;&eol; facts.push({&eol; name: 'Event update time',&eol; value: params.event_update_time + ' ' + params.event_update_date&eol; });&eol; facts.push({&eol; name: 'Host',&eol; value: params.host_name + ' [' + params.host_ip + ']'&eol; });&eol;&eol; }&eol;
ROW |15 |4 |Redmine | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var Redmine = {&eol; params: {},&eol;&eol; setParams: function (params) {&eol; if (typeof params !== 'object') {&eol; return;&eol; }&eol;&eol; Redmine.params = params;&eol; if (typeof Redmine.params.url === 'string') {&eol; if (!Redmine.params.url.endsWith('/')) {&eol; Redmine.params.url += '/';&eol; }&eol; }&eol; },&eol;&eol; addCustomFields: function (data, fields) {&eol; if (typeof fields === 'object' && Object.keys(fields).length) {&eol;&eol; data.issue.custom_fields = [];&eol; Object.keys(fields)&eol; .forEach(function (field) {&eol; var field_value = fields[field];&eol;&eol; if (field_value !== undefined) {&eol; data.issue.custom_fields.push({ id: field, value: field_value });&eol; }&eol; });&eol;&eol; }&eol; return data;&eol; },&eol;&eol; request: function (method, query, data) {&eol; ['url', 'access_key'].forEach(function (field) {&eol; if (typeof Redmine.params !== 'object' &pipe;&pipe; typeof Redmine.params[field] === 'undefined'&eol; &pipe;&pipe; Redmine.params[field] === '' ) {&eol; throw 'Required param is not set: "' + field + '".';&eol; }&eol; });&eol;&eol; var response,&eol; url = Redmine.params.url + query,&eol; request = new HttpRequest();&eol;&eol; if (typeof Redmine.HTTPProxy === 'string' && Redmine.HTTPProxy.trim() !== '') {&eol; request.setProxy(Redmine.HTTPProxy);&eol; }&eol;&eol; request.addHeader('Content-Type: application/json');&eol; request.addHeader('X-Redmine-API-Key: ' + Redmine.params.access_key);&eol;&eol; if (typeof data !== 'undefined') {&eol; data = JSON.stringify(data);&eol; }&eol;&eol; Zabbix.log(4, '[ Redmine Webhook ] Sending request: ' +&eol; url + ((typeof data === 'string') ? (' ' + data) : ''));&eol;&eol; switch (method) {&eol; case 'get':&eol; response = request.get(url, data);&eol; break;&eol;&eol; case 'post':&eol; response = request.post(url, data);&eol; break;&eol;&eol; case 'put':&eol; response = request.put(url, data);&eol; break;&eol;&eol; default:&eol; throw 'Unsupported HTTP request method: ' + method;&eol; }&eol;&eol; Zabbix.log(4, '[ Redmine Webhook ] Received response with status code ' + request.getStatus() + ': ' + response);&eol;&eol; if (response !== null) {&eol; try {&eol; response = JSON.parse(response);&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ Redmine Webhook ] Failed to parse response received from Redmine');&eol; response = null;&eol; }&eol; }&eol;&eol; if (request.getStatus() < 200 &pipe;&pipe; request.getStatus() >= 300) {&eol; var message = 'Request failed with status code ' + request.getStatus();&eol;&eol; if (response !== null && typeof response.errors !== 'undefined'&eol; && Object.keys(response.errors).length > 0) {&eol; message += ': ' + JSON.stringify(response.errors);&eol; }&eol; else if (response !== null && typeof response.errorMessages !== 'undefined'&eol; && Object.keys(response.errorMessages).length > 0) {&eol; message += ': ' + JSON.stringify(response.errorMessages);&eol; }&eol;&eol; throw message + ' Check debug log for more information.';&eol; }&eol;&eol; return {&eol; status: request.getStatus(),&eol; response: response&eol; };&eol; },&eol;&eol; getProjectID: function(name) {&eol; var result = Redmine.request('get', 'projects.json'),&eol; project_id;&eol;&eol; if (result.response) {&eol; var projects = result.response.projects &pipe;&pipe; [];&eol;&eol; for (var i in projects) {&eol; if (projects[i].name === name) {&eol; project_id = projects[i].id;&eol; break;&eol; }&eol; }&eol; }&eol; else {&eol; Zabbix.log(4, '[ Redmine Webhook ] Failed to retrieve project data.');&eol; }&eol;&eol; if (typeof project_id === 'undefined') {&eol; throw 'Cannot find project with name: ' + name;&eol;
ROW |16 |4 |Telegram | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var Telegram = {&eol; token: null,&eol; to: null,&eol; message: null,&eol; proxy: null,&eol; parse_mode: null,&eol;&eol; escapeMarkup: function (str, mode) {&eol; switch (mode) {&eol; case 'markdown':&eol; return str.replace(/([_*\[`])/g, '\\$&');&eol;&eol; case 'markdownv2':&eol; return str.replace(/([_*\[\]()~`>#+\-=&pipe;{}.!])/g, '\\$&');&eol;&eol; case 'html':&eol; return str.replace(/<(\s&pipe;[^a-z\/])/g, '<$1');&eol;&eol; default:&eol; return str;&eol; }&eol; },&eol;&eol; sendMessage: function () {&eol; var params = {&eol; chat_id: Telegram.to,&eol; text: Telegram.message,&eol; disable_web_page_preview: true,&eol; disable_notification: false&eol; },&eol; data,&eol; response,&eol; request = new HttpRequest(),&eol; url = 'https://api.telegram.org/bot' + Telegram.token + '/sendMessage';&eol;&eol; if (Telegram.parse_mode !== null) {&eol; params['parse_mode'] = Telegram.parse_mode;&eol; }&eol;&eol; if (Telegram.proxy) {&eol; request.setProxy(Telegram.proxy);&eol; }&eol;&eol; request.addHeader('Content-Type: application/json');&eol; data = JSON.stringify(params);&eol;&eol; // Remove replace() function if you want to see the exposed token in the log file.&eol; Zabbix.log(4, '[Telegram Webhook] URL: ' + url.replace(Telegram.token, '<TOKEN>'));&eol; Zabbix.log(4, '[Telegram Webhook] params: ' + data);&eol; response = request.post(url, data);&eol; Zabbix.log(4, '[Telegram Webhook] HTTP code: ' + request.getStatus());&eol;&eol; try {&eol; response = JSON.parse(response);&eol; }&eol; catch (error) {&eol; response = null;&eol; }&eol;&eol; if (request.getStatus() !== 200 &pipe;&pipe; typeof response.ok !== 'boolean' &pipe;&pipe; response.ok !== true) {&eol; if (typeof response.description === 'string') {&eol; throw response.description;&eol; }&eol; else {&eol; throw 'Unknown error. Check debug log for more information.';&eol; }&eol; }&eol; }&eol;};&eol;&eol;try {&eol; var params = JSON.parse(value);&eol;&eol; if (typeof params.Token === 'undefined') {&eol; throw 'Incorrect value is given for parameter "Token": parameter is missing';&eol; }&eol;&eol; Telegram.token = params.Token;&eol;&eol; if (params.HTTPProxy) {&eol; Telegram.proxy = params.HTTPProxy;&eol; } &eol;&eol; params.ParseMode = params.ParseMode.toLowerCase();&eol; &eol; if (['markdown', 'html', 'markdownv2'].indexOf(params.ParseMode) !== -1) {&eol; Telegram.parse_mode = params.ParseMode;&eol; }&eol;&eol; Telegram.to = params.To;&eol; Telegram.message = params.Subject + '\n' + params.Message;&eol;&eol; if (['markdown', 'html', 'markdownv2'].indexOf(params.ParseMode) !== -1) {&eol; Telegram.message = Telegram.escapeMarkup(Telegram.message, params.ParseMode);&eol; }&eol;&eol; Telegram.sendMessage();&eol;&eol; return 'OK';&eol;}&eol;catch (error) {&eol; Zabbix.log(4, '[Telegram Webhook] notification failed: ' + error);&eol; throw 'Sending failed: ' + error + '.';&eol;}|10s |0 |0 | | |https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates/media/telegram&eol;&eol;1. Register bot: send "/newbot" to @BotFather and follow instructions&eol;2. Copy and paste the obtained token into the "Token" field above&eol;3. If you want to send personal notifications, you need to get chat id of the user you want to send messages to:&eol; 3.1. Send "/getid" to "@myidbot" in Telegram messenger&eol; 3.2. Copy returned chat id and save it in the "Telegram Webhook" media for the user&eol; 3.3. Ask the user to send "/start" to your bot (Telegram bot won't send anything to the user without it)&eol;4. If you want to send group notifications, you need to get group id of the group you want to send messages to:&eol; 4.1. Add "@myidbot" to your group&eol; 4.2. Send "/getgroupid@myidbot" in your group&eol; 4.3. Copy returned group id save it in the "Telegram Webhook" media for the user you created for group notifications&eol; 4.4. Send "/start@your_bot_name_here" in your group (Telegram bot won't send anything to the group without it)|0 |
ROW |17 |4 |Zendesk | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var Zendesk = {&eol; params: {},&eol;&eol; setParams: function (params) {&eol; if (typeof params !== 'object') {&eol; return;&eol; }&eol;&eol; Zendesk.params = params;&eol; if (typeof Zendesk.params.url === 'string') {&eol; if (!Zendesk.params.url.endsWith('/')) {&eol; Zendesk.params.url += '/';&eol; }&eol; Zendesk.params.url += 'api/v2/';&eol; }&eol; },&eol;&eol; addCustomFields: function (data, fields) {&eol; if (typeof fields === 'object' && Object.keys(fields).length) {&eol; var schema = Zendesk.getSchema(),&eol; arr = [],&eol; i,&eol; n;&eol;&eol; if (schema) {&eol; Object.keys(fields)&eol; .forEach(function(field) {&eol; for (i = 0, n = schema.ticket_fields.length; i < n; i++) {&eol; if (schema.ticket_fields[i].id == field&eol; && ['text', 'integer', 'date'].indexOf(schema.ticket_fields[i].type) !== -1){&eol;&eol; switch (schema.ticket_fields[i].type) {&eol; case 'integer':&eol; fields[field] = parseInt(fields[field]);&eol; break;&eol; case 'date':&eol; if (fields[field].match(/^\d{4}[.-]\d{2}[.-]\d{2}$/) !== null) {&eol; fields[field] = fields[field].replace(/\./g, '-');&eol; }&eol; else {&eol; fields[field] = '';&eol; }&eol; break;&eol; }&eol;&eol; arr.push({id: field, value: fields[field]});&eol; break;&eol; }&eol; }&eol; });&eol;&eol; if (arr.length) {&eol; data.ticket['custom_fields'] = arr;&eol; }&eol; }&eol; else {&eol; Zabbix.log(4, '[Zendesk Webhook] Failed to retrieve field schema.');&eol; }&eol; }&eol;&eol; return data;&eol; },&eol;&eol; request: function (method, query, data) {&eol; ['url', 'token', 'type'].forEach(function (field) {&eol; if (typeof Zendesk.params !== 'object' &pipe;&pipe; typeof Zendesk.params[field] === 'undefined') {&eol; throw 'Required Zendesk param is not set: ' + field + '\n' + Zendesk.params[field];&eol; }&eol; });&eol;&eol; var response,&eol; url = Zendesk.params.url + query,&eol; request = new HttpRequest();&eol;&eol; if (typeof Zendesk.HTTPProxy === 'string' && Zendesk.HTTPProxy.trim() !== '') {&eol; request.setProxy(Zendesk.HTTPProxy);&eol; }&eol;&eol; request.addHeader('Content-Type: application/json');&eol; request.addHeader('Authorization: Basic ' + btoa(Zendesk.params.token));&eol;&eol; if (typeof data !== 'undefined') {&eol; data = JSON.stringify(data);&eol; }&eol;&eol; Zabbix.log(4, '[Zendesk Webhook] Sending request: ' + url + ((typeof data === 'string') ? (' ' + data) : ''));&eol;&eol; switch (method) {&eol; case 'get':&eol; response = request.get(url, data);&eol; break;&eol;&eol; case 'post':&eol; response = request.post(url, data);&eol; break;&eol;&eol; case 'put':&eol; response = request.put(url, data);&eol; break;&eol;&eol; default:&eol; throw 'Unsupported HTTP request method: ' + method;&eol; }&eol;&eol; Zabbix.log(4, '[Zendesk Webhook] Received response with status code ' + request.getStatus() + '. ' + response);&eol;&eol; if (response !== null) {&eol; try {&eol; response = JSON.parse(response);&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[Zendesk Webhook] Failed to parse response received from Zendesk.');&eol; }&eol; }&eol;&eol; if (request.getStatus() < 200 &pipe;&pipe; request.getStatus() >= 300) {&eol; var message = 'Request failed with status code ' + request.getStatus();&eol;&eol; if (response !== null && typ
ROW |18 |4 |ServiceNow | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var ServiceNow = {&eol; params: {},&eol;&eol; setParams: function (params) {&eol; if (typeof params !== 'object') {&eol; return;&eol; }&eol;&eol; ServiceNow.params = params;&eol; if (typeof ServiceNow.params.url === 'string') {&eol; if (!ServiceNow.params.url.endsWith('/')) {&eol; ServiceNow.params.url += '/';&eol; }&eol;&eol; ServiceNow.params.url += 'api/now/table/incident';&eol; }&eol; },&eol;&eol; setProxy: function (HTTPProxy) {&eol; ServiceNow.HTTPProxy = HTTPProxy;&eol; },&eol;&eol; setFields: function (data, fields) {&eol; if (typeof fields === 'object' && Object.keys(fields).length) {&eol; Object.keys(fields)&eol; .forEach(function(field) {&eol; data[field] = (fields[field].match(/^\d{4}\.\d{2}\.\d{2}$/) !== null)&eol; ? fields[field].replace(/\./g, '-')&eol; : fields[field];&eol; });&eol; }&eol; },&eol;&eol; request: function (method, data) {&eol; ['url', 'user', 'password'].forEach(function (field) {&eol; if (typeof ServiceNow.params !== 'object' &pipe;&pipe; typeof ServiceNow.params[field] === 'undefined'&eol; &pipe;&pipe; ServiceNow.params[field] === '' ) {&eol; throw 'Required ServiceNow param is not set: "' + field + '".';&eol; }&eol; });&eol;&eol; var response,&eol; url = ServiceNow.params.url,&eol; request = new HttpRequest();&eol;&eol; request.addHeader('Content-Type: application/json');&eol; request.addHeader('Authorization: Basic ' + btoa(ServiceNow.params.user + ':' + ServiceNow.params.password));&eol;&eol; if (typeof ServiceNow.HTTPProxy !== 'undefined' && ServiceNow.HTTPProxy !== '') {&eol; request.setProxy(ServiceNow.HTTPProxy);&eol; }&eol;&eol; if (typeof data !== 'undefined') {&eol; data = JSON.stringify(data);&eol; }&eol;&eol; Zabbix.log(4, '[ ServiceNow Webhook ] Sending request: ' + url + ((typeof data === 'string')&eol; ? ('\n' + data)&eol; : ''));&eol;&eol; switch (method) {&eol; case 'get':&eol; response = request.get(url, data);&eol; break;&eol;&eol; case 'post':&eol; response = request.post(url, data);&eol; break;&eol;&eol; case 'put':&eol; response = request.put(url, data);&eol; break;&eol;&eol; default:&eol; throw 'Unsupported HTTP request method: ' + method;&eol; }&eol;&eol; Zabbix.log(4, '[ ServiceNow Webhook ] Received response with status code ' +&eol; request.getStatus() + '\n' + response);&eol;&eol; if (response !== null) {&eol; try {&eol; response = JSON.parse(response);&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ ServiceNow Webhook ] Failed to parse response received from ServiceNow');&eol; response = null;&eol; }&eol; }&eol;&eol; if (request.getStatus() < 200 &pipe;&pipe; request.getStatus() >= 300) {&eol; var message = 'Request failed with status code ' + request.getStatus();&eol;&eol; if (response !== null && typeof response.error.message !== 'undefined'&eol; && Object.keys(response.error).length > 0) {&eol; message += ': ' + JSON.stringify(response.error.message);&eol; }&eol;&eol; throw message + ' Check debug log for more information.';&eol; }&eol; else if (typeof response.result !== 'object' &pipe;&pipe; typeof response.result.sys_id === 'undefined') {&eol; throw 'Cannot create ServiceNow incident. Check debug log for more information.';&eol; }&eol;&eol; return response.result;&eol; }&eol;};&eol;&eol;try {&eol; var params = JSON.parse(value),&eol; fields = {},&eol; servicenow = {},&eol; data = {},&eol; result = {tags: {}},&eol; required_params = [&eol; 'alert_subject', 'alert_message', 'event_source', 'event_value',&eol; 'event_update_status', 'event_recovery_value', 'event_nseverity'&eol; ],&eol; severities = [&eol; {name: 'not_classified', color: '#97AAB3'},&eol; {name: 'information', color: '#7499FF'},&eol; {name: 'warning', color: '#FFC859'},&eol; {name: 'average', color: '#FFA059'},&eol; {name: 'high', color: '#
ROW |19 |4 |Zammad | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var Zammad = {&eol; params: {},&eol;&eol; setParams: function (params) {&eol; if (typeof params !== 'object') {&eol; return;&eol; }&eol;&eol; Zammad.params = params;&eol; if (typeof Zammad.params.url === 'string') {&eol; if (!Zammad.params.url.endsWith('/')) {&eol; Zammad.params.url += '/';&eol; }&eol; }&eol; },&eol;&eol; request: function (method, query, data) {&eol; ['url', 'access_token'].forEach(function (field) {&eol; if (typeof Zammad.params !== 'object' &pipe;&pipe; typeof Zammad.params[field] === 'undefined'&eol; &pipe;&pipe; Zammad.params[field] === '' ) {&eol; throw 'Required param is not set: "' + field + '".';&eol; }&eol; });&eol;&eol; var response,&eol; url = Zammad.params.url + query,&eol; request = new HttpRequest();&eol;&eol; if (typeof Zammad.HTTPProxy === 'string' && Zammad.HTTPProxy.trim() !== '') {&eol; request.setProxy(Zammad.HTTPProxy);&eol; }&eol;&eol; request.addHeader('Content-Type: application/json');&eol; request.addHeader('Authorization: Token token=' + Zammad.params.access_token);&eol;&eol; if (typeof data !== 'undefined') {&eol; data = JSON.stringify(data);&eol; }&eol;&eol; Zabbix.log(4, '[ Zammad Webhook ] Sending request: ' +&eol; url + ((typeof data === 'string') ? (' ' + data) : ''));&eol;&eol; switch (method) {&eol; case 'get':&eol; response = request.get(url, data);&eol; break;&eol;&eol; case 'post':&eol; response = request.post(url, data);&eol; break;&eol;&eol; case 'put':&eol; response = request.put(url, data);&eol; break;&eol;&eol; default:&eol; throw 'Unsupported HTTP request method: ' + method;&eol; }&eol;&eol; Zabbix.log(4, '[ Zammad Webhook ] Received response with status code ' + request.getStatus() + ': ' + response);&eol;&eol; if (response !== null) {&eol; try {&eol; response = JSON.parse(response);&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ Zammad Webhook ] Failed to parse response received from Zammad');&eol; response = null;&eol; }&eol; }&eol;&eol; if (request.getStatus() < 200 &pipe;&pipe; request.getStatus() >= 300) {&eol; var message = 'Request failed with status code ' + request.getStatus();&eol;&eol; if (response !== null && typeof response.errors !== 'undefined'&eol; && Object.keys(response.errors).length > 0) {&eol; message += ': ' + JSON.stringify(response.errors);&eol; }&eol; else if (response !== null && typeof response.errorMessages !== 'undefined'&eol; && Object.keys(response.errorMessages).length > 0) {&eol; message += ': ' + JSON.stringify(response.errorMessages);&eol; }&eol;&eol; throw message + ' Check debug log for more information.';&eol; }&eol;&eol; return {&eol; status: request.getStatus(),&eol; response: response&eol; };&eol; },&eol;&eol; setTicketTags: function (tags, ticket_id) {&eol; var data = {&eol; item: '',&eol; object: 'Ticket',&eol; o_id: ticket_id&eol; };&eol;&eol; try {&eol; var tags_json = JSON.parse(tags),&eol; result;&eol;&eol; for (var i in tags_json) {&eol;&eol; if (tags_json[i].value) {&eol; data.item = tags_json[i].tag + ": " + tags_json[i].value;&eol; } else {&eol; data.item = tags_json[i].tag;&eol; }&eol; result = Zammad.request('post', 'api/v1/tags/add', data);&eol;&eol; if (typeof result.response !== 'object' &pipe;&pipe; result.status != 200) {&eol; Zabbix.log(4, '[ Zammad Webhook ] Cannot add ticket tag:' + tags_json[i].tag);&eol; }&eol; }&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ Zammad Webhook ] Failed to add ticket tags:' + error);&eol; }&eol;&eol; return;&eol; },&eol;&eol; createTicket: function(subject, message, priority) {&eol; var data = {&eol; title: subject,&eol; group: 'Users',&eol; article: {&eol; subject: subject,&eol;
ROW |20 |4 |Jira ServiceDesk | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var Jira = {&eol; params: {},&eol; schema: {},&eol;&eol; setParams: function (params) {&eol; if (typeof params !== 'object') {&eol; return;&eol; }&eol;&eol; Jira.params = params;&eol; if (typeof Jira.params.url === 'string') {&eol; if (!Jira.params.url.endsWith('/')) {&eol; Jira.params.url += '/';&eol; }&eol;&eol; Jira.params.url += 'rest/servicedeskapi/';&eol; }&eol; },&eol;&eol; setProxy: function (HTTPProxy) {&eol; Jira.HTTPProxy = HTTPProxy;&eol; },&eol;&eol; setTags: function(event_tags_json) {&eol; if (!Jira.schema) {&eol; Zabbix.log(4, '[ Jira Service Desk Webhook ] Cannot add labels because failed to retrieve field schema.');&eol;&eol; return;&eol; }&eol;&eol; var block = Jira.schema.requestTypeFields.filter(function(object) {&eol; return object.fieldId == 'labels';&eol; });&eol;&eol; if (block[0] && typeof event_tags_json !== 'undefined' && event_tags_json !== ''&eol; && event_tags_json !== '{EVENT.TAGSJSON}') {&eol; try {&eol; var tags = JSON.parse(event_tags_json),&eol; label;&eol;&eol; Jira.labels = [];&eol;&eol; tags.forEach(function (tag) {&eol; if (typeof tag.tag !== 'undefined' && typeof tag.value !== 'undefined' ) {&eol; label = (tag.tag + (tag.value ? (':' + tag.value) : '')).replace(/\s/g, '_');&eol; if (label.length < 255) {&eol; Jira.labels.push(label);&eol; }&eol; }&eol; });&eol; }&eol; catch (error) {&eol; // Code is not missing here.&eol; }&eol; }&eol; },&eol;&eol; addCustomFields: function (data, fields) {&eol; if (typeof fields === 'object' && Object.keys(fields).length) {&eol; if (Jira.schema) {&eol; Object.keys(fields)&eol; .forEach(function(field) {&eol; data.requestFieldValues[field] = fields[field];&eol;&eol; var block = Jira.schema.requestTypeFields.filter(function(object) {&eol; return object.fieldId == field;&eol; });&eol;&eol; if (typeof block[0] === 'object' && typeof block[0].jiraSchema === 'object'&eol; && (block[0].jiraSchema.type === 'number' &pipe;&pipe; block[0].jiraSchema.type === 'datetime')) {&eol; switch (block[0].jiraSchema.type) {&eol; case 'number':&eol; data.requestFieldValues[field] = parseInt(fields[field]);&eol; break;&eol;&eol; case 'datetime':&eol; if (fields[field].match(/\d+[.-]\d+[.-]\d+T\d+:\d+:\d+/) !== null) {&eol; data.requestFieldValues[field] = fields[field].replace(/\./g, '-');&eol; }&eol; else {&eol; delete data.requestFieldValues[field];&eol; }&eol; break;&eol; }&eol; }&eol; });&eol; }&eol; else {&eol; Zabbix.log(4, '[ Jira Service Desk Webhook ] Cannot add custom fields' +&eol; 'because failed to retrieve field schema.');&eol; }&eol; }&eol;&eol; return data;&eol; },&eol;&eol; request: function (method, query, data) {&eol; ['url', 'user', 'password', 'servicedesk_id', 'request_type_id'].forEach(function (field) {&eol; if (typeof Jira.params !== 'object' &pipe;&pipe; typeof Jira.params[field] === 'undefined'&eol; &pipe;&pipe; Jira.params[field] === '' ) {&eol; throw 'Required Jira param is not set: "' + field + '".';&eol; }&eol; });&eol;&eol; var response,&eol; url = Jira.params.url + query,&eol; request = new HttpRequest();&eol;&eol; request.addHeader('Content-Type: application/json');&eol; request.addHeader('Authorization: Basic ' + btoa(Jira.params.user + ':' + Jira.params.password));&eol; request.addHeader('X-ExperimentalApi: opt-in');&eol;&eol; if (typeof Jira.HTTPProxy !== 'undefined' && Jira.HTTPProxy
ROW |21 |4 |OTRS | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var OTRS = {&eol; params: {},&eol; entrypoint: 'nph-genericinterface.pl/Webservice/ZabbixTicketConnector/Ticket',&eol;&eol; setParams: function (params) {&eol; if (typeof params !== 'object') {&eol; return;&eol; }&eol;&eol; OTRS.params = params;&eol; if (typeof OTRS.params.url === 'string') {&eol; if (!OTRS.params.url.endsWith('/')) {&eol; OTRS.params.url += '/';&eol; }&eol; }&eol; },&eol;&eol; addDynamicFields: function (data, fields) {&eol; if (typeof fields === 'object' && Object.keys(fields).length) {&eol; data.DynamicField = [];&eol;&eol; Object.keys(fields)&eol; .forEach(function(field) {&eol; if (field !== undefined) {&eol; if (fields[field].match(/^\d{4}[.-]\d{2}[.-]\d{2}$/)) {&eol; fields[field] = fields[field].replace(/\./g, '-');&eol; }&eol;&eol; data.DynamicField.push({Name: field, Value: fields[field]});&eol; }&eol; });&eol; }&eol;&eol; return data;&eol; },&eol;&eol; request: function (method, query, data) {&eol; ['url', 'auth_user', 'auth_password', 'queue',&eol; 'customer', 'ticket_state', 'default_priority_id', 'time_unit'].forEach(function (field) {&eol; if (typeof OTRS.params !== 'object' &pipe;&pipe; typeof OTRS.params[field] === 'undefined'&eol; &pipe;&pipe; OTRS.params[field] === '' ) {&eol; throw 'Required param is not set: "' + field + '".';&eol; }&eol; });&eol;&eol; var response,&eol; request = new HttpRequest(),&eol; url = OTRS.params.url + query +&eol; '?UserLogin=' + encodeURIComponent(OTRS.params.auth_user) +&eol; '&Password=' + encodeURIComponent(OTRS.params.auth_password);&eol;&eol; if (typeof OTRS.HTTPProxy !== 'undefined' && OTRS.HTTPProxy.trim() !== '') {&eol; request.setProxy(OTRS.HTTPProxy);&eol; }&eol;&eol; request.addHeader('Content-Type: application/json');&eol;&eol; if (typeof data !== 'undefined') {&eol; data = JSON.stringify(data);&eol; }&eol;&eol; Zabbix.log(4, '[ OTRS Webhook ] Sending request: ' +&eol; url + ((typeof data === 'string') ? (' ' + data) : ''));&eol;&eol; switch (method) {&eol; case 'get':&eol; response = request.get(url, data);&eol; break;&eol;&eol; case 'post':&eol; response = request.post(url, data);&eol; break;&eol;&eol; case 'put':&eol; response = request.put(url, data);&eol; break;&eol;&eol; default:&eol; throw 'Unsupported HTTP request method: ' + method;&eol; }&eol;&eol; Zabbix.log(4, '[ OTRS Webhook ] Received response with status code ' + request.getStatus() + ': ' + response);&eol;&eol; if (request.getStatus() < 200 &pipe;&pipe; request.getStatus() >= 300) {&eol; var message = 'Request failed with status code ' + request.getStatus();&eol;&eol; message += ': ' + response;&eol; throw message + ' Check debug log for more information.';&eol; }&eol;&eol; if (response !== null) {&eol; try {&eol; response = JSON.parse(response);&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ OTRS Webhook ] Failed to parse response received from OTRS');&eol; response = null;&eol; }&eol; }&eol;&eol; if (typeof response.Error !== 'undefined'&eol; && Object.keys(response.Error).length > 0) {&eol; message = 'Request failed: ' + JSON.stringify(response.Error);&eol; }&eol;&eol;&eol; return {&eol; status: request.getStatus(),&eol; response: response&eol; };&eol; },&eol;&eol; createTicket: function(subject, message, priority, fields) {&eol; var result,&eol; data = {&eol; Ticket: {&eol; Title: subject,&eol; Queue: OTRS.params.queue,&eol; State: OTRS.params.ticket_state,&eol; PriorityID: priority &pipe;&pipe; OTRS.params.default_priority_id,&eol; CustomerUser: OTRS.params.customer&eol; },&eol; Article: {&eol; Subject: subject,&eol; Body: message,&eol; TimeUnit: OTRS.params.
ROW |22 |4 |iLert | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |try {&eol; var result = { tags: {} },&eol; params = JSON.parse(value),&eol; req = new HttpRequest(),&eol; resp = '';&eol;&eol; if (typeof params.HTTPProxy === 'string' && params.HTTPProxy.trim() !== '') {&eol; req.setProxy(params.HTTPProxy);&eol; }&eol; var alertSourceKey = params['.ILERT.ALERT.SOURCE.KEY'];&eol; if (!alertSourceKey &pipe;&pipe; (typeof alertSourceKey === 'string' && alertSourceKey.trim() === '')) {&eol; throw 'incorrect value for variable "ILERT.ALERT.SOURCE.KEY". The value must be a non-empty string.';&eol; }&eol; delete params['.ILERT.ALERT.SOURCE.KEY'];&eol; &eol; var ilertApiBaseURL = "https://api.ilert.com";&eol; var reqURL = encodeURI(ilertApiBaseURL + "/api/v1/events/zabbix-mt/" + alertSourceKey)&eol;&eol; var incidentKey = "zabbix-" + params['EVENT.ID'];&eol; var incidentViewURL = ilertApiBaseURL + "/api/v1/incidents/resolve-ik/" + alertSourceKey + "/" + incidentKey;&eol;&eol; req.addHeader('Accept: application/json');&eol; req.addHeader('Content-Type: application/json');&eol;&eol; Zabbix.log(4, '[iLert Webhook] Sending request:' + JSON.stringify(params));&eol; resp = req.post(reqURL, JSON.stringify(params));&eol; Zabbix.log(4, '[iLert Webhook] Receiving response:' + resp);&eol;&eol; try {&eol; resp = JSON.parse(resp);&eol; }&eol; catch (error) {&eol; throw 'incorrect response. iLert returned a non-JSON object.';&eol; }&eol;&eol; if (req.getStatus() == 200) {&eol; result.tags.__ilert_incident_url = incidentViewURL;&eol; return JSON.stringify(result);&eol; }&eol;&eol; if (req.getStatus() == 400 && typeof resp === 'object' && typeof resp.code === 'string') {&eol; if (resp.code === 'NO_OPEN_INCIDENT_WITH_KEY') {&eol; return JSON.stringify(result);&eol; }&eol; if (resp.code === 'INCIDENT_ALREADY_ACCEPTED') {&eol; result.tags.__ilert_incident_url = incidentViewURL;&eol; return JSON.stringify(result);&eol; }&eol; }&eol;&eol; if (typeof resp === 'object' && typeof resp.message === 'string') {&eol; throw resp.message;&eol; }&eol; else {&eol; throw 'Unknown error.';&eol; }&eol;}&eol;catch (error) {&eol; Zabbix.log(3, '[iLert Webhook] Notification failed : ' + error);&eol; throw 'iLert notification failed : ' + error;&eol;}|30s |1 |1 |{EVENT.TAGS.__ilert_incident_url} |iLert incident |Please refer to https://docs.ilert.com/integrations/zabbix/native &eol; &eol;Set global macro {$ZABBIX.URL} with your Zabbix server URL.&eol;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. |0 |
ROW |23 |4 |SolarWinds Service Desk | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var SolarWinds = {&eol; params: {},&eol;&eol; setParams: function (params) {&eol; if (typeof params !== 'object') {&eol; return;&eol; }&eol;&eol; SolarWinds.params = params;&eol; SolarWinds.params.endpoint = 'https://api.samanage.com/';&eol; },&eol;&eol; setProxy: function (HTTPProxy) {&eol; SolarWinds.HTTPProxy = HTTPProxy;&eol; },&eol;&eol; addCustomFields: function (data, fields) {&eol; if (typeof data.incident === 'object' && typeof fields === 'object' && Object.keys(fields).length) {&eol; if (typeof fields.sw_fields === 'object' && Object.keys(fields.sw_fields).length) {&eol; Object.keys(fields.sw_fields)&eol; .forEach(function(field) {&eol; try {&eol; data.incident[field] = JSON.parse(fields.sw_fields[field]);&eol; }&eol; catch (error) {&eol; data.incident[field] = fields.sw_fields[field];&eol; }&eol; });&eol; }&eol;&eol; if (typeof fields.sw_customfields === 'object' && Object.keys(fields.sw_customfields).length) {&eol; data.incident.custom_fields_values = {custom_fields_value: []};&eol; Object.keys(fields.sw_customfields)&eol; .forEach(function(field) {&eol; data.incident.custom_fields_values.custom_fields_value.push({&eol; name: field,&eol; value: fields.sw_customfields[field]&eol; });&eol; });&eol; }&eol; }&eol;&eol; return data;&eol; },&eol;&eol; request: function (method, query, data) {&eol; ['token'].forEach(function (field) {&eol; if (typeof SolarWinds.params !== 'object' &pipe;&pipe; typeof SolarWinds.params[field] === 'undefined'&eol; &pipe;&pipe; SolarWinds.params[field] === '' ) {&eol; throw 'Required SolarWinds param is not set: "' + field + '".';&eol; }&eol; });&eol;&eol; var response,&eol; url = SolarWinds.params.endpoint + query,&eol; request = new HttpRequest();&eol;&eol; request.addHeader('Content-Type: application/json');&eol; request.addHeader('X-Samanage-Authorization: Bearer ' + SolarWinds.params.token);&eol; request.addHeader('Accept: application/vnd.samanage.v2.1+json');&eol;&eol; if (typeof SolarWinds.HTTPProxy !== 'undefined' && SolarWinds.HTTPProxy !== '') {&eol; request.setProxy(SolarWinds.HTTPProxy);&eol; }&eol;&eol; if (typeof data !== 'undefined') {&eol; data = JSON.stringify(data);&eol; }&eol;&eol; Zabbix.log(4, '[ SolarWinds SD Webhook ] Sending request: ' + url + ((typeof data === 'string')&eol; ? ('\n' + data)&eol; : ''));&eol;&eol; switch (method) {&eol; case 'get':&eol; response = request.get(url, data);&eol; break;&eol;&eol; case 'post':&eol; response = request.post(url, data);&eol; break;&eol;&eol; case 'put':&eol; response = request.put(url, data);&eol; break;&eol;&eol; default:&eol; throw 'Unsupported HTTP request method: ' + method;&eol; }&eol;&eol; Zabbix.log(4, '[ SolarWinds SD Webhook ] Received response with status code ' + request.getStatus() +&eol; '\n' + response);&eol;&eol; if (response !== null) {&eol; try {&eol; response = JSON.parse(response);&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ SolarWinds SD Webhook ] Failed to parse response received from SolarWinds');&eol; response = null;&eol; }&eol; }&eol;&eol; if (request.getStatus() < 200 &pipe;&pipe; request.getStatus() >= 300) {&eol; var message = 'Request failed with status code ' + request.getStatus();&eol;&eol; if (response !== null && typeof response.error !== 'undefined'&eol; && Object.keys(response.error).length > 0) {&eol; message += ': ' + JSON.stringify(response.error);&eol; }&eol; else if (response !== null && typeof response === 'object'&eol; && Object.keys(response).length > 0) {&eol; Object.keys(response)&eol; .forEach(function(field) {&eol; message += '\n' + field + ': ' + response[
ROW |24 |4 |SysAid | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var SysAid = {&eol; params: {},&eol;&eol; setParams: function (params) {&eol; var required = ['url', 'auth_user', 'auth_password', 'category_level_1', 'category_level_2',&eol; 'category_level_3', 'incident_id', 'template_id', 'urgency_id', 'incident_state',&eol; 'default_priority_id'&eol; ];&eol;&eol; required.forEach(function (field) {&eol; if (typeof params !== 'object' &pipe;&pipe; typeof params[field] === 'undefined' &pipe;&pipe; params[field] === '') {&eol; throw 'Required param is not set: "' + field + '".';&eol; }&eol; });&eol;&eol; SysAid.params = params;&eol; if (typeof SysAid.params.url === 'string' && !SysAid.params.url.endsWith('/')) {&eol; SysAid.params.url += '/';&eol; }&eol; },&eol;&eol; login: function () {&eol; var result = SysAid.request('post', 'api/v1/login', {&eol; user_name: SysAid.params.auth_user,&eol; password: SysAid.params.auth_password&eol; });&eol;&eol; return result.response.user.id;&eol; },&eol;&eol; request: function (method, query, data) {&eol; var response,&eol; request = SysAid.req &pipe;&pipe; (SysAid.req = new HttpRequest()),&eol; url = SysAid.params.url + query;&eol;&eol; if (typeof SysAid.HTTPProxy !== 'undefined' && SysAid.HTTPProxy.trim() !== '') {&eol; request.setProxy(SysAid.HTTPProxy);&eol; }&eol;&eol; if (typeof data !== 'undefined') {&eol; data = JSON.stringify(data);&eol; }&eol;&eol; Zabbix.log(4, '[ SysAid Webhook ] Sending request: ' +&eol; url + ((typeof data === 'string') ? (' ' + data) : ''));&eol;&eol; switch (method) {&eol; case 'get':&eol; response = request.get(url, data);&eol; break;&eol;&eol; case 'post':&eol; response = request.post(url, data);&eol; break;&eol;&eol; case 'put':&eol; response = request.put(url, data);&eol; break;&eol;&eol; default:&eol; throw 'Unsupported HTTP request method: ' + method;&eol; }&eol;&eol; Zabbix.log(4, '[ SysAid Webhook ] Received response with status code ' + request.getStatus() + ': ' + response);&eol;&eol; if (request.getStatus() !== 200) {&eol; var message = 'Request failed with status code ' + request.getStatus();&eol;&eol; message += ': ' + response;&eol; throw message + ' Check debug log for more information.';&eol; }&eol;&eol; if (response !== null) {&eol; try {&eol; response = JSON.parse(response);&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ SysAid Webhook ] Failed to parse response received from SysAid');&eol; response = null;&eol; }&eol; }&eol;&eol; if (response === null &pipe;&pipe; (typeof response.Error !== 'undefined' && Object.keys(response.Error).length > 0)) {&eol; throw 'Request failed: ' + JSON.stringify(response.Error);&eol; }&eol;&eol; return {&eol; status: request.getStatus(),&eol; response: response&eol; };&eol; },&eol;&eol; createIncident: function(subject, message, priority) {&eol; var result = SysAid.request('post', 'api/v1/sr/?template=' + encodeURIComponent(SysAid.params.template_id), {&eol; info: [&eol; {&eol; key: 'problem_type',&eol; value: [&eol; SysAid.params.category_level_1,&eol; SysAid.params.category_level_2,&eol; SysAid.params.category_level_3&eol; ].join('_')&eol; },&eol; {&eol; key: 'title',&eol; value: subject&eol; },&eol; {&eol; key: 'description',&eol; value: message&eol; },&eol; {&eol; key: 'status',&eol; value: '1'&eol; },&eol; {&eol; key: 'urgency',&eol; value: SysAid.params.urgency_id&eol; },&eol; {&eol; key: 'priority',&eol; value: priority &pipe;&pipe; SysAid.params.default_priority_id,&eol; }&eol; ]&eol; });&eol;&eol; if (result.response.id === 'undefined') {&eol; throw 'Cannot create S
ROW |25 |4 |TOPdesk | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var Media = {&eol; params: {},&eol; name: '',&eol; labels: [],&eol; HTTPProxy: '',&eol;&eol; setParams: function (params) {&eol; if (typeof params !== 'object') {&eol; return;&eol; }&eol;&eol; Media.params = params;&eol; Media.params.api += Media.params.api.endsWith('/') ? '' : '/';&eol; },&eol;&eol; setProxy: function (HTTPProxy) {&eol; if (typeof HTTPProxy !== 'undefined' && HTTPProxy.trim() !== '') {&eol; Media.HTTPProxy = HTTPProxy;&eol; }&eol; },&eol;&eol; request: function (method, query, data) {&eol; ['api', 'token'].forEach(function (field) {&eol; if (typeof Media.params !== 'object' &pipe;&pipe; typeof Media.params[field] === 'undefined'&eol; &pipe;&pipe; Media.params[field] === '') {&eol; throw 'Required ' + Media.name + ' param is not set: "' + field + '".';&eol; }&eol; });&eol;&eol; var response,&eol; url = Media.params.api + query,&eol; request = new HttpRequest();&eol;&eol; request.addHeader('Content-Type: application/json');&eol; request.addHeader('Accept: application/json');&eol; request.addHeader('Authorization: ' + Media.params.token);&eol; request.setProxy(Media.HTTPProxy);&eol;&eol; if (typeof data !== 'undefined') {&eol; data = JSON.stringify(data);&eol; }&eol;&eol; Zabbix.log(4, '[ ' + Media.name + ' Webhook ] Sending request: ' +&eol; url + ((typeof data === 'string') ? ('\n' + data) : ''));&eol;&eol; switch (method) {&eol; case 'get':&eol; response = request.get(url, data);&eol; break;&eol;&eol; case 'post':&eol; response = request.post(url, data);&eol; break;&eol;&eol; case 'put':&eol; response = request.put(url, data);&eol; break;&eol;&eol; default:&eol; throw 'Unsupported HTTP request method: ' + method;&eol; }&eol;&eol; Zabbix.log(4, '[ ' + Media.name + ' Webhook ] Received response with status code ' +&eol; request.getStatus() + '\n' + response);&eol;&eol; if (response !== null) {&eol; try {&eol; response = JSON.parse(response);&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ ' + Media.name + ' Webhook ] Failed to parse response.');&eol; response = null;&eol; }&eol; }&eol;&eol; if (request.getStatus() < 200 &pipe;&pipe; request.getStatus() >= 300) {&eol; var message = 'Request failed with status code ' + request.getStatus();&eol;&eol; if (response !== null) {&eol; if (typeof response.errors === 'object' && Object.keys(response.errors).length > 0) {&eol; message += ': ' + JSON.stringify(response.errors);&eol; }&eol; else if (typeof response.errorMessages === 'object' && Object.keys(response.errorMessages).length > 0) {&eol; message += ': ' + JSON.stringify(response.errorMessages);&eol; }&eol; else if (typeof response.message === 'string') {&eol; message += ': ' + response.message;&eol; }&eol; }&eol;&eol; throw message + ' Check debug log for more information.';&eol; }&eol;&eol; return {&eol; status: request.getStatus(),&eol; response: response&eol; };&eol; }&eol;};&eol;&eol;try {&eol; var result = {tags: {}},&eol; params = JSON.parse(value),&eol; media = {},&eol; fields = {},&eol; resp = {},&eol; required_params = [&eol; 'alert_subject',&eol; 'alert_message',&eol; 'event_id',&eol; 'event_source',&eol; 'event_value',&eol; 'event_update_status',&eol; 'topdesk_api',&eol; 'topdesk_user',&eol; 'topdesk_password'&eol; ],&eol; severities = [&eol; 'not_classified',&eol; 'information',&eol; 'warning',&eol; 'average',&eol; 'high',&eol; 'disaster',&eol; 'resolved',&eol; 'default'&eol; ],&eol; priority;&eol;&eol; Object.keys(params)&eol; .forEach(function (key) {&eol; if (required_params.indexOf(key) !== -1 && params[key].trim() === '') {&eol; throw 'Parameter "' + key + '" cannot be empty.';&eol; }&eol; if (key.startsWith('t
ROW |26 |4 |iTop | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var Itop = {&eol; params: {},&eol;&eol; setParams: function (params) {&eol; if (typeof params !== 'object') {&eol; return;&eol; }&eol;&eol; if (params.log !== 'private_log' && params.log !== 'public_log') {&eol; throw 'Incorrect "itop_log" parameter given: ' + params.log + '\nMust be "private_log" or "public_log".';&eol; }&eol;&eol; Itop.params = params;&eol; if (typeof Itop.params.url === 'string') {&eol; if (!Itop.params.url.endsWith('/')) {&eol; Itop.params.url += '/';&eol; }&eol;&eol; Itop.params.url += 'webservices/rest.php?version=' + encodeURIComponent(Itop.params.api_version);&eol; }&eol; },&eol;&eol; setProxy: function (HTTPProxy) {&eol; Itop.HTTPProxy = HTTPProxy;&eol; },&eol;&eol; setCreatePayload: function () {&eol; json_data.operation = 'core/create';&eol; json_data.fields.org_id = Itop.params.organization_id;&eol; json_data.fields.title = params.alert_subject;&eol; json_data.fields.description = params.alert_message.replace('<', '<')&eol; .replace('>', '>')&eol; .replace(/(?:\r\n&pipe;\r&pipe;\n)/g, '<br>');&eol; },&eol;&eol; setUpdatePayload: function () {&eol; json_data.operation = 'core/update';&eol; json_data.key = Itop.params.id;&eol; json_data.fields.title = params.alert_subject;&eol; json_data.fields[Itop.params.log] = {&eol; add_item: {&eol; message: params.alert_subject + '\n' + params.alert_message,&eol; format: 'text'&eol; }&eol; };&eol; },&eol;&eol; request: function (data) {&eol; ['url', 'user', 'password', 'organization_id', 'class', 'api_version', 'id'].forEach(function (field) {&eol; if (typeof Itop.params !== 'object' &pipe;&pipe; typeof Itop.params[field] === 'undefined'&eol; &pipe;&pipe; Itop.params[field] === '' ) {&eol; throw 'Required Itop param is not set: "itop_' + field + '".';&eol; }&eol; });&eol;&eol; var response,&eol; url = Itop.params.url,&eol; request = new HttpRequest(),&eol; object;&eol;&eol; request.addHeader('Content-Type: multipart/form-data');&eol; request.addHeader('Authorization: Basic ' + btoa(Itop.params.user + ':' + Itop.params.password));&eol;&eol; if (Itop.HTTPProxy) {&eol; request.setProxy(Itop.HTTPProxy);&eol; }&eol;&eol; if (typeof data !== 'undefined') {&eol; data = JSON.stringify(data);&eol; }&eol;&eol; Zabbix.log(4, '[ iTop Webhook ] Sending request: ' + url + '&json_data=' + data);&eol;&eol; response = request.post(url + '&json_data=' + encodeURIComponent(data));&eol;&eol; Zabbix.log(4, '[ iTop Webhook ] Received response with status code ' + request.getStatus() + '\n' + response);&eol;&eol; try {&eol; response = JSON.parse(response);&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ iTop Webhook ] Failed to parse response received from iTop');&eol; throw 'Failed to parse response received from iTop.\nRequest status code ' +&eol; request.getStatus() + '. Check debug log for more information.';&eol; }&eol;&eol; if (request.getStatus() < 200 &pipe;&pipe; request.getStatus() >= 300) {&eol; throw 'Request failed with status code ' + request.getStatus() + '. Check debug log for more information.';&eol; }&eol; else if (typeof response.code !== 'undefined' && response.code !== 0) {&eol; throw 'Request failed with iTop code ' + response.code + ': ' +&eol; JSON.stringify(response.message) + '. Check debug log for more information.';&eol; }&eol; else {&eol; Object.keys(response.objects)&eol; .forEach(function (key) {&eol; object = response.objects[key];&eol; });&eol; &eol; return {&eol; status: request.getStatus(),&eol; response: object.fields&eol; };&eol; }&eol; }&eol;};&eol;&eol;try {&eol; var params = JSON.parse(value),&eol; json_data = {},&eol; itop_params = {},&eol; result = {tags: {}},&eol; required_params = [&eol; 'alert_subject', 'summary', 'event_recovery_value',&eol; 'event_source', 'event_value', 'action_name'&eol; ];&eol;&eol; Object.keys(params)&eol; .forEach(function (key) {&eol; if (key.startsWith('itop_')) {&eol;
ROW |27 |4 |Rocket.Chat | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var RocketChat = {&eol; params: {},&eol;&eol; setParams: function (params) {&eol; if (typeof params !== 'object') {&eol; return;&eol; }&eol;&eol; RocketChat.params = params;&eol; if (RocketChat.params.url && RocketChat.params.api_url) {&eol; if (!RocketChat.params.url.endsWith('/')) {&eol; RocketChat.params.url += '/';&eol; }&eol; if (!RocketChat.params.api_url.endsWith('/')) {&eol; RocketChat.params.api_url += '/';&eol; }&eol; if (RocketChat.params.api_url.startsWith('/')) {&eol; RocketChat.params.api_url = RocketChat.params.api_url.substring(1);&eol; }&eol;&eol; RocketChat.params.url += RocketChat.params.api_url;&eol; }&eol; },&eol;&eol; setProxy: function (HTTPProxy) {&eol; RocketChat.HTTPProxy = HTTPProxy;&eol; },&eol;&eol; addFields: function (fields) {&eol; var data = [];&eol;&eol; if (typeof fields === 'object' && Object.keys(fields).length) {&eol; Object.keys(fields)&eol; .forEach(function(field) {&eol; if (fields[field] === '') {&eol; Zabbix.log(4, '[ RocketChat Webhook ] Field "' + field +&eol; '" can\'t be empty. The field ignored.');&eol; }&eol; else {&eol; try {&eol; var parts = field.split(':'),&eol; prefix = parts[0].split('_');&eol;&eol; if (typeof prefix[2] === 'undefined'&eol; &pipe;&pipe; (prefix[2] === 'p' && params.event_value === '1')&eol; &pipe;&pipe; (prefix[2] === 'r' && params.event_value === '0')) {&eol; data.push({&eol; title: field.substring(field.indexOf(':') + 1),&eol; value: fields[field],&eol; short: prefix[1] === 'short'&eol; });&eol; }&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ RocketChat Webhook ] Can\'t parse field "' + field +&eol; '". The field ignored.');&eol; }&eol; }&eol; });&eol; }&eol;&eol; return data;&eol; },&eol;&eol; request: function (method, query, data) {&eol; ['url', 'api_url', 'user_id', 'user_token', 'send_to'].forEach(function (field) {&eol; if (typeof RocketChat.params !== 'object' &pipe;&pipe; typeof RocketChat.params[field] === 'undefined'&eol; &pipe;&pipe; RocketChat.params[field] === '' ) {&eol; throw 'Required parameter is not set: "' + field + '".';&eol; }&eol; });&eol;&eol; var response,&eol; url = RocketChat.params.url + query,&eol; request = new HttpRequest();&eol;&eol; request.addHeader('Content-Type: application/json');&eol; request.addHeader('X-Auth-Token:' + RocketChat.params.user_token);&eol; request.addHeader('X-User-Id:' + RocketChat.params.user_id);&eol;&eol; if (typeof RocketChat.HTTPProxy !== 'undefined' && RocketChat.HTTPProxy !== '') {&eol; request.setProxy(RocketChat.HTTPProxy);&eol; }&eol;&eol; if (typeof data !== 'undefined') {&eol; data = JSON.stringify(data);&eol; }&eol;&eol; Zabbix.log(4, '[ RocketChat Webhook ] Sending request: ' + url +&eol; ((typeof data === 'string') ? ('\n' + data) : ''));&eol;&eol; switch (method) {&eol; case 'get':&eol; response = request.get(url, data);&eol; break;&eol;&eol; case 'post':&eol; response = request.post(url, data);&eol; break;&eol;&eol; default:&eol; throw 'Unsupported HTTP request method: ' + method;&eol; }&eol;&eol; Zabbix.log(4, '[ RocketChat Webhook ] Received response with status code ' +&eol; request.getStatus() + '\n' + response);&eol;&eol; if (response !== null) {&eol; try {&eol; response = JSON.parse(response);&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ RocketChat Webhook ] Failed to parse response received from RocketChat');&eol; response = null;&eol; }&eol; }&eol;&eol; if (
ROW |28 |4 |VictorOps | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var VictorOps = {&eol; params: {},&eol;&eol; setParams: function (params) {&eol; if (typeof params !== 'object') {&eol; return;&eol; }&eol;&eol; VictorOps.params = params;&eol; if (VictorOps.params.endpoint) {&eol; if (!VictorOps.params.endpoint.endsWith('/')) {&eol; VictorOps.params.endpoint += '/';&eol; }&eol;&eol; if (typeof VictorOps.params.routing_key !== 'undefined'&eol; && VictorOps.params.routing_key !== '{ALERT.SENDTO}'&eol; && VictorOps.params.routing_key !== 'Default') {&eol; VictorOps.params.endpoint += VictorOps.params.routing_key;&eol; }&eol; }&eol; },&eol;&eol; setProxy: function (HTTPProxy) {&eol; VictorOps.HTTPProxy = HTTPProxy;&eol; },&eol;&eol; addFields: function (fields) {&eol; var data = {};&eol;&eol; if (typeof fields === 'object') {&eol; Object.keys(fields)&eol; .forEach(function(field) {&eol; if (fields[field] === '') {&eol; Zabbix.log(4, '[ VictorOps Webhook ] Field "' + field +&eol; '" can\'t be empty. The field ignored.');&eol; }&eol; else {&eol; try {&eol; var parts = field.split(':'),&eol; prefix = parts[0].split('_');&eol;&eol; if (typeof prefix[1] === 'undefined'&eol; &pipe;&pipe; (prefix[1] === 'p' && params.event_value === '1'&eol; && (params.event_update_status === '0'&eol; &pipe;&pipe; params.event_update_status === '{EVENT.UPDATE.STATUS}'))&eol; &pipe;&pipe; (prefix[1] === 'r' && params.event_value === '0'&eol; && (params.event_update_status === '0'&eol; &pipe;&pipe; params.event_update_status === '{EVENT.UPDATE.STATUS}'))&eol; &pipe;&pipe; (prefix[1] === 'u' && params.event_update_status === '1')) {&eol; data[field.substring(field.indexOf(':') + 1)] = fields[field];&eol; }&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ VictorOps Webhook ] Can\'t parse field "' + field +&eol; '". The field ignored.');&eol; }&eol; }&eol; });&eol; }&eol;&eol; return data;&eol; },&eol;&eol; request: function (data) {&eol; if (typeof VictorOps.params !== 'object' &pipe;&pipe; typeof VictorOps.params.endpoint === 'undefined'&eol; &pipe;&pipe; VictorOps.params.endpoint === '' ) {&eol; throw 'Required parameter is not set: "vops_endpoint".';&eol; }&eol;&eol; var response,&eol; url = VictorOps.params.endpoint,&eol; request = new HttpRequest();&eol;&eol; request.addHeader('Content-Type: application/json');&eol;&eol; if (typeof VictorOps.HTTPProxy !== 'undefined' && VictorOps.HTTPProxy !== '') {&eol; request.setProxy(VictorOps.HTTPProxy);&eol; }&eol;&eol; if (typeof data !== 'undefined') {&eol; data = JSON.stringify(data);&eol; }&eol;&eol; Zabbix.log(4, '[ VictorOps Webhook ] Sending request: ' + url +&eol; ((typeof data === 'string') ? ('\n' + data) : ''));&eol;&eol; response = request.post(url, data);&eol;&eol; Zabbix.log(4, '[ VictorOps Webhook ] Received response with status code ' +&eol; request.getStatus() + '\n' + response);&eol;&eol; if (response !== null) {&eol; try {&eol; response = JSON.parse(response);&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ VictorOps Webhook ] Failed to parse response received from VictorOps');&eol; response = null;&eol; }&eol; }&eol;&eol; if (request.getStatus() < 200 &pipe;&pipe; request.getStatus() >= 300) {&eol; var message = 'Request failed with status code ' + request.getStatus();&eol;&eol; if (response !== null && typeof response.messages !== 'undefined') {&eol; message += ': ' + JSON.stringify(response.messages);&eol; }&eol;&eol; throw message + '. Check debug log for more information.';&eol; }&e
ROW |29 |4 |Brevis.one | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var BrevisOne = {&eol; params: [],&eol;&eol; addParam: function (name, value) {&eol; BrevisOne.params.push(name + '=' + encodeURIComponent(value));&eol; },&eol;&eol; setProxy: function (HTTPProxy) {&eol; BrevisOne.HTTPProxy = HTTPProxy;&eol; },&eol;&eol; setPayload: function (params) {&eol; var parts = params.send_to.split(':'),&eol; defaultValues = {&eol; ring: 'true',&eol; flash: 'true',&eol; telauto: 'false'&eol; };&eol;&eol; BrevisOne.addParam('username', params.username);&eol; BrevisOne.addParam('password', params.password);&eol; BrevisOne.addParam('text', params.text);&eol;&eol; if (parts.length > 1) {&eol; BrevisOne.addParam('mode', parts[0]);&eol; BrevisOne.addParam('to', parts[1]);&eol; }&eol; else {&eol; BrevisOne.addParam('to', parts[0]);&eol; }&eol;&eol; Object.keys(defaultValues)&eol; .forEach(function (key) {&eol; if (params[key] && params[key].trim() && params[key].toLowerCase() === defaultValues[key]) {&eol; BrevisOne.addParam(key, defaultValues[key]);&eol; }&eol; });&eol; },&eol;&eol; request: function () {&eol; var response,&eol; request = new HttpRequest(),&eol; data = '?' + BrevisOne.params.join('&');&eol;&eol; request.addHeader('Content-Type: multipart/form-data');&eol;&eol; if (typeof BrevisOne.HTTPProxy !== 'undefined' && BrevisOne.HTTPProxy !== '') {&eol; request.setProxy(BrevisOne.HTTPProxy);&eol; }&eol;&eol; Zabbix.log(4, '[ BrevisOne Webhook ] Sending request.');&eol;&eol; response = request.post(params.endpoint + data);&eol;&eol; Zabbix.log(4, '[ BrevisOne Webhook ] Received response with status code ' +&eol; request.getStatus() + '\n' + response);&eol;&eol; if (request.getStatus() < 200 &pipe;&pipe; request.getStatus() >= 300) {&eol; var message = 'Request failed with status code ' + request.getStatus();&eol;&eol; if (response) {&eol; message += ': ' + response;&eol; }&eol;&eol; throw message + '. Check debug log for more information.';&eol; }&eol; }&eol;};&eol;&eol;try {&eol; var params = JSON.parse(value);&eol;&eol; ['endpoint', 'password', 'username', 'text', 'send_to'].forEach(function (field) {&eol; if (typeof params !== 'object' &pipe;&pipe; typeof params[field] === 'undefined'&eol; &pipe;&pipe; !params[field].trim()) {&eol; throw 'Required parameter is not set: "' + field + '".';&eol; }&eol; });&eol;&eol; if (params.send_to === '{ALERT.SENDTO}') {&eol; throw 'Required parameter is not set: "send_to".';&eol; }&eol;&eol; BrevisOne.setProxy(params.HTTPProxy);&eol; BrevisOne.setPayload(params);&eol; BrevisOne.request();&eol;&eol; return 'OK';&eol;}&eol;catch (error) {&eol; Zabbix.log(3, '[ BrevisOne Webhook ] ERROR: ' + error);&eol; throw 'Sending failed: ' + error;&eol;}|30s |0 |0 | | | |0 |
ROW |30 |4 |Express.ms | | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var Express = {&eol; params: [],&eol;&eol; setParams: function (params) {&eol; if (typeof params !== 'object') {&eol; return;&eol; }&eol;&eol; Express.params = params;&eol;&eol; if (typeof Express.params.url === 'string' && !Express.params.url.endsWith('/')) {&eol; Express.params.url += '/';&eol; }&eol; },&eol;&eol; setProxy: function (HTTPProxy) {&eol; Express.HTTPProxy = HTTPProxy;&eol; },&eol;&eol; request: function (query, data) {&eol; var response,&eol; url = Express.params.url + query,&eol; request = new HttpRequest();&eol;&eol; request.addHeader('Content-Type: application/json');&eol; request.addHeader('Authorization: Bearer ' + Express.params.token);&eol;&eol; if (typeof Express.HTTPProxy !== 'undefined' && Express.HTTPProxy !== '') {&eol; request.setProxy(Express.HTTPProxy);&eol; }&eol;&eol; if (typeof data !== 'undefined') {&eol; data = JSON.stringify(data);&eol; }&eol;&eol; Zabbix.log(4, '[ Express Webhook ] Sending request: ' + url +&eol; ((typeof data === 'string') ? ('\n' + data) : ''));&eol;&eol; response = request.post(url, data);&eol;&eol; Zabbix.log(4, '[ Express Webhook ] Received response with status code ' +&eol; request.getStatus() + '\n' + response);&eol;&eol; if (response !== null) {&eol; try {&eol; response = JSON.parse(response);&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ Express Webhook ] Failed to parse response received from Express');&eol; response = {};&eol; }&eol; }&eol;&eol; if (response.status !== 'ok') {&eol; var message = 'Request failed with status code ' + request.getStatus();&eol;&eol; if (typeof response.reason !== 'undefined') {&eol; message += ': ' + JSON.stringify(response.reason);&eol; }&eol;&eol; throw message + '. Check debug log for more information.';&eol; }&eol;&eol; return response.result;&eol; },&eol;&eol; postMessage: function (is_problem) {&eol; var data,&eol; url,&eol; result = {tags: {}},&eol; response;&eol;&eol; if (is_problem) {&eol; data = {&eol; group_chat_id: Express.params.send_to,&eol; notification: {&eol; status: 'ok',&eol; body: Express.params.message&eol; }&eol; };&eol; url = 'api/v4/botx/notifications/direct';&eol; }&eol; else {&eol; data = {&eol; reply: {&eol; status: 'ok',&eol; body: Express.params.message&eol; }&eol; };&eol; url = 'api/v3/botx/events/reply_event';&eol;&eol; try {&eol; var tags = JSON.parse(Express.params.tags);&eol; }&eol; catch (error) {&eol; throw 'Value of "express_tags" is not JSON. Value: ' + Express.params.tags + '.';&eol; }&eol;&eol; tags.forEach(function(tag) {&eol; if (tag.tag === '__zbx_ex_sync_id_' + Express.params.send_to) {&eol; data.source_sync_id = tag.value;&eol; }&eol; });&eol;&eol; if (!data.source_sync_id) {&eol; throw 'Cannot update data. sync_id for the provided sender is unknown.';&eol; }&eol; }&eol;&eol; response = Express.request(url, data);&eol;&eol; if (is_problem && response.sync_id) {&eol; result.tags['__zbx_ex_sync_id_' + Express.params.send_to] = response.sync_id;&eol;&eol; return JSON.stringify(result);&eol; }&eol; else {&eol; return 'OK';&eol; }&eol; }&eol;};&eol;&eol;try {&eol; var params = JSON.parse(value),&eol; express = {},&eol; required_params = [&eol; 'express_url', 'express_send_to', 'express_message', 'express_tags', 'express_token',&eol; 'event_source', 'event_value', 'event_update_status'&eol; ];&eol;&eol; Object.keys(params)&eol; .forEach(function (key) {&eol; if (key.startsWith('express_')) {&eol; express[key.substring(8)] = params[key];&eol; }&eol;&eol; if (required_params.indexOf(key) !== -1&eol; && (params[key].trim() === '' &pipe;&pipe; params[key] === '{ALERT.SENDTO}')) {&eol; throw 'Parameter "' + key + '" can\'t be em
ROW |31 |4 |ManageEngine ServiceDesk| | | | | | | |25 |0 |0 |0 |0 |1 |3 |10s |1 |var MEngine = {&eol; params: {},&eol;&eol; setParams: function (params) {&eol; if (typeof params !== 'object') {&eol; return;&eol; }&eol;&eol; MEngine.params = params;&eol; if (typeof MEngine.params.url === 'string') {&eol; if (!MEngine.params.url.endsWith('/')) {&eol; MEngine.params.url += '/';&eol; }&eol;&eol; MEngine.params.url += 'api/v3/';&eol; }&eol;&eol; if (MEngine.params.on_premise.toLowerCase() !== 'true'&eol; && typeof MEngine.params.on_demand_url_auth === 'string') {&eol; if (!MEngine.params.on_demand_url_auth.endsWith('/')) {&eol; MEngine.params.on_demand_url_auth += '/';&eol; }&eol;&eol; MEngine.params.on_demand_url_auth += 'oauth/v2/token?';&eol; }&eol; },&eol;&eol; setProxy: function (HTTPProxy) {&eol; MEngine.HTTPProxy = HTTPProxy;&eol; },&eol;&eol; createLink: function (id, url) {&eol; return url + (url.endsWith('/') ? '' : '/') +&eol; ((MEngine.params.on_premise.toLowerCase() === 'true')&eol; ? ('WorkOrder.do?woMode=viewWO&woID=' + id)&eol; : ('app/itdesk/ui/requests/' + id + '/details')&eol; );&eol; },&eol;&eol; refreshAccessToken: function () {&eol; [&eol; 'on_demand_url_auth',&eol; 'on_demand_refresh_token',&eol; 'on_demand_client_id',&eol; 'on_demand_client_secret'&eol; ].forEach(function (field) {&eol; if (typeof MEngine.params !== 'object' &pipe;&pipe; typeof MEngine.params[field] === 'undefined'&eol; &pipe;&pipe; MEngine.params[field].trim() === '' ) {&eol; throw 'Required MEngine param is not set: "sd_' + field + '".';&eol; }&eol; });&eol;&eol; var response,&eol; request = new HttpRequest(),&eol; url = MEngine.params.on_demand_url_auth +&eol; 'refresh_token=' + encodeURIComponent(MEngine.params.on_demand_refresh_token) +&eol; '&grant_type=refresh_token&client_id=' + encodeURIComponent(MEngine.params.on_demand_client_id) +&eol; '&client_secret=' + encodeURIComponent(MEngine.params.on_demand_client_secret) +&eol; '&redirect_uri=https://www.zoho.com&scope=SDPOnDemand.requests.ALL';&eol;&eol; if (MEngine.HTTPProxy) {&eol; request.setProxy(MEngine.HTTPProxy);&eol; }&eol;&eol; Zabbix.log(4, '[ ManageEngine Webhook ] Refreshing access token. Request: ' + url);&eol;&eol; response = request.post(url);&eol;&eol; Zabbix.log(4, '[ ManageEngine Webhook ] Received response with status code ' +&eol; request.getStatus() + '\n' + response);&eol;&eol; try {&eol; response = JSON.parse(response);&eol; }&eol; catch (error) {&eol; Zabbix.log(4, '[ ManageEngine Webhook ] Failed to parse response received from Zoho Accounts');&eol; }&eol;&eol; if ((request.getStatus() < 200 &pipe;&pipe; request.getStatus() >= 300) && !response.access_token) {&eol; throw 'Access token refresh failed with HTTP status code ' + request.getStatus() +&eol; '. Check debug log for more information.';&eol; }&eol; else {&eol; MEngine.params.on_demand_auth_token = response.access_token;&eol; }&eol; },&eol;&eol; request: function (method, query, data) {&eol; var response,&eol; url = MEngine.params.url + query,&eol; input,&eol; request = new HttpRequest(),&eol; message;&eol;&eol; if (MEngine.params.on_premise.toLowerCase() === 'true') {&eol; request.addHeader('TECHNICIAN_KEY: ' + MEngine.params.on_premise_auth_token);&eol; }&eol; else {&eol; request.addHeader('Authorization: Zoho-oauthtoken ' + MEngine.params.on_demand_auth_token);&eol; request.addHeader('Accept: application/v3+json');&eol; }&eol;&eol; if (MEngine.HTTPProxy) {&eol; request.setProxy(MEngine.HTTPProxy);&eol; }&eol;&eol; if (typeof data !== 'undefined') {&eol; data = JSON.stringify(data);&eol; }&eol;&eol; input = 'input_data=' + encodeURIComponent(data);&eol; Zabbix.log(4, '[ ManageEngine Webhook ] Sending request: ' + url + '?' + input);&eol;&eol; switch (method) {&eol; case 'post':&eol; response = request.post(url, input);&eol; break;&eol;&eol; case 'put':&eol; response = request.put(url, input);&eol;