var SEVERITY_COLORS = [ '#97AAB3', '#7499FF', '#FFC859', '#FFA059', '#E97659', '#E45959' ]; var RESOLVE_COLOR = '#009900'; var SLACK_MODE_HANDLERS = { alarm: handlerAlarm, event: handlerEvent }; var EVENT_STATUS = { PROBLEM: 'PROBLEM', UPDATE: 'UPDATE', RESOLVE: 'OK' }; if (!String.prototype.format) { String.prototype.format = function() { var args = arguments; return this.replace(/{(\d+)}/g, function(match, number) { return number in args ? args[number] : match ; }); }; } function isEventProblem(params) { return params.event_value == 1 && params.event_update_status == 0 ; } function isEventUpdate(params) { return params.event_value == 1 && params.event_update_status == 1 ; } function isEventResolve(params) { return params.event_value == 0; } function getPermalink(channelId, messageTimestamp) { var req = new CurlHttpRequest(); req.AddHeader('Content-Type: application/x-www-form-urlencoded; charset=utf-8'); var resp = JSON.parse(req.Get( '{0}?token={1}&channel={2}&message_ts={3}'.format( Slack.getPermalink, params.bot_token, channelId, messageTimestamp ) )); if (req.Status != 200 && !resp.ok) { throw resp.error; } return resp.permalink; } function createProblemURL(zabbix_url, triggerid, eventid) { var problem_url = '{0}/tr_events.php?triggerid={1}&eventid={2}' .format( zabbix_url.replace(/\/+$/, ''), triggerid, eventid ); return problem_url; } function createInventoryURL(zabbix_url, hostid) { var inventory_url = '{0}/hostinventories.php?hostid={1}' .format( zabbix_url.replace(/\/+$/, ''), hostid ); return inventory_url; } function createHostInfo(region, territory, building, building_code, building_address) { var host_info = '{0}, {1}' .format( building, building_code ); return host_info; } function getTagValue(event_tags, key) { var pattern = new RegExp('(' + key + ':.+)'); var tag_value = event_tags .split(',') .filter(function (v) { return v.match(pattern); }) .map(function (v) { return v.split(':')[1]; })[0] || 0; return tag_value; } function handlerAlarm(params) { var fields = { channel: params.channel, as_user: params.slack_as_user, }; if (isEventProblem(params)) { fields.attachments = [ createMessage( EVENT_STATUS.PROBLEM, SEVERITY_COLORS[params.event_nseverity] || 0, params.event_date, params.event_time, createProblemURL(params.zabbix_url, params.trigger_id, params.event_id), createInventoryURL(params.zabbix_url, params.host_id), createHostInfo(params.region, params.territory, params.building, params.building_code, params.building_address) ) ]; var resp = JSON.parse(req.Post(Slack.postMessage, JSON.stringify(fields))); if (req.Status != 200 && !resp.ok) { throw resp.error; } result.tags['__message_ts_'+params.channel.substring(1)] = resp.ts; result.tags['__channel_id_'+params.channel.substring(1)] = resp.channel; result.tags.__channel_name = params.channel; result.tags.__message_link = getPermalink(resp.channel, resp.ts); result.tags['__channel_name_'+params.channel.substring(1)] = params.channel; result.tags['__message_link_'+params.channel.substring(1)] = getPermalink(resp.channel, resp.ts); } else if (isEventUpdate(params)) { fields.thread_ts = getTagValue(params.event_tags, 'message_ts_'+params.channel.substring(1)); fields.attachments = [ createMessage( EVENT_STATUS.UPDATE, SEVERITY_COLORS[params.event_nseverity] || 0, params.event_update_date, params.event_update_time, createProblemURL(params.zabbix_url, params.trigger_id, params.event_id), createInventoryURL(params.zabbix_url, params.host_id), createHostInfo(params.region, params.territory, params.building, params.building_code, params.building_address), true, params.event_update_message ) ]; resp = JSON.parse(req.Post(Slack.postMessage, JSON.stringify(fields))); if (req.Status != 200 && !resp.ok) { throw resp.error; } } else if (isEventResolve(params)) { fields.channel = getTagValue(params.event_tags, 'channel_id_'+params.channel.substring(1)); fields.text = ''; fields.ts = getTagValue(params.event_tags, 'message_ts_'+params.channel.substring(1)); fields.attachments = [ createMessage( EVENT_STATUS.RESOLVE, RESOLVE_COLOR, params.event_date, params.event_time, createProblemURL(params.zabbix_url, params.trigger_id, params.event_id), createInventoryURL(params.zabbix_url, params.host_id), createHostInfo(params.region, params.territory, params.building, params.building_code, params.building_address) ) ]; resp = JSON.parse(req.Post(Slack.chatUpdate, JSON.stringify(fields))); if (req.Status != 200 && !resp.ok) { throw resp.error; } } } function handlerEvent(params) { var fields = { channel: params.channel, as_user: params.slack_as_user }; if (isEventProblem(params)) { fields.attachments = [ createMessage( EVENT_STATUS.PROBLEM, SEVERITY_COLORS[params.event_nseverity] || 0, params.event_date, params.event_time, createProblemURL(params.zabbix_url, params.trigger_id, params.event_id), createInventoryURL(params.zabbix_url, params.host_id), createHostInfo(params.region, params.territory, params.building, params.building_code, params.building_address) ) ]; var resp = JSON.parse(req.Post(Slack.postMessage, JSON.stringify(fields))); if (req.Status != 200 && !resp.ok) { throw resp.error; } result.tags.__channel_name = params.channel; result.tags.__message_link = getPermalink(resp.channel, resp.ts); result.tags['__channel_name_'+params.channel.substring(1)] = params.channel; result.tags['__message_link_'+params.channel.substring(1)] = getPermalink(resp.channel, resp.ts); } else if (isEventUpdate(params)) { fields.attachments = [ createMessage( EVENT_STATUS.UPDATE, SEVERITY_COLORS[params.event_nseverity] || 0, params.event_update_date, params.event_update_time, createProblemURL(params.zabbix_url, params.trigger_id, params.event_id), createInventoryURL(params.zabbix_url, params.host_id), createHostInfo(params.region, params.territory, params.building, params.building_code, params.building_address), false, params.event_update_message ) ]; resp = JSON.parse(req.Post(Slack.postMessage, JSON.stringify(fields))); if (req.Status != 200 && !resp.ok) { throw resp.error; } } else if (isEventResolve(params)) { fields.attachments = [ createMessage( EVENT_STATUS.RESOLVE, RESOLVE_COLOR, params.event_recovery_date, params.event_recovery_time, createProblemURL(params.zabbix_url, params.trigger_id, params.event_id), createInventoryURL(params.zabbix_url, params.host_id), createHostInfo(params.region, params.territory, params.building, params.building_code, params.building_address) ) ]; resp = JSON.parse(req.Post(Slack.postMessage, JSON.stringify(fields))); if (req.Status != 200 && !resp.ok) { throw resp.error; } } } function createMessage( status, event_severity_color, event_date, event_time, problem_url, inventory_url, host_info, isShort, messageText ) { var message = { fallback: '{0}: {1}'.format(status, params.event_name), title: '{0}: {1}'.format(status, params.event_name), color: event_severity_color, title_link: problem_url, pretext: messageText || '', fields: [ { title: 'Building', value: host_info, short: true }, { title: 'Host', value: '{0} [{1}]'.format(params.host_name, params.host_ip), short: true }, { title: 'Region', value: params.region, short: true }, { title: 'Event time', value: '{0} {1}'.format(event_date, event_time), short: true }, { title: 'Opdata', value: params.event_opdata, short: true }, { title: 'Severity', value: params.event_severity, short: true } ], }; if (!isShort) { message['actions'] = [ { type: 'button', text: 'Open in Zabbix', url: problem_url }, { type: 'button', text: 'Host inventory', url: inventory_url } ]; message.fields.push( { title: ' Trigger description', value: params.trigger_description, short: true }, { title: 'Event tags', value: params.event_tags.replace(/__.+?:(.+?,|.+)/g, '') || 'None', short: true } ); } return message; }