diff --git a/README.md b/README.md index 11d4b56..d3c4e27 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,19 @@ -## Minor bugfixes to the code (2021/07/07) -Some small fixes were added to v1.29, not big enough to cause a new release, but I suggest to replace the mailGraph.php code with the updated one to prevent possible errors leading into a non-functional mailGraph ... +## Minor bugfixes to the code (2021/10/06) +Code improvements to prevent possible errors leading into a non-functional mailGraph ... (typical error within log or Zabbix: "json error"). +Please inform me in case you have PHP related errors in your logs - this should no longer be the case with v1.31. -## mailGraph (v1.29) +## mailGraph (v1.31) Zabbix Media module and scripts for sending e-mail alerts with graphs. **Please use the Wiki for information on how to install, configure and use MailGraph in Zabbix** ## UPGRADE NOTES +### v1.31 +Updated: mailGraph.pgp + +### v1.19 +Updated: mailGraph.php + ### v1.27 If you upgrade to v1.27 please be aware of the additional features for adding Tags to Trigger and Host to add additional graphs and the associated `html.template` updates that come alone with it (otherwise the new graphs will not show ...). diff --git a/mailGraph.php b/mailGraph.php index 4d98961..6c888c2 100644 --- a/mailGraph.php +++ b/mailGraph.php @@ -39,6 +39,9 @@ // 1.29 2021/04/03 - Mark Oudsen - Bugfix due to stricter JSONRPC version check since Zabbix 5.0.10 // 2021/07/05 - Mark Oudsen - Minor detail added: CLI debug mode now also outputs version // 2021/07/07 - Mark Oudsen - Fixed HTTPProxy typo in code (instead of HTTPPRoxy) + // 2021/07/07 - Mark Oudsen - #20 - Added problem URL as ready to use TWIG macro + // 1.30 2021/07/07 - Mark Oudsen - Adding auto-cleaning of images, log retention and some more macros + // 1.31 2021/10/06 - Mark Oudsen - Bugfixes, PHP error suppression and prevention of trivial errors // ------------------------------------------------------------------------------------------------------ // // (C) M.J.Oudsen, mark.oudsen@puzzl.nl @@ -55,13 +58,14 @@ // 1) Fetch trigger, item, host, graph, event information via Zabbix API via CURL // 2) Fetch Graph(s) associated to the item/trigger (if any) via Zabbix URL login via CURL // 3) Build and send mail message from template using Swift/TWIG + // 4) Cleanup images, retention logs // ///////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS - $cVersion = 'v1.29'; + $cVersion = 'v1.31'; $cCRLF = chr(10).chr(13); $maskDateTime = 'Y-m-d H:i:s'; $maxGraphs = 4; @@ -73,6 +77,11 @@ $cDebugMail = FALSE; // If TRUE, includes log in the mail message (html and plain text attachments) $showLog = FALSE; // Display the log - !!! only use in combination with CLI mode !!! + // Limit server level output errors; this will ensure no error messages are passed to Zabbix which + // otherwise will block mailGraph from functioning correctly + + error_reporting(E_ERROR | E_PARSE); + // INCLUDE REQUIRED LIBRARIES (Composer) // (configure at same location as the script is running or load in your own central library) // -- swiftmailer/swiftmailer https://swiftmailer.symfony.com/docs/introduction.html @@ -504,18 +513,24 @@ $p_graph_match = 'any'; if ((isset($config['graph_match'])) && ($config['graph_match']=='exact')) { $p_graph_match = 'exact'; } + $p_remove_images = 'yes'; + if ((isset($config['remove_images'])) && ($config['remove_images']=='no')) { $p_remove_images = 'no'; } + + $p_log_retention = 365; + if (isset($config['log_retention'])) { $p_log_retention =intval($config['log_retention']); } + // --- GLOBAL CONFIGURATION --- // Script related settings $z_url = $config['script_baseurl']; // Script URL location (for relative paths to images, templates, log, tmp) - $z_url_image = $z_url.'images/'; // Images URL (included in plain message text) + $z_url_image = $z_url.'images/'; // Images URL (included in plain message as text) - // Absolute path where to store the generated images - note: script does not take care of clearing out old images! + // Absolute paths for processing $z_path = getcwd().'/'; // Absolute base path on the filesystem for this url - $z_images_path = $z_path.'images/'; - $z_template_path = $z_path.'templates/'; - $z_tmp_cookies = $z_path.'tmp/'; - $z_log_path = $z_path.'log/'; + $z_images_path = $z_path.'images/'; // Storing images here + $z_template_path = $z_path.'templates/'; // Expecting templates here + $z_tmp_cookies = $z_path.'tmp/'; // Temporary path required for Cookies (front-end login to Zabbix for image generation) + $z_log_path = $z_path.'log/'; // Where logs are stored of mailGraph // Zabbix user (requires Super Admin access rights to access image generator script) $z_user = $config['zabbix_user']; @@ -537,9 +552,9 @@ // Check accessibility of paths and template files ////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// - if (!is_writable($z_images_path)) { echo 'Image path inaccessible?'.$cCRLF; die; } - if (!is_writable($z_tmp_cookies)) { echo 'Cookies temporary path inaccessible?'.$cCRLF; die; } - if (!is_writable($z_log_path)) { echo 'Log path inaccessible?'.$cCRLF; die; } + if (!is_writable($z_images_path)) { echo 'Image path inaccessible (should have read/write rights)?'.$cCRLF; die; } + if (!is_writable($z_tmp_cookies)) { echo 'Cookies temporary path inaccessible (should have read/write rights)?'.$cCRLF; die; } + if (!is_writable($z_log_path)) { echo 'Log path inaccessible (should have read/write rights)?'.$cCRLF; die; } if (!file_exists($z_template_path.'html.template')) { echo 'HTML template missing?'.$cCRLF; die; } if (!file_exists($z_template_path.'plain.template')) { echo 'PLAIN template missing?'.$cCRLF; die; } @@ -572,7 +587,7 @@ if ($token=='') { - echo 'Error logging in to Zabbix? ('.$z_url_api.'): '.$cCRLF; + echo 'Error logging in to Zabbix (check username/password)? ('.$z_url_api.'): '.$cCRLF; echo var_dump($request).$cCRLF; echo var_dump($result).$cCRLF; die; @@ -1195,7 +1210,7 @@ } ///////////////////////////////////////////////////////////////////////////////////////////////////////// - // Prepare HTML LOG content ///////////////////////////////////////////////////////////////////////////// + // Prepare LOG related content ////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// $mailData['LOG_HTML'] = implode('
',$logging); @@ -1208,16 +1223,17 @@ ''.$cCRLF. ''; - // Prepare PLAIN LOG content - $mailData['LOG_PLAIN'] = implode(chr(10),$logging); - // Prepare others + ///////////////////////////////////////////////////////////////////////////////////////////////////////// + // Prepare others /////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////////////////////////// $mailData['TRIGGER_URL'] = $z_server.'triggers.php?form=update&triggerid='.$mailData['TRIGGER_ID']; $mailData['ITEM_URL'] = $z_server.'items.php?form=update&hostid='.$mailData['HOST_ID'].'&itemid='.$mailData['ITEM_ID']; $mailData['HOST_URL'] = $z_server.'hosts.php?form=update&hostid='.$mailData['HOST_ID']; $mailData['EVENTDETAILS_URL'] = $z_server.'tr_events.php?triggerid='.$mailData['TRIGGER_ID'].'&eventid='.$mailData['EVENT_ID']; + $mailData['HOST_PROBLEMS_URL'] = $z_server.'zabbix.php?action=problem.view&filter_hostids%5B%5D='.$mailData['HOST_ID'].'&filter_set=1'; $mailData['EVENT_DURATION'] = $p_duration; @@ -1353,6 +1369,37 @@ // Wrap up ////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// + // Remove generated images? (default=yes) + + function removeGraphs($graphs,$varName) + { + global $mailData; + + foreach($graphs as $aKey=>$anItem) + { + unlink($mailData['GRAPHS_'.$varName][$aKey]['PATH']); + _log('> Removed generated image: '.$mailData['GRAPHS_'.$varName][$aKey]['PATH']); + } + } + + if ($p_remove_images=='yes') + { + if (!$cDebug) + { + removeGraphs($graphFiles,'I'); + removeGraphs($triggerGraphs,'T'); + removeGraphs($hostGraphs,'H'); + } + else + { + _log('> Not removing generated images (debug mode active)'); + } + } + else + { + _log('> Not removing generated images'); + } + // Store log? if (($cDebug) || (isset($problemData['debug']))) @@ -1366,6 +1413,6 @@ $logName = 'log.'.$p_eventId.'.'.date('YmdHis').'.dump'; file_put_contents($z_log_path.$logName,$content); - _log('= Log stored to '.$z_log_path.$logName); + _log('= Log stored to '.$z_log_path.$logName); } ?>