<?xml version="1.0" encoding="UTF-8"?> <zabbix_export> <version>5.4</version> <date>2023-08-16T20:38:38Z</date> <media_types> <media_type> <name>MailGraph</name> <type>WEBHOOK</type> <parameters> <parameter> <name>baseURL</name> <value>https://myzabbix.com/zabbix/</value> </parameter> <parameter> <name>duration</name> <value>{EVENT.DURATION}</value> </parameter> <parameter> <name>eventId</name> <value>{EVENT.ID}</value> </parameter> <parameter> <name>graphHeight</name> <value>120</value> </parameter> <parameter> <name>graphWidth</name> <value>300</value> </parameter> <parameter> <name>HTTPProxy</name> <value/> </parameter> <parameter> <name>infoTest</name> <value>Test</value> </parameter> <parameter> <name>periods</name> <value>10m,4h,1d,7d</value> </parameter> <parameter> <name>periods_headers</name> <value>Last 10 minutes,Last 4 hours,Last day,Last 7 days</value> </parameter> <parameter> <name>recipient</name> <value>{ALERT.SENDTO}</value> </parameter> <parameter> <name>showLegend</name> <value>0</value> </parameter> <parameter> <name>subject</name> <value>{{ HOST_NAME|raw }}: ({{ EVENT_SEVERITY }}) {{ EVENT_NAME|raw }}</value> </parameter> <parameter> <name>URL</name> <value>https://myzabbix.com/mailGraph.php</value> </parameter> </parameters> <script>// mailGraph v2.20 // Function to test string function isJSON(str) { try { JSON.stringify(JSON.parse(str)); return true; } catch (e) { return false; } } try { // Pickup parameters params = JSON.parse(value), req = new HttpRequest(), fields = {}, resp = '', result = { tags: {} }; // Set HTTP proxy if required if (typeof params.HTTPProxy === 'string' && params.HTTPProxy.trim() !== '') { req.setProxy(params.HTTPProxy); fields.HTTPProxy = params.HTTPProxy; } // Declare output type req.addHeader('Content-Type: application/json'); // Pick up fields relevant for mailGraph API level call while parsing/casting fields that should be integer fields.itemId = params.itemId * 1; fields.eventId = params.eventId * 1; fields.recipient = params.recipient; fields.baseURL = params.baseURL; fields.duration = params.duration * 1; if (fields.recipient.charAt(0) == '{') { throw '[MailGraph Webhook] Please define recipient for the test message!'; } // Optional fields if (typeof params.graphWidth === 'string') { fields.graphWidth = params.graphWidth; } if (typeof params.graphHeight === 'string') { fields.graphHeight = params.graphHeight; } if (typeof params.subject === 'string') { fields.subject = params.subject; } if (typeof params.showLegend === 'string') { fields.showLegend = params.showLegend; } if (typeof params.periods === 'string') { fields.periods = params.periods; } if (typeof params.periods_headers === 'string') { fields.periods_headers = params.periods_headers; } if (typeof params.debug === 'string') { fields.debug = params.debug; } // Add generic fields Object.keys(params).forEach(function(key) { if (key.substring(0, 4) == 'info') { fields[key] = params[key]; } }); // Post information to the processing script Zabbix.Log(4, '[MailGraph Webhook] Sending request: ' + params.URL + '?' + JSON.stringify(fields)); var resp = req.post(params.URL,JSON.stringify(fields)); Zabbix.Log(4, '[Mailgraph Webhook] Received response:' + resp); // The response can be // - did not receive status 200 as result (contains HTTP server response) // - null (no response received at all) // - empty string (likely no e-mail sent due to recipient issue) // - not json (debugging message for troubleshooting or configuration hints) // - json (contains the mail message ID sent) if (req.getStatus() != 200) { throw '[MailGraph Webhook] Processing of mailGraph.php failed: ' + resp; } if (resp==null) { throw '[MailGraph Webhook] No response received from mailGraph.php? This should not occur (check URL and your webserver!)'; } if (resp=='') { throw '[MailGraph Webhook] No data received from mailGraph - please check recipient address or mailGraph log and retry.'; } // Check if JSON was returned if (!isJSON(resp)) { throw '[MailGraph Webhook] An error has occurred during processing: ' + resp; } // We expect the message id back from the processing script response in JSON format msg = JSON.parse(resp); result.tags.__message_id = msg.messageId; Zabbix.Log(4, '[MailGraph Webhook] Message sent with identification "' + msg.messageId + '"'); // Pass the result back to Zabbix return JSON.stringify(result); } catch (error) { // In case something else went wrong in the processing, pass the error back to Zabbix Zabbix.Log(127, 'MailGraph notification failed: '+error); throw 'MailGraph notification failed : '+error; }</script> <process_tags>YES</process_tags> <description>The "URL" must point to the location of the processing script. If a proxy is required, define "HTTPProxy" for the proxy address. Customization: - "graphWidth" and "graphWidth" can be defined for the image size - "showLegend" can be defined to show or hide the legend of the graph - "subject" can be defined for a customized subject for the mail message - "periods" and "periods_headers" can be defined for displaying multiple periods of the same graph, or - "period" and "period_header" can be defined to display a single graph The html.template and plain.template files can be adjusted (TWIG format). More details are available at https://github.com/moudsen/mailGraph</description> <message_templates> <message_template> <event_source>TRIGGERS</event_source> <operation_mode>PROBLEM</operation_mode> <subject>Problem: {EVENT.NAME}</subject> <message>Problem started at {EVENT.TIME} on {EVENT.DATE} Problem name: {EVENT.NAME} Host: {HOST.NAME} Severity: {EVENT.SEVERITY} Operational data: {EVENT.OPDATA} Original problem ID: {EVENT.ID} Trigger ID (/url): {TRIGGER.ID} {TRIGGER.URL}</message> </message_template> <message_template> <event_source>TRIGGERS</event_source> <operation_mode>RECOVERY</operation_mode> <subject>Resolved in {EVENT.DURATION}: {EVENT.RECOVERY.NAME}</subject> <message>Problem has been resolved at {EVENT.RECOVERY.TIME} on {EVENT.RECOVERY.DATE} Problem name: {EVENT.RECOVERY.NAME} Problem duration: {EVENT.DURATION} Host: {HOST.NAME} Severity: {EVENT.SEVERITY} Original problem ID: {EVENT.ID} Trigger ID: {TRIGGER.ID} {TRIGGER.URL}</message> </message_template> <message_template> <event_source>TRIGGERS</event_source> <operation_mode>UPDATE</operation_mode> <subject>Updated problem in {EVENT.AGE}: {EVENT.NAME}</subject> <message>{USER.FULLNAME} {EVENT.UPDATE.ACTION} problem at {EVENT.UPDATE.DATE} {EVENT.UPDATE.TIME}. {EVENT.UPDATE.MESSAGE} Current problem status is {EVENT.STATUS}, age is {EVENT.AGE}, acknowledged: {EVENT.ACK.STATUS}. Event ID: {EVENT.ID} Trigger ID: {TRIGGER.ID}</message> </message_template> </message_templates> </media_type> </media_types> </zabbix_export>