diff --git a/README.md b/README.md index b986b7a..b976792 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ -## mailGraph v2.10 release ## -_(2023/06/30)_ +## mailGraph v2.11 release ## +_(2023/07/01)_ -_This version has been verified with Zabbix 5.4, 6.0 LTS and 6.4._ +_This version has been verified with Zabbix 5.4 and 6.0 LTS and is expected to work with 6.4 and later (based on v2.10 testing)_ -Minor updates to the mailGraph code -- When not defining zabbix_api_user and zabbix_api_pwd in the configuration file the zbx_user and zbx_user_pwd wll be used +Release notes +- Added pre- and postchecking of variables to the Zabbix javascript - this will prevent the 'invalid JSON' messages and provide better feedback for errors +- When testing MailGraph it is now possible to set the eventId to zero - a random problem will be picked up via the API +- Zabbix Media Type XML reverted back to version 5.4 (for backwards compatibility) Modified files - mailGraph.php @@ -18,6 +20,14 @@ For those upgrading to the latest release without installing the media type: Changes are in effect immediately, no need to restart any services. +## mailGraph v2.10 release ## +_(2023/06/30)_ + +_This version has been verified with Zabbix 5.4, 6.0 LTS and 6.4._ + +Minor updates to the mailGraph code +- When not defining zabbix_api_user and zabbix_api_pwd in the configuration file the zbx_user and zbx_user_pwd wll be used + ## Zabbix 6.4.x testing ## _(2023/06/30)_ diff --git a/javascript/zabbix.mailGraph.js b/javascript/zabbix.mailGraph.js index 61f2a17..4897ed4 100644 --- a/javascript/zabbix.mailGraph.js +++ b/javascript/zabbix.mailGraph.js @@ -1,3 +1,4 @@ +// mailGraph v2.11 try { // Pickup parameters params = JSON.parse(value), @@ -16,11 +17,23 @@ try { req.addHeader('Content-Type: application/json'); // Must have fields - fields.itemId = params.itemId; - fields.eventId = params.eventId; + fields.itemId = params.itemId * 1; + fields.eventId = params.eventId * 1; fields.recipient = params.recipient; fields.baseURL = params.baseURL; - fields.duration = params.duration; + fields.duration = params.duration * 1; + + if (isNaN(fields.eventId)) { + throw '[MailGraph Webhook] Invalid event ID? Integer required (use actual event ID from Zabbix!)'; + } + + if (isNaN(fields.duration)) { + throw '[MailGraph Webhook] Invalid duration? Integer required (set to zero if unknown)!'; + } + + 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; } @@ -41,14 +54,26 @@ try { // 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] Receiving response:' + resp); + Zabbix.Log(4, '[Mailgraph Webhook] Received response:' + resp); - // If there was an error, report it + // If blank the email address is likely incorrect + if (resp==null) { + throw '[MailGraph Webhook] No data received from mailGraph! Likely the email processing failed? Check mailGraph logging'; + } + + // If there was an error, report it and stop if (req.getStatus() != 200) { throw JSON.parse(resp).errors[0]; } + // If no datas returned, report it and stop + if (resp.charAt(0) == "!") { + throw '[MailGraph Webhook] No data received from mailGraph! Likely the event ID provided does not exist? Check mailGraph logging'; + } + // We expect the message id back from the processing script - resp = JSON.parse(resp); - result.tags.__message_id = resp.messageId; + 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); @@ -56,6 +81,6 @@ try { catch (error) { // In case something went wrong in the processing, pass the error back to Zabbix - Zabbix.Log(127, 'MailGraph notification failed : '+error); + Zabbix.Log(127, 'MailGraph notification failed: '+error); throw 'MailGraph notification failed : '+error; } diff --git a/mailGraph.php b/mailGraph.php index c0df004..276fcf7 100644 --- a/mailGraph.php +++ b/mailGraph.php @@ -49,6 +49,8 @@ // 2.01 2021/12/16 - Mark Oudsen - Screens are no longer available - reverting to using Dashboards now // 2.02 2022/01/30 - Mark Oudsen - Added cleanup routine for old logs and images // 2.10 2023/06/30 - Mark Oudsen - Refactored deprecated code - now compatible with Zabbix 6.0 LTS, 6.4 + // 2.11 2023/07/01 - Mark Oudsen - Refactored Zabbix javascript - now capturing obvious errors + // Added ability to locate latest problems for testing purposes // ------------------------------------------------------------------------------------------------------ // // (C) M.J.Oudsen, mark.oudsen@puzzl.nl @@ -70,7 +72,7 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS - $cVersion = 'v2.10'; + $cVersion = 'v2.11'; $cCRLF = chr(10).chr(13); $maskDateTime = 'Y-m-d H:i:s'; $maxGraphs = 4; @@ -663,6 +665,31 @@ _log('> Token = '.$token); + // ----------------------------------- + // --- IF NO EVENT ID FETCH LATEST --- + // ----------------------------------- + + if ($p_eventId=="0") + { + _log('# No event ID given, picking up random event from Zabbix'); + + $request = array('jsonrpc'=>'2.0', + 'method'=>'problem.get', + 'params'=>array('output'=>'extend', + 'recent'=>'true', + 'limit'=>1), + 'auth'=>$token, + 'id'=>nextRequestID()); + + $thisProblems = postJSON($z_url_api, $request); + _log('> Problem data'.$cCRLF.json_encode($thisProblems,JSON_PRETTY_PRINT|JSON_NUMERIC_CHECK)); + + if (!isset($thisProblems['result'][0])) { echo '! No response data received?'.$cCRLF; die; } + + $p_eventId = $thisProblems['result'][0]['eventid']; + _log('> Picked up random last event #'.$p_eventId); + } + // ------------------------------ // --- READ EVENT INFORMATION --- // ------------------------------ @@ -1440,8 +1467,15 @@ // Return Event TAG information for Zabbix - $response = array('messageId.mailGraph'=>$messageId); - echo json_encode($response).$cCRLF; + $response = array('messageId'=>$messageId); + + if ($response=="") + { + _log("! Failed to send mail message"); + echo "! Failed to send mail message. Likely an issue with the recipient email address?".$cCRLF; + } else { + echo json_encode($response).$cCRLF; + } ///////////////////////////////////////////////////////////////////////////////////////////////////////// // Wrap up ////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/mailGraph.xml b/mailGraph.xml index 9171b4e..a5e8e65 100755 --- a/mailGraph.xml +++ b/mailGraph.xml @@ -1,191 +1,198 @@ - - - 6.0 - 2023-06-29T23:22:52Z - - - MailGraph - WEBHOOK - - - baseURL - https://mydomain.com/zabbix/ - - - duration - {EVENT.DURATION} - - - eventId - {EVENT.ID} - - - graphHeight - 120 - - - graphWidth - 300 - - - HTTPProxy - - - - infoTest - Test - - - itemId - {ITEM.ID} - - - periods - 10m,4h,1d,7d - - - periods_headers - Last 10 minutes,Last 4 hours,Last day,Last 7 days - - - recipient - {ALERT.SENDTO} - - - showLegend - 0 - - - subject - {{ HOST_NAME|raw }}: ({{ EVENT_SEVERITY }}) {{ EVENT_NAME|raw }} - - - URL - https://mydomain.com/mailGraph.php - - - - - YES - 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 - - - TRIGGERS - PROBLEM - Problem: {EVENT.NAME} - 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.URL} - -eventId: {EVENT.ID} -TriggerId: {TRIGGER.ID} -itemId: {ITEM.ID] - - - TRIGGERS - RECOVERY - Resolved in {EVENT.DURATION}: {EVENT.RECOVERY.NAME} - 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.URL} - -eventId: {EVENT.ID} -TriggerId: {TRIGGER.ID} -itemId: {ITEM.ID] - - - TRIGGERS - UPDATE - Updated problem in {EVENT.AGE}: {EVENT.NAME} - {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}. - -eventId: {EVENT.ID} -TriggerId: {TRIGGER.ID} -itemId: {ITEM.ID] - - - - -