8 Commits
v2.15 ... v2.16

Author SHA1 Message Date
moudsen
2045601eca v2.16 updates 2023-08-18 11:13:24 +02:00
moudsen
5f49628b8a Refreshed example image 2023-08-18 11:10:26 +02:00
moudsen
a069dfa99d Refreshed example output 2023-08-18 11:07:07 +02:00
moudsen
2c2561149a Refreshed example picture 2023-08-18 11:04:21 +02:00
moudsen
0847513eae Refreshed example output 2023-08-18 11:02:21 +02:00
root
62a3ee6149 v2.16 - Added auto-creation of IMAGES directory if not present 2023-08-17 06:39:34 -04:00
root
a7196f8bc5 v2.16 - Fixed code type for detection of ACKNOWLEDGES information from event.get 2023-08-17 06:34:36 -04:00
Mark Oudsen
ededded428 v2.16 - Adding ACKNOWLEDGES message information 2023-08-16 22:50:00 +02:00
6 changed files with 93 additions and 59 deletions

View File

@@ -4,13 +4,13 @@ Over the years I've been using Zabbix as both personal and business solution for
This initiated the development of mailGraph v1 in Zabbix 5.4 delivering an elementary solution for sending HTML enriched messages from Zabbix including graphs.
To facilitate in a very flexible way to setup and format messages including the graphs, Twig made its introduction towards mailGraph v2, the current release branch of mailGraph.
The below message is just an example of what MailGraph is capable of. The template engine in Twig allows for a fully customized message creation to your needs! It is also possible to add more Zabbix fields as any field is passed to Twig when accessible in Zabbix through the macro mechanism. Example: `{ITEM.ID}`.
The below message is just an example of what MailGraph is capable of. The template engine in Twig allows for a fully customized message creation to your needs! It is also possible to add more Zabbix fields as any field is passed to Twig when accessible in Zabbix through the macro mechanism.
Note that all Zabbix host, item or screen related information is made available to Twig automatically.
Example message:
[![](images/Example-mail-message-v122.png?raw=true)](images/Example-mail-message-v122.png)
![Example image](https://github.com/moudsen/mailGraph/assets/16045332/0cb671d9-464f-493b-b250-15dd550fd84a)
mailGraph is capable of adding several series of graphs into a single message delivering a unique experience when and how groups of graph images per the requested periods of time are added.
Currently mailGraph supports hosts, (one or more related) items and screens (applicable to Zabbix 5.4 only).
@@ -20,14 +20,22 @@ More information can be found in the Wiki.
## Installation ##
Please refer to the Wiki how to get mailGraph installed and configured on your system.
## mailGraph v2.16 release ##
_(2023/08/16)_
_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)_
Release notes
- Adding [ACKNOWLEDGES] message information for processing in the TWIG template to allow inclusion of "Action" information in the mail messages (eg. who acknowledged/changed problem status). Refer to the Wiki "Templates" section for more detailed information.
## mailGraph v2.15 release ##
_(2023/08/16)_
_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)_
Release notes
- Fixed new error condition found in Zabbix 5.4.12 where zeroed or blank parameters for a webhook are no longer added as parameters in the Javascript.
- Refactored error handling inside the Javascript to distinguish automatically between 'email ID response' or a debug or warning level message (this prevents the code of throwing an unknown error like 'Invalid JSON').
- Fixed issue with Zabbix 5.4.12 where parameters that are blank or zero did no longer get passed to the Javascript hence causing basic checks to fail. Javascript and parameter checks in mailGraph.php have been adjusted and optimized.
- Refactored the Javascript error handling to get rid of the "Invalid JSON offset" message and to deal with individual error conditions while presenting a better error message on the root cause of the concerning issue.
## mailGraph v2.14 release ##
_(2023/07/10)_
@@ -73,52 +81,6 @@ Principal approach: `composer require phpmailer/phpmailer`, install mailGraph v2
In case Swiftmailer is no longer used elsewhere you can consider to remove this package with `swiftmailer/swiftmailer`.
## mailGraph v2.11 release ##
_(2023/07/01)_
_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)_
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
- mailGraph.xml
- javascript/zabbix.mailGraph.js
For those upgrading to the latest release without installing the media type:
- copy new mailGraph.php over existing mailGraph.php
- open the Media type MailGraph in Zabbix and edit the javascript
-- replace the script contents with the contents of javascript/zabbix.mailGraph.js
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, PHP 7.4 and 8.2 and recent versions of libraries used via composer._
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)_
Zabbix 6.4 verification has succesfully completed.
- Refactored code to remove deprecated and removed functions since Zabbix 6.4.0
-- Zabbix Javascript now using HttpRequest instead of CurlHttpRequest (function name changes implemented)
-- Zabbix API user.login is now based on "username" (instead of "user")
Sidenotes
- Zabbix logging still shows deprecation messages however it is believed these are internal to Zabbix and not related to mailGraph
_(2023/06/29)_
Zabbix 6.4.x verification is in progress. Required intermediate release to fix one major issue (Zabbix login parameters deprecation) and some minor coding updates.
Expect to continue with automatic configuration within the next 2 months.
## Special thank you ##
I would like to express my gratitude to the following people that have actively contributed to bring bugs and improvements to my attention:
- [pqvindesland](https://github.com/pqvindesland)

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

View File

@@ -1,4 +1,4 @@
// mailGraph v2.15
// mailGraph v2.16
// Function to test string
function isJSON(str) {

View File

@@ -60,6 +60,7 @@
// Fixed missing flag for fetching web url related items
// 2.15 2023/08/16 - Mark Oudsen - Bugfix for Zabbix 5.4 where empty or zeroed variables are no longer
// passed by Zabbix (hence resulting in weird errors)
// 2.16 2023/08/16 - Mark Oudsen - Adding ability to use ACKNOWLEDGE messages in the mail message
// ------------------------------------------------------------------------------------------------------
//
// (C) M.J.Oudsen, mark.oudsen@puzzl.nl
@@ -94,7 +95,7 @@
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// CONSTANTS
$cVersion = 'v2.15';
$cVersion = 'v2.16';
$cCRLF = chr(10).chr(13);
$maskDateTime = 'Y-m-d H:i:s';
$maxGraphs = 8;
@@ -462,6 +463,44 @@
_log(': Done. Cleaned up '.$filesRemoved.' file(s), kept '.$filesKept.' file(s)');
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Zabbix translator functions
function zabbixTStoString($linuxTime)
{
return date("Y-m-d H:i:s", $linuxTime);
}
function zabbixActionToString($actionMask)
{
$values = [];
if ($actionMask & 1) { $values[] = "Close problem"; }
if ($actionMask & 2) { $values[] = "Acknowledge event"; }
if ($actionMask & 4) { $values[] = "Add message"; }
if ($actionMask & 8) { $values[] = "Change severity"; }
if ($actionMask & 16) { $values[] = "Unacknowledge event"; }
if ($actionMask & 32) { $values[] = "Suppress event"; }
if ($actionMask & 64) { $values[] = "Unsuppress event"; }
if ($actionMask & 128) { $values[] = "Change event rank to cause"; }
if ($actionMask & 256) { $values[] = "Change event rank to sympton"; }
return implode(", ", $values);
}
function zabbixSeverityToString($severity)
{
switch ($severity) {
case 0: return('Not classified');
case 1: return('Information');
case 2: return('Warning');
case 3: return('Average');
case 4: return('High');
case 5: return('Disaster');
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Initialize ///////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -644,7 +683,7 @@
$z_tmp_cookies = $z_path.'tmp/';
$z_log_path = $z_path.'log/';
// If tmp or log does not exist, create them
// If tmp, log, or images does not exist, create them
if (!is_dir($z_tmp_cookies))
{
mkdir($z_tmp_cookies);
@@ -657,6 +696,12 @@
_log('+ created LOG directory "'.$z_log_path.'"');
}
if (!is_dir($z_images_path))
{
mkdir($z_images_path);
_log('+ created IMAGES directory "'.$z_images_path.'"');
}
// Zabbix user (requires Super Admin access rights to access image generator script)
$z_user = $config['zabbix_user'];
$z_pass = $config['zabbix_user_pwd'];
@@ -801,7 +846,8 @@
'params'=>array('eventids'=>$p_eventId,
'output'=>'extend',
'selectRelatedObject'=>'extend',
'selectSuppressionData'=>'extend'),
'selectSuppressionData'=>'extend',
'select_acknowledges'=>'extend'),
'auth'=>$token,
'id'=>nextRequestID());
@@ -830,6 +876,17 @@
break;
}
// --- Collect and attach acknowledge messages for this event
if (isset($thisEvent['result'][0]['acknowledges'])) {
foreach($thisEvent['result'][0]['acknowledges'] as $aCount=>$anAck) {
$mailData['ACKNOWLEDGES'][$aCount] = $anAck;
$mailData['ACKNOWLEDGES'][$aCount]['_clock'] = zabbixTStoString($anAck['clock']);
$mailData['ACKNOWLEDGES'][$aCount]['_actions'] = zabbixActionToString($anAck['action']);
$mailData['ACKNOWLEDGES'][$aCount]['_old_severity'] = zabbixSeverityToString($anAck['old_severity']);
$mailData['ACKNOWLEDGES'][$aCount]['_new_severity'] = zabbixSeverityToString($anAck['new_severity']);
}
}
$p_triggerId = $thisEvent['result'][0]['relatedObject']['triggerid'];
// ------------------------

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
<version>5.4</version>
<date>2023-08-16T12:05:37Z</date>
<date>2023-08-16T20:38:38Z</date>
<media_types>
<media_type>
<name>MailGraph</name>
@@ -60,7 +60,7 @@
<value>https://myzabbix.com/mailGraph.php</value>
</parameter>
</parameters>
<script>// mailGraph v2.15
<script>// mailGraph v2.16
// Function to test string
function isJSON(str) {
@@ -213,4 +213,3 @@ Trigger ID: {TRIGGER.ID}</message>
</media_type>
</media_types>
</zabbix_export>

View File

@@ -81,6 +81,9 @@
.content {
font-size: 14px;
}
.acknowledge {
font-size: 10px;
}
</style>
</head>
<body>
@@ -112,6 +115,18 @@
</td>
</tr>
</table>
{% if ACKNOWLEDGES|length > 0 %}
<br/>
{% for anAck in ACKNOWLEDGES %}
<table style="border:0; text-align:left;" cellpadding="5" cellspacing="0">
<tr>
<td class="acknowledge">
<b>{{ anAck._clock }}</b><br/><em>({{ anAck.username }}, {{ anAck.name }} {{ anAck.surname }})</em><br/>[{{ anAck._actions }}]<br/>{{ anAck.message }}
</td>
</tr>
</table>
{% endfor %}
{% endif %}
</td>
</tr>
<tr>
@@ -120,11 +135,12 @@
Event ID: <a href="{{ EVENTDETAILS_URL }}">{{ EVENT_ID }}</a> //
Trigger ID: <a href="{{ TRIGGER_URL }}">{{ TRIGGER_ID }}</a> //
Item ID: <a href="{{ ITEM_URL }}">{{ ITEM_ID }}</a> //
Host ID: <a href="{{ HOST_URL }}">{{ HOST_ID }}</a>
Host ID: <a href="{{ HOST_URL }}">{{ HOST_ID }}</a> //
<a href="{{ HOST_PROBLEMS_URL }}">Problems</a>
{% if GRAPH_ZABBIXLINK|length > 0 %}
// Graph ID: <a href="{{ GRAPH_ZABBIXLINK }}">{{ GRAPH_ID }}</a>
{% endif %}
// <a href="{{ ACK_URL }}">Ack</a>
// <a href="{{ ACK_URL }}">Ack</a>
</div>
</td>
</tr>