Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/zabbix/zabbix.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'create/src/data.tmpl')
-rw-r--r--create/src/data.tmpl14
1 files changed, 7 insertions, 7 deletions
diff --git a/create/src/data.tmpl b/create/src/data.tmpl
index 037f1e2f766..0fb27f8acbd 100644
--- a/create/src/data.tmpl
+++ b/create/src/data.tmpl
@@ -73,7 +73,7 @@ ROW |12 |4 |Jira | | |
ROW |13 |4 |Jira with CustomFields | | | | | | | |0 |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; 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 schema = Jira.getSchema(),&eol; path = ['projects', 0, 'issuetypes', 0, 'fields'],&eol; field;&eol;&eol; while ((field = path.shift()) !== undefined) {&eol; schema = schema[field];&eol; if (typeof schema === 'undefined') {&eol; schema = null;&eol; break;&eol; }&eol; }&eol;&eol; if (schema) {&eol; Object.keys(fields)&eol; .forEach(function(field) {&eol; data.fields[field] = fields[field];&eol;&eol; if (typeof schema[field] === 'object' && typeof schema[field].schema === 'object'&eol; && (schema[field].schema.type === 'number' &pipe;&pipe; schema[field].schema.type === 'datetime')) {&eol; switch (schema[field].schema.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; else {&eol; delete data.fields[field];&eol; }&eol; break;&eol; }&eol; }&eol; });&eol; }&eol; else {&eol; Zabbix.Log(4, '[ Jira Webhook ] Failed to retrieve field schema.');&eol; }&eol; }&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 CurlHttpRequest();&eol;&eol; request.AddHeader('Content-Type: application/json');&eol; request.AddHeader('Authorization: Basic ' + btoa(Jira.params.user + ':' + Jira.params.password));&eol;&eol; if (typeof Jira.HTTPProxy !== 'undefined' && Jira.HTTPProxy !== '') {&eol; request.SetProxy(Jira.HTTPProxy);&eol; }&eol;&eol; if (typeof data !== 'undefined') {&eol; data = JSON.stringify(data);&eol; }&eol;&eol; Zabbix.Log(4, '[ Jira Webhook ] Sending request: ' + 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, '[ Jira Webhook ] Received response with status code ' + request.Status() + '\n' + response);&eol;&eol; if (response !== null) {&eol; try {&eol; response = JSON.parse(response);&eol; }&eol; catch (error) {&eol; Zabbix.Log(4, '[ Jira Webhook ] Failed to parse response received from Jira');&eol; response = null;&eol; }&eol; }&eol;&eol; if (request.Status() < 200 &pipe;&pipe; request.Status() >= 300) {&eol; var message = 'Request failed with status code ' + request.Status();&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.Status(),&eol; response: response&eol; };&eol; },&eol;&eol; getSchema: function() {&eol; var result = Jira.request('get', 'issue/createmeta?expand=projects.issuetypes.fields&projectKeys=' +&eol; Jira.params.project_key + '&issuetypeNames=' + Jira.params.issue_type);&eol;&eol; return result.response;&eol; },&eol;&eol; createIssue: function(summary, description, fields) {&eol; var data = {&eol; fields: {&eol; project: {&eol; key: Jira.params.project_key&eol; },&eol; issuetype: {&eol; name: Jira.params.issue_type&eol; },&eol; summary: summary,&eol; description: description&eol; }&eol; };&eol;&eol; if (Jira.labels && Jira.labels.length > 0) {&eol; data.fields.labels = Jira.labels;&eol; }&eol; var result = Jira.request('post', 'issue', Jira.addCustomFields(data, fields));&eol;&eol; if (typeof result.response !== 'object' &pipe;&pipe; typeof result.response.key === 'undefined') {&eol; throw 'Cannot create Jira issue. Check debug log for more information.';&eol; }&eol;&eol; return result.response.key;&eol; },&eol;&eol; updateIssue: function(summary, fields, update) {&eol; var data = {fields: {}};&eol;&eol; if (summary) {&eol; data.fields.summary = summary;&eol; }&eol;&eol; Jira.request('put', 'issue/' + Jira.params.issue_key, Jira.addCustomFields(data, fields));&eol; Jira.commentIssue(update);&eol; },&eol;&eol; commentIssue: function(update) {&eol; var data = {};&eol;&eol; if (typeof update === 'string') {&eol; data.body = update;&eol; Jira.request('post', 'issue/' + Jira.params.issue_key + '/comment', data);&eol; }&eol; else if (update.status === '1') {&eol; data.body = update.user + ' ' + update.action + '.';&eol;&eol; if (update.message) {&eol; data.body += '\nMessage: {quote}' + Jira.escapeMarkup(update.message) + '{quote}';&eol; }&eol;&eol; Jira.request('post', 'issue/' + Jira.params.issue_key + '/comment', data);&eol; }&eol; }&eol;};&eol;&eol;try {&eol; var params = JSON.parse(value),&eol; fields = {},&eol; jira = {},&eol; update = {},&eol; result = {tags: {}},&eol; required_params = ['alert_subject', 'summary', 'event_recovery_value', 'event_source', 'event_value'];&eol;&eol; Object.keys(params)&eol; .forEach(function (key) {&eol; if (key.startsWith('jira_')) {&eol; jira[key.substring(5)] = params[key];&eol; }&eol; else if (key.startsWith('customfield_')) {&eol; fields[key] = params[key];&eol; }&eol; else if (key.startsWith('event_update_')) {&eol; update[key.substring(13)] = params[key];&eol; }&eol; else if (required_params.indexOf(key) !== -1 && params[key] === '') {&eol; throw 'Parameter "' + key + '" can\'t be empty.';&eol; }&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; // 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_source !== '0' && params.event_recovery_value === '0') {&eol; throw 'Recovery operations are supported only for trigger-based actions.';&eol; }&eol;&eol; Jira.setParams(jira);&eol; Jira.setProxy(params.HTTPProxy);&eol; Jira.setTags(params.event_tags_json);&eol;&eol; // Create issue for non trigger-based events.&eol; if (params.event_source !== '0' && params.event_recovery_value !== '0') {&eol; Jira.createIssue(params.alert_subject, params.alert_message);&eol; }&eol; // Create issue for trigger-based events.&eol; else if (params.event_value === '1' && update.status === '0' && !jira.issue_key.startsWith(jira.project_key)) {&eol; var key = Jira.createIssue(params.alert_subject,&eol; (Object.keys(fields).length ? params.trigger_description : params.alert_message), fields);&eol;&eol;&eol; result.tags.__zbx_jira_issuekey = key;&eol; result.tags.__zbx_jira_issuelink = params.jira_url +&eol; (params.jira_url.endsWith('/') ? '' : '/') + 'browse/' + key;&eol; }&eol; // Update created issue for trigger-based event.&eol; else {&eol; if (!jira.issue_key.startsWith(jira.project_key)) {&eol; throw 'Incorrect Issue key given: ' + jira.issue_key;&eol; }&eol; Jira.updateIssue(params.alert_subject, fields,&eol; ((params.event_value === '0' && !Object.keys(fields).length)&eol; ? params.alert_message : update));&eol; }&eol;&eol; return JSON.stringify(result);&eol;}&eol;catch (error) {&eol; Zabbix.Log(3, '[ Jira Webhook ] ERROR: ' + error);&eol; throw 'Sending failed: ' + error;&eol;}|30s |1 |1 |{EVENT.TAGS.__zbx_jira_issuelink} |Jira: {EVENT.TAGS.__zbx_jira_issuekey} | |
ROW |14 |4 |MS Teams | | | | | | | |0 |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].indexOf(parseInt(params.event_source)) === -1) {&eol; throw 'Incorrect "event_source" parameter given: "' + params.event_source + '".\nMust be 0-3.';&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: 'Zabbix',&eol; sections: [&eol; {&eol; markdown: 'false',&eol; activityTitle: params.alert_subject,&eol; activitySubtitle: 'On ' + params.host_name + ' [' + params.host_ip + ']',&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; }&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; }&eol; // Resolved message.&eol; else {&eol; facts.push({&eol; name: 'Recovery time',&eol; value: params.event_recovery_time + ' ' + params.event_recovery_date&eol; });&eol; }&eol;&eol; if (params.event_severity && params.event_severity !== '{EVENT.SEVERITY}') {&eol; facts.push({&eol; name: 'Severity',&eol; value: params.event_severity&eol; });&eol; }&eol;&eol;&eol; if (params.event_opdata && params.event_opdata !== '{EVENT.OPDATA}') {&eol; facts.push({&eol; name: 'Operational data',&eol; value: params.event_opdata&eol; });&eol; }&eol;&eol; if (params.event_tags && params.event_tags !== '{EVENT.TAGS}') {&eol; facts.push({&eol; name: 'Event tags',&eol; value: params.event_tags&eol; });&eol; }&eol;&eol; Object.keys(params)&eol; .forEach(function (key) {&eol; if (key.startsWith('fact_') && params[key] !== '') {&eol; facts.push({&eol; name: key.substring(5),&eol; value: params[key]&eol; });&eol; }&eol; else if (key.startsWith('openUri_') && params[key] !== '' && !params[key].startsWith('{')) {&eol; body.potentialAction.push({&eol; '@type': 'OpenUri',&eol; name: key.substring(8),&eol; targets: [&eol; {&eol; os: 'default',&eol; uri: params[key]&eol; }&eol; ]&eol; });&eol; }&eol; });&eol; body.sections[0].facts = facts;&eol; }&eol;&eol; body.sections[0].text = body.sections[0].text.replace(/(?:\r\n&pipe;\r&pipe;\n)/g, '<br>');&eol;&eol; request.addHeader('Content-Type: application/json');&eol;&eol; if (typeof params.HTTPProxy === 'string' && params.HTTPProxy !== '') {&eol; request.setProxy(params.HTTPProxy);&eol; }&eol;&eol; Zabbix.log(4, '[ MS Teams Webhook ] JSON: ' + JSON.stringify(body));&eol;&eol; var response = request.post(params.teams_endpoint, JSON.stringify(body));&eol;&eol; Zabbix.log(4, '[ MS Teams Webhook ] Response: ' + response);&eol;&eol; if (response === '1') {&eol; return 'OK';&eol; }&eol; else {&eol; Zabbix.log(4, '[ MS Teams Webhook ] FAILED with response: ' + response);&eol; throw response;&eol; }&eol;}&eol;catch (error) {&eol; Zabbix.log(3, '[ MS Teams Webhook ] ERROR: ' + error);&eol; throw 'Sending failed: ' + error;&eol;}|30s |0 |0 | | | |
ROW |15 |4 |Redmine | | | | | | | |0 |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; var schema = Redmine.getSchema();&eol;&eol; if (schema) {&eol; data.issue.custom_fields = [];&eol;&eol; Object.keys(fields)&eol; .forEach(function(field) {&eol; for (var idx in schema.custom_fields) {&eol; if (schema.custom_fields[idx].id != field) {&eol; continue;&eol; }&eol;&eol; var field_value;&eol;&eol; switch (schema.custom_fields[idx].field_format) {&eol; case 'string':&eol; field_value = fields[field];&eol; break;&eol;&eol; case 'int':&eol; field_value = parseInt(fields[field]);&eol; break;&eol;&eol; case 'float':&eol; field_value = parseFloat(fields[field]);&eol; break;&eol;&eol; case 'date':&eol; if (fields[field].match(/^\d{4}[.-]\d{2}[.-]\d{2}$/)) {&eol; field_value = fields[field].replace(/\./g, '-');&eol; }&eol; break;&eol; }&eol;&eol; if (field_value !== undefined) {&eol; data.issue.custom_fields.push({id: field, value: field_value});&eol; }&eol; }&eol; });&eol; }&eol; else {&eol; Zabbix.log(4, '[ Redmine Webhook ] Failed to retrieve field schema.');&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; }&eol;&eol; return project_id;&eol; },&eol;&eol; getSchema: function() {&eol; var result = Redmine.request('get', 'custom_fields.json');&eol;&eol; return result.response;&eol; },&eol;&eol; createIssue: function(subject, description, priority, fields) {&eol; var project_id = /^\d+$/.test(Redmine.params.project)&eol; ? Redmine.params.project&eol; : Redmine.getProjectID(Redmine.params.project),&eol; data = {&eol; issue: {&eol; project_id: project_id,&eol; tracker_id: Redmine.params.tracker_id,&eol; subject: subject,&eol; description: description&eol; }&eol; },&eol; result;&eol;&eol; if (priority) {&eol; data.issue.priority_id = priority;&eol; }&eol;&eol; result = Redmine.request('post', 'issues.json', Redmine.addCustomFields(data, fields));&eol;&eol; if (typeof result.response !== 'object'&eol; &pipe;&pipe; typeof result.response.issue.id === 'undefined'&eol; &pipe;&pipe; result.status != 201) {&eol; throw 'Cannot create Redmine issue. Check debug log for more information.';&eol; }&eol;&eol; return result.response.issue.id;&eol; },&eol;&eol; updateIssue: function(note, fields) {&eol; var data = {&eol; issue: {&eol; notes: note &pipe;&pipe; ''&eol; }&eol; };&eol;&eol; Redmine.request('put', 'issues/' + Redmine.params.issue_key + '.json', Redmine.addCustomFields(data, fields));&eol; }&eol;};&eol;&eol;try {&eol; var params = JSON.parse(value),&eol; params_redmine = {},&eol; params_fields = {},&eol; params_update = {},&eol; result = {tags: {}},&eol; required_params = [&eol; 'alert_subject', 'tracker_id', 'project',&eol; 'event_source', 'event_value', 'event_update_status'&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: '#E97659'},&eol; {name: 'disaster', color: '#E45959'},&eol; {name: 'resolved', color: '#009900'},&eol; {name: null, color: '#000000'}&eol; ],&eol; priority;&eol;&eol; Object.keys(params)&eol; .forEach(function (key) {&eol; if (key.startsWith('redmine_')) {&eol; params_redmine[key.substring(8)] = params[key];&eol; }&eol; else if (key.startsWith('customfield_')) {&eol; params_fields[key.substring(12)] = params[key];&eol; }&eol; else if (key.startsWith('event_update_')) {&eol; params_update[key.substring(13)] = params[key];&eol; }&eol; else if (required_params.indexOf(key) !== -1 && params[key].trim() === '') {&eol; throw 'Parameter "' + key + '" cannot be empty.';&eol; }&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; // 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_source === '0' && params.event_update_status !== '0' && params.event_update_status !== '1') {&eol; throw 'Incorrect "event_update_status" parameter given: ' + params.event_update_status + '\nMust be 0 or 1.';&eol; }&eol;&eol; if (params.event_source !== '0' && params.event_value === '0') {&eol; throw 'Recovery operations are supported only for trigger-based actions.';&eol; }&eol;&eol; if (params.event_source === '0'&eol; && ((params.event_value === '1' && params.event_update_status === '1')&eol; &pipe;&pipe; (params.event_value === '0'&eol; && (params.event_update_status === '0' &pipe;&pipe; params.event_update_status === '1')))&eol; && (isNaN(parseInt(params.redmine_issue_key)) &pipe;&pipe; parseInt(params.redmine_issue_key) < 1 )) {&eol; throw 'Incorrect "redmine_issue_key" parameter given: ' + params.redmine_issue_key +&eol; '\nMust be positive integer.';&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['severity_' + severities[params.event_nseverity].name];&eol; priority = priority && priority.trim() &pipe;&pipe; severities[7].name;&eol;&eol; Redmine.setParams(params_redmine);&eol; Redmine.HTTPProxy = params.HTTPProxy;&eol;&eol; // Create issue for non trigger-based events.&eol; if (params.event_source !== '0'&eol; && params.event_value !== '0') {&eol; Redmine.createIssue(params.alert_subject, params.alert_message, priority);&eol; }&eol; // Create issue for trigger-based events.&eol; else if (params.event_value === '1' && params_update.status === '0') {&eol; var issue_id = Redmine.createIssue(params.alert_subject,&eol; params.alert_subject + '\n' + params.alert_message + '\n' +&eol; params.zabbix_url + (params.zabbix_url.endsWith('/') ? '' : '/') +&eol; 'tr_events.php?triggerid=' + params.trigger_id + '&eventid=' + params.event_id + '\n',&eol; priority,&eol; params_fields);&eol;&eol; result.tags.__zbx_redmine_issue_id = issue_id;&eol; result.tags.__zbx_redmine_issuelink = params.redmine_url +&eol; (params.redmine_url.endsWith('/') ? '' : '/') + 'issues/' + issue_id;&eol; }&eol; // Update created issue for trigger-based event.&eol; else {&eol; Redmine.updateIssue(params.alert_subject + '\n' + params.alert_message, params_fields);&eol; }&eol;&eol; return JSON.stringify(result);&eol;}&eol;catch (error) {&eol; Zabbix.log(3, '[ Redmine Webhook ] ERROR: ' + error);&eol; throw 'Sending failed: ' + error;&eol;}|30s |1 |1 |{EVENT.TAGS.__zbx_redmine_issuelink} |Redmine: issue #{EVENT.TAGS.__zbx_redmine_issue_id} | |
-ROW |16 |4 |Telegram | | | | | | | |0 |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; 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; 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; 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)|
+ROW |16 |4 |Telegram | | | | | | | |0 |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; 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', '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)|
ROW |17 |4 |Zendesk | | | | | | | |0 |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 && 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.description !== 'undefined'&eol; && Object.keys(response.description).length > 0) {&eol; message += ': ' + JSON.stringify(response.description);&eol; }&eol; else {&eol; message += '. ' + response;&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; getSchema: function() {&eol; var result = Zendesk.request('get', 'ticket_fields.json');&eol;&eol; return result.response;&eol; },&eol;&eol; createIssue: function(data, fields) {&eol; var result = Zendesk.request('post', 'tickets.json', Zendesk.addCustomFields(data, fields));&eol;&eol; if (typeof result.response !== 'object' &pipe;&pipe; typeof result.response.ticket.id === 'undefined'&eol; &pipe;&pipe; result.status != 201) {&eol; throw 'Cannot create Zendesk issue. Check debug log for more information.';&eol; }&eol;&eol; return result.response.ticket.id;&eol; },&eol;&eol; updateIssue: function(data, fields) {&eol; Zendesk.request('put', 'tickets/' + Zendesk.params.issue_key + '.json', Zendesk.addCustomFields(data, fields));&eol; }&eol;};&eol;&eol;try {&eol; var params = JSON.parse(value),&eol; fields = {},&eol; zendesk = {},&eol; update = {},&eol; data = {},&eol; result = {tags: {}},&eol; required_params = [&eol; 'alert_subject',&eol; 'alert_message',&eol; 'event_id',&eol; 'event_source',&eol; 'event_value',&eol; 'event_update_status'&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: '#E97659'},&eol; {name: 'disaster', color: '#E45959'},&eol; {name: 'resolved', color: '#009900'},&eol; {name: 'default', color: '#000000'}&eol; ],&eol; priority;&eol;&eol; Object.keys(params)&eol; .forEach(function (key) {&eol; if (key.startsWith('zendesk_')) {&eol; zendesk[key.substring(8)] = params[key];&eol; }&eol; else if (key.startsWith('customfield_')) {&eol; fields[key.substring(12)] = params[key];&eol; }&eol; else if (key.startsWith('event_update_')) {&eol; update[key.substring(13)] = params[key];&eol; }&eol; else if (required_params.indexOf(key) !== -1 && params[key].trim() === '') {&eol; throw 'Parameter ' + key + ' cannot be empty.';&eol; }&eol; });&eol;&eol; // Possible values: question, incident, problems, task&eol; if (['question', 'incident', 'problem', 'task'].indexOf(params.zendesk_type) === -1) {&eol; throw 'Incorrect "zendesk_type" parameter given: ' + params.zendesk_type +&eol; '\nMust be one of question, incident, problem, task.';&eol; }&eol;&eol; // Possible values: 0 - Trigger, 1 - Discovery, 2 - Autoregistration, 3 - Internal.&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; // Check {EVENT.VALUE} for trigger-based and internal events.&eol; // Possible values: 1 for problem, 0 for recovering&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; // Possible values: 0 - Webhook was called because of problem/recovery event, 1 - Update operation.&eol; if (params.event_source === '0' && params.event_update_status !== '0' && params.event_update_status !== '1') {&eol; throw 'Incorrect "event_update_status" parameter given: ' + params.event_update_status + '\nMust be 0 or 1.';&eol; }&eol;&eol; if (params.event_source !== '0' && params.event_value === '0') {&eol; throw 'Recovery operations are supported only for trigger-based actions.';&eol; }&eol;&eol; // Zendesk_issue_key must be a positive integer if an update action is being performed.&eol; if (params.event_source === '0' && ((params.event_value === '1' && params.event_update_status === '1')&eol; &pipe;&pipe; (params.event_value === '0' && (params.event_update_status === '0' &pipe;&pipe; params.event_update_status === '1')))&eol; && (isNaN(parseInt(params.zendesk_issue_key)) &pipe;&pipe; parseInt(params.zendesk_issue_key) < 1 )) {&eol; throw 'Incorrect "zendesk_issue_key" parameter given: ' + params.zendesk_issue_key +&eol; '\nMust be positive integer.';&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['severity_' + severities[params.event_nseverity].name] &pipe;&pipe; severities[7].name;&eol;&eol; Zendesk.setParams(zendesk);&eol; Zendesk.HTTPProxy = params.HTTPProxy;&eol;&eol; // Create issue for non trigger-based events.&eol; if (params.event_source !== '0' && params.event_value !== '0') {&eol; data = {&eol; ticket: {&eol; external_id: params.event_id,&eol; type: Zendesk.params.type,&eol; status: 'new',&eol; subject: params.alert_subject,&eol; comment: {&eol; body: params.alert_message,&eol; public: 'false'&eol; },&eol; priority: priority,&eol; tags: params.event_tags&eol; }&eol; };&eol;&eol; Zendesk.createIssue(data, fields);&eol; }&eol; // Create issue for trigger-based events.&eol; else if (params.event_value === '1' && update.status === '0') {&eol; data = {&eol; ticket: {&eol; external_id: params.event_id,&eol; type: Zendesk.params.type,&eol; status: 'new',&eol; subject: params.alert_subject,&eol; comment: {&eol; body: params.zbxurl + (params.zbxurl.endsWith('/') ? '' : '/') + 'tr_events.php?triggerid=' +&eol; params.trigger_id + '&eventid=' + params.event_id + '\n' + params.alert_message,&eol; public: 'false'&eol; },&eol; priority: priority,&eol; tags: params.event_tags&eol; }&eol; };&eol; var key = Zendesk.createIssue(data, fields);&eol;&eol; result.tags.__zbx_zdk_issuekey = key;&eol; result.tags.__zbx_zdk_issuelink = params.zendesk_url +&eol; (params.zendesk_url.endsWith('/') ? '' : '/') + 'agent/tickets/' + key;&eol; }&eol; // Update created issue for trigger-based event.&eol; else {&eol; data = {&eol; ticket: {&eol; type: Zendesk.params.type,&eol; subject: params.alert_subject,&eol; comment: {&eol; body: params.alert_message,&eol; public: 'false'&eol; }&eol; }&eol; };&eol;&eol; Zendesk.updateIssue(data, fields);&eol; }&eol;&eol; return JSON.stringify(result);&eol;}&eol;catch (error) {&eol; Zabbix.log(3, '[Zendesk Webhook] ERROR: ' + error);&eol; throw 'Sending failed: ' + error;&eol;}|30s |1 |1 |{EVENT.TAGS.__zbx_zdk_issuelink} |Zendesk: {EVENT.TAGS.__zbx_zdk_issuekey} | |
ROW |18 |4 |ServiceNow | | | | | | | |0 |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: '#E97659'},&eol; {name: 'disaster', color: '#E45959'},&eol; {name: 'resolved', color: '#009900'},&eol; {name: 'default', color: '#000000'}&eol; ],&eol; method = 'post',&eol; process_tags = true;&eol;&eol; Object.keys(params)&eol; .forEach(function (key) {&eol; if (key.startsWith('servicenow_')) {&eol; servicenow[key.substring(11)] = params[key];&eol; }&eol; else if (key.startsWith('u_')) {&eol; fields[key] = params[key];&eol; }&eol; else if (required_params.indexOf(key) !== -1 && params[key] === '') {&eol; throw 'Parameter "' + key + '" can\'t be empty.';&eol; }&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 ([0, 1, 2, 3, 4, 5].indexOf(parseInt(params.event_nseverity)) === -1) {&eol; params.event_nseverity = '7';&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_source !== '0' && params.event_recovery_value === '0') {&eol; throw 'Recovery operations are supported only for trigger-based actions.';&eol; }&eol;&eol; data.short_description = params.alert_subject;&eol; data.description = params.alert_message;&eol; data.comments = params.alert_message;&eol;&eol; if (typeof params['urgency_for_' + severities[params.event_nseverity].name] !== 'undefined') {&eol; data.urgency = params['urgency_for_' + severities[params.event_nseverity].name];&eol; }&eol;&eol; ServiceNow.setParams(servicenow);&eol; ServiceNow.setProxy(params.HTTPProxy);&eol; ServiceNow.setFields(data, fields);&eol;&eol; if (params.event_source === '0' && (params.event_value === '0' &pipe;&pipe; params.event_update_status === '1')) {&eol; process_tags = false;&eol; method = 'put';&eol; delete data.description;&eol; delete data.urgency;&eol; ServiceNow.params.url += '/' + params.servicenow_sys_id;&eol; }&eol;&eol; var response = ServiceNow.request(method, data);&eol;&eol; if (process_tags) {&eol; result.tags.__zbx_servicenow_sys_id = response.sys_id;&eol; result.tags.__zbx_servicenow_link = params.servicenow_url +&eol; (params.servicenow_url.endsWith('/') ? '' : '/') + 'incident.do?sys_id=' + response.sys_id;&eol; result.tags.__zbx_servicenow_number = response.number;&eol; }&eol;&eol; return JSON.stringify(result);&eol;}&eol;catch (error) {&eol; Zabbix.log(3, '[ ServiceNow Webhook ] ERROR: ' + error);&eol; throw 'Sending failed: ' + error;&eol;}|30s |1 |1 |{EVENT.TAGS.__zbx_servicenow_link} |ServiceNow: {EVENT.TAGS.__zbx_servicenow_number} | |
ROW |19 |4 |Zammad | | | | | | | |0 |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; try {&eol; var tags_json = JSON.parse(tags),&eol; result;&eol;&eol; for (var i in tags_json) {&eol; result = Zammad.request('get',&eol; '/api/v1/tags/add?object=Ticket&o_id=' + ticket_id +&eol; '&item=' + tags_json[i].tag);&eol;&eol; if (typeof result.response !== 'object'&eol; &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; body: message,&eol; type: 'note',&eol; internal: false&eol; },&eol; customer: Zammad.params.customer&eol; },&eol; result;&eol;&eol; if (priority) {&eol; data.priority_id = priority;&eol; }&eol;&eol; result = Zammad.request('post', 'api/v1/tickets', data);&eol;&eol; if (typeof result.response !== 'object'&eol; &pipe;&pipe; typeof result.response.id === 'undefined'&eol; &pipe;&pipe; result.status != 201) {&eol; throw 'Cannot create Zammad ticket. Check debug log for more information.';&eol; }&eol;&eol; return result.response.id;&eol; },&eol;&eol; updateTicket: function(subject, message) {&eol; var data = {&eol; ticket_id: Zammad.params.ticket_id,&eol; subject: subject,&eol; body: message &pipe;&pipe; '',&eol; type: 'note',&eol; internal: false&eol; };&eol;&eol; result = Zammad.request('post', 'api/v1/ticket_articles', data);&eol;&eol; if (typeof result.response !== 'object'&eol; &pipe;&pipe; typeof result.response.id === 'undefined'&eol; &pipe;&pipe; result.status != 201) {&eol; throw 'Cannot update Zammad ticket. Check debug log for more information.';&eol; }&eol; }&eol;};&eol;&eol;try {&eol; var params = JSON.parse(value),&eol; params_zammad = {},&eol; params_update = {},&eol; result = {tags: {}},&eol; required_params = [&eol; 'alert_subject', 'customer',&eol; 'event_source', 'event_value',&eol; 'event_update_status'&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: '#E97659'},&eol; {name: 'disaster', color: '#E45959'},&eol; {name: 'resolved', color: '#009900'},&eol; {name: null, color: '#000000'}&eol; ],&eol; priority;&eol;&eol; Object.keys(params)&eol; .forEach(function (key) {&eol; if (key.startsWith('zammad_')) {&eol; params_zammad[key.substring(7)] = params[key].trim();&eol; }&eol; else if (key.startsWith('event_update_')) {&eol; params_update[key.substring(13)] = params[key];&eol; }&eol; else if (required_params.indexOf(key) !== -1 && params[key].trim() === '') {&eol; throw 'Parameter "' + key + '" cannot be empty.';&eol; }&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; // 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_source === '0' && params.event_update_status !== '0' && params.event_update_status !== '1') {&eol; throw 'Incorrect "event_update_status" parameter given: ' + params.event_update_status + '\nMust be 0 or 1.';&eol; }&eol;&eol; if (params.event_source !== '0' && params.event_value === '0') {&eol; throw 'Recovery operations are supported only for trigger-based actions.';&eol; }&eol;&eol; if (params.event_source === '0'&eol; && ((params.event_value === '1' && params.event_update_status === '1')&eol; &pipe;&pipe; (params.event_value === '0'&eol; && (params.event_update_status === '0' &pipe;&pipe; params.event_update_status === '1')))&eol; && (isNaN(parseInt(params.zammad_ticket_id)) &pipe;&pipe; parseInt(params.zammad_ticket_id) < 1 )) {&eol; throw 'Incorrect "zammad_ticket_id" parameter given: ' + params.zammad_ticket_id +&eol; '\nMust be positive integer.';&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['severity_' + severities[params.event_nseverity].name];&eol; priority = priority && priority.trim() &pipe;&pipe; severities[7].name;&eol;&eol; Zammad.setParams(params_zammad);&eol; Zammad.HTTPProxy = params.HTTPProxy;&eol;&eol; // Create ticket for non trigger-based events.&eol; if (params.event_source !== '0'&eol; && params.event_value !== '0') {&eol; Zammad.createTicket(params.alert_subject, params.alert_message, priority, params.event_tags);&eol; }&eol; // Create ticket for trigger-based events.&eol; else if (params.event_value === '1' && params_update.status === '0') {&eol; var ticket_id = Zammad.createTicket(params.alert_subject,&eol; params.alert_subject + '\n' + params.alert_message + '\n' +&eol; params.zabbix_url + (params.zabbix_url.endsWith('/') ? '' : '/') +&eol; 'tr_events.php?triggerid=' + params.trigger_id + '&eventid=' + params.event_id + '\n',&eol; priority);&eol;&eol; result.tags.__zbx_zammad_ticket_id = ticket_id;&eol; result.tags.__zbx_zammad_ticketlink = params.zammad_url +&eol; (params.zammad_url.endsWith('/') ? '' : '/') + '#ticket/zoom/' + ticket_id;&eol;&eol; if (Zammad.params.enable_tags.toLowerCase() === 'true') {&eol; Zammad.setTicketTags(params.event_tags, ticket_id);&eol; }&eol; }&eol; // Update created ticket for trigger-based event.&eol; else {&eol; Zammad.updateTicket(params.alert_subject, params.alert_message);&eol; }&eol;&eol; return JSON.stringify(result);&eol;}&eol;catch (error) {&eol; Zabbix.log(3, '[ Zammad Webhook ] ERROR: ' + error);&eol; throw 'Sending failed: ' + error;&eol;}|30s |1 |1 |{EVENT.TAGS.__zbx_zammad_ticketlink} |Zammad: ticket #{EVENT.TAGS.__zbx_zammad_ticket_id} | |
@@ -827,12 +827,12 @@ ROW |2 |Traceroute |/usr/bin/traceroute {HOST.CONN}
ROW |3 |Detect operating system|sudo /usr/bin/nmap -O {HOST.CONN} |2 |7 |NULL | | |0 |2 |2 | |0 | | | | | |
TABLE |actions
-FIELDS|actionid|name |eventsource|evaltype|status|esc_period|formula|pause_suppressed|
-ROW |2 |Auto discovery. Linux servers. |1 |0 |1 |0 | |1 |
-ROW |3 |Report problems to Zabbix administrators |0 |0 |1 |1h | |1 |
-ROW |4 |Report not supported items |3 |0 |1 |1h | |1 |
-ROW |5 |Report not supported low level discovery rules|3 |0 |1 |1h | |1 |
-ROW |6 |Report unknown triggers |3 |0 |1 |1h | |1 |
+FIELDS|actionid|name |eventsource|evaltype|status|esc_period|formula|pause_suppressed|notify_if_canceled|
+ROW |2 |Auto discovery. Linux servers. |1 |0 |1 |0 | |1 |1 |
+ROW |3 |Report problems to Zabbix administrators |0 |0 |1 |1h | |1 |1 |
+ROW |4 |Report not supported items |3 |0 |1 |1h | |1 |1 |
+ROW |5 |Report not supported low level discovery rules|3 |0 |1 |1h | |1 |1 |
+ROW |6 |Report unknown triggers |3 |0 |1 |1h | |1 |1 |
TABLE |operations
FIELDS|operationid|actionid|operationtype|esc_period|esc_step_from|esc_step_to|evaltype|recovery|