mirror of
https://github.com/moudsen/mailGraph
synced 2025-04-21 04:24:27 +02:00
Compare commits
No commits in common. "main" and "v2.18" have entirely different histories.
25
README.md
25
README.md
@ -20,42 +20,23 @@ More information can be found in the Wiki.
|
|||||||
## Installation ##
|
## Installation ##
|
||||||
Please refer to the Wiki how to get mailGraph installed and configured on your system.
|
Please refer to the Wiki how to get mailGraph installed and configured on your system.
|
||||||
|
|
||||||
## Reference websites ##
|
## Announcement - Zabbix 5.x maintenance for mailGraph end-of-life - mailGraph 3.x development in progress ##
|
||||||
[Extensive GERMAN installation from scratch](https://znil.net/index.php?title=Zabbix_mailGraph_installieren_-_Trigger_Alerts_Emails_mit_Grafiken) - nice work from Bernard Linz
|
|
||||||
|
|
||||||
## Announcements ##
|
|
||||||
_(2025/02/04)_
|
|
||||||
|
|
||||||
Started on coding and testing mailGraph v3.
|
|
||||||
|
|
||||||
_(2025/01/26)_
|
|
||||||
|
|
||||||
mailGraph v2.20 now supporting Zabbix 7.0 (LTS) and Zabbix 7.2 (in particular the new API bearer token authentication method).
|
|
||||||
|
|
||||||
_(2024/12/01)_
|
|
||||||
|
|
||||||
As per December 2024 PHP 7 and older is no longer supported. Please upgrade to a supported PHP 8 version.
|
|
||||||
Note that mailGraph is expected to function in older PHP versions.
|
|
||||||
|
|
||||||
_(2023/11/01)_
|
_(2023/11/01)_
|
||||||
|
|
||||||
As per November 2023 the maintenance on mailGraph v2.x for Zabbix 5.x will stop in conjunction with the Zabbix lifecycle policy (https://www.zabbix.com/life_cycle_and_release_policy) as Zabbix 5 is nearing it's end of life.
|
As per November 2023 the maintenance on mailGraph v2.x for Zabbix 5.x will stop in conjunction with the Zabbix lifecycle policy (https://www.zabbix.com/life_cycle_and_release_policy) as Zabbix 5 is nearing it's end of life.
|
||||||
|
|
||||||
|
In conjunction mailGraph v2.x is now frozen and I'm setting up a roadmap for mailGraph v3.x starting new development in Alfa mode as November 2023. This new code is not expected to be published until start of 2024.
|
||||||
|
|
||||||
Principal bug fixing on mailGraph v2.x (logic failure or similar) will continue but only for Zabbix 6.x onwards.
|
Principal bug fixing on mailGraph v2.x (logic failure or similar) will continue but only for Zabbix 6.x onwards.
|
||||||
|
|
||||||
## Ideas and improvements ##
|
|
||||||
|
|
||||||
I'm open to new feature requests - please raise an issue for this in this Github space.
|
I'm open to new feature requests - please raise an issue for this in this Github space.
|
||||||
|
|
||||||
[#50 - Docker support](https://github.com/moudsen/mailGraph/issues/50) - Docker support inserted shortly after testing; will be pushed into release 3 shortly.
|
|
||||||
|
|
||||||
## Special thank you ##
|
## 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:
|
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)
|
- [pqvindesland](https://github.com/pqvindesland)
|
||||||
- [BernardLinz](https://github.com/BernhardLinz)
|
- [BernardLinz](https://github.com/BernhardLinz)
|
||||||
- [WMP](https://github.com/WMP)
|
- [WMP](https://github.com/WMP)
|
||||||
- [dima-online](https://github.com/dima-online)
|
- [dima-online](https://github.com/dima-online)
|
||||||
- [tadeuszkura](https://github.com/tadeuszkura)
|
|
||||||
|
|
||||||
## IMPORTANT NOTE for users of mailGraph v2 and older and Zabbix versions under 6.0 ##
|
## IMPORTANT NOTE for users of mailGraph v2 and older and Zabbix versions under 6.0 ##
|
||||||
As per November 2023, mailGraph is no longer maintained for Zabbix 5 and older.
|
As per November 2023, mailGraph is no longer maintained for Zabbix 5 and older.
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
"smtp_reply_address": "feedback@mydomain.com",
|
"smtp_reply_address": "feedback@mydomain.com",
|
||||||
"smtp_reply_name": "mailGraph response mailbox",
|
"smtp_reply_name": "mailGraph response mailbox",
|
||||||
"graph_match": "any",
|
"graph_match": "any",
|
||||||
"item_value_truncate": 50,
|
|
||||||
"period": "20m",
|
"period": "20m",
|
||||||
"period_header": "Last 20 minutes",
|
"period_header": "Last 20 minutes",
|
||||||
"retention_images": 7,
|
"retention_images": 7,
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
{
|
|
||||||
"script_baseurl": "https:\/\/mydomain.com\/",
|
|
||||||
"cli_eventId": 0,
|
|
||||||
"cli_duration": 0,
|
|
||||||
"cli_recipient": "recipient@mydomain.com",
|
|
||||||
"cli_subject": "[TEST] {{ HOST_NAME|raw }}: ({{ EVENT_SEVERITY }}) {{ EVENT_NAME|raw }}",
|
|
||||||
"cli_baseURL": "https:\/\/mydomain.com\/zabbix\/",
|
|
||||||
"cli_period": "30m",
|
|
||||||
"cli_period_header": "Last 30 minutes",
|
|
||||||
"cli_debug": 1,
|
|
||||||
"cli_proxy": "",
|
|
||||||
"zabbix_user": "alogicalusername",
|
|
||||||
"zabbix_user_pwd": "astrongpassword",
|
|
||||||
"zabbix_api_token": "TheTokenGeneratedInZabbix",
|
|
||||||
"subject": "{{ HOST_NAME|raw }}: ({{ EVENT_SEVERITY }}) {{ EVENT_NAME|raw }}",
|
|
||||||
"smtp_server": "localhost",
|
|
||||||
"smtp_port": 25,
|
|
||||||
"smtp_security": "none",
|
|
||||||
"smtp_strict": "yes",
|
|
||||||
"smtp_from_address": "mailgraph@mydomain.com",
|
|
||||||
"smtp_from_name": "mailGraph",
|
|
||||||
"smtp_reply_address": "feedback@mydomain.com",
|
|
||||||
"smtp_reply_name": "mailGraph response mailbox",
|
|
||||||
"graph_match": "any",
|
|
||||||
"item_value_truncate": 50,
|
|
||||||
"period": "20m",
|
|
||||||
"period_header": "Last 20 minutes",
|
|
||||||
"retention_images": 7,
|
|
||||||
"retention_logs": 14,
|
|
||||||
"debug": 0
|
|
||||||
}
|
|
@ -23,7 +23,6 @@
|
|||||||
"smtp_reply_address": "feedback@mydomain.com",
|
"smtp_reply_address": "feedback@mydomain.com",
|
||||||
"smtp_reply_name": "mailGraph response mailbox",
|
"smtp_reply_name": "mailGraph response mailbox",
|
||||||
"graph_match": "any",
|
"graph_match": "any",
|
||||||
"item_value_truncate": 50,
|
|
||||||
"periods": "10m,4h,2d,7d",
|
"periods": "10m,4h,2d,7d",
|
||||||
"periods_headers": "Last 10 minutes,Last 4 hours,Last 2 days,Last 7 days",
|
"periods_headers": "Last 10 minutes,Last 4 hours,Last 2 days,Last 7 days",
|
||||||
"debug": 0
|
"debug": 0
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 55 KiB |
@ -1,4 +1,4 @@
|
|||||||
// mailGraph v2.20
|
// mailGraph v2.16
|
||||||
|
|
||||||
// Function to test string
|
// Function to test string
|
||||||
function isJSON(str) {
|
function isJSON(str) {
|
||||||
|
177
mailGraph.php
177
mailGraph.php
@ -37,16 +37,10 @@
|
|||||||
// Tested with PHP 8.3, TWIG (3.18.0)
|
// Tested with PHP 8.3, TWIG (3.18.0)
|
||||||
// 2.18 2025/01/10 - Mark Oudsen - SCREEN tag information is only processed for Zabbix versions <= 5
|
// 2.18 2025/01/10 - Mark Oudsen - SCREEN tag information is only processed for Zabbix versions <= 5
|
||||||
// 2025/01/14 - Mark Oudsen - Fixed #51 SMTPS (implicit) or STARTTLS (explicit)
|
// 2025/01/14 - Mark Oudsen - Fixed #51 SMTPS (implicit) or STARTTLS (explicit)
|
||||||
// 2.20 2025/01/25 - Mark Oudsen - Fixed #49 to support Zabbix API bearer token (Zabbix 7.x+)
|
|
||||||
// Added detection of php curl module (must have)
|
|
||||||
// Fixed bug on array size determination
|
|
||||||
// CURLOPT_BINARYTRANSFER deprecated (removed)
|
|
||||||
// ------------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------------
|
||||||
// Release 3 placeholder for Zabbix 7.0 LTS and 7.2+
|
// Release 3 placeholder for Zabbix 7.0 LTS and 7.2+
|
||||||
// ------------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------------
|
||||||
// 2.20 Tested in Zabbix 7.0.7 LTS and Zabbix 7.2.2
|
// v2.18 Testing on Zabbix 7.0 LTS (in progress), Zabbix 7.2 (in progress)
|
||||||
// 2.21 2025/02/20 - Mark Oudsen - Added #57 enhancement for manipulation of data value truncing
|
|
||||||
// 2.22 2025/03/19 - Mark Oudsen - Fixed #60 incorrect JSON request (boolean as text instead of bool)
|
|
||||||
// ------------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// (C) M.J.Oudsen, mark.oudsen@puzzl.nl
|
// (C) M.J.Oudsen, mark.oudsen@puzzl.nl
|
||||||
@ -60,27 +54,16 @@
|
|||||||
//
|
//
|
||||||
// Notes
|
// Notes
|
||||||
// -----
|
// -----
|
||||||
// 1) mailGraph is following the environmental requirements from Zabbix, supporting PHP 7 and 8 as per
|
// 1) mailGraph is following the environmental requirements from Zabbix, supporting PHP 7.4-8.3 ad per
|
||||||
// - https://www.zabbix.com/documentation/6.0/en/manual/installation/requirements
|
// - https://www.zabbix.com/documentation/6.0/en/manual/installation/requirements
|
||||||
// - https://www.zabbix.com/documentation/6.4/en/manual/installation/requirements
|
// - https://www.zabbix.com/documentation/6.4/en/manual/installation/requirements
|
||||||
// - https://www.zabbix.com/documentation/7.0/en/manual/installation/requirements
|
|
||||||
// - https://www.zabbix.com/documentation/7.2/en/manual/installation/requirements
|
|
||||||
//
|
//
|
||||||
// 2) TWIG 3.18.0 is available on PHP 8 only
|
// 2) TWIG 3.18.0 is available on PHP 8 only (seemless upgrade when using composer update)
|
||||||
// - Seemless in-place upgrade when using composer update after upgrading PHP 7.x to PHP 8.x
|
|
||||||
//
|
//
|
||||||
// 3) Full testing of composer libraries updates/versions is limited to every 6 to 12 months
|
// 3) Testing of composer libraries updates is limited to every 6 to 12 months
|
||||||
// - In case you encounter an issue, please raise an issue on GitHub
|
// - In case you encounter an issue, please raise an issue on GitHub
|
||||||
// https://github.com/moudsen/mailGraph/issues
|
// https://github.com/moudsen/mailGraph/issues
|
||||||
// - Refer to the wiki for exact versions tested
|
|
||||||
//
|
//
|
||||||
// 4) PHP related notes
|
|
||||||
// - PHP 5.4 - Limited to mailGraph v1.xx only - unsupported (end of life) - Tested - No more updates
|
|
||||||
// - PHP 7.x - Limited to mailGraph v2.xx only - unsupported (end of life) - Tested - Freezing
|
|
||||||
// - PHP 8.x - Supported - Tested
|
|
||||||
//
|
|
||||||
// 5) Zabbix related
|
|
||||||
// - As from Zabbix 7.2 onwards the only authentication method accepted is API bearer token
|
|
||||||
//
|
//
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -92,7 +75,7 @@
|
|||||||
// -------
|
// -------
|
||||||
// - Automatic setup and configuration of mailGraph
|
// - Automatic setup and configuration of mailGraph
|
||||||
// - Automatic code updates (CLI triggered)
|
// - Automatic code updates (CLI triggered)
|
||||||
// - Add DASHBOARD processing facility (SCREEN was abandoned after Zabbix 5.4) [idea only]
|
// - Add DASHBOARD facility (SCREEN was abandoned in Zabbix 5.4
|
||||||
// - Extract Graph API functionality to seperate code unit/object
|
// - Extract Graph API functionality to seperate code unit/object
|
||||||
//
|
//
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -111,7 +94,7 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// CONSTANTS
|
// CONSTANTS
|
||||||
$cVersion = 'v2.22';
|
$cVersion = 'v2.18';
|
||||||
$cCRLF = chr(10).chr(13);
|
$cCRLF = chr(10).chr(13);
|
||||||
$maskDateTime = 'Y-m-d H:i:s';
|
$maskDateTime = 'Y-m-d H:i:s';
|
||||||
$maxGraphs = 8;
|
$maxGraphs = 8;
|
||||||
@ -141,7 +124,7 @@
|
|||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Fetch the response of the given URL
|
// Fetch the HTML source of the given URL
|
||||||
// --- Redirects will be honored
|
// --- Redirects will be honored
|
||||||
// --- Enforces use of IPv4
|
// --- Enforces use of IPv4
|
||||||
// --- Caller must verify if the return string is JSON or ERROR
|
// --- Caller must verify if the return string is JSON or ERROR
|
||||||
@ -152,7 +135,6 @@
|
|||||||
global $cVersion;
|
global $cVersion;
|
||||||
global $cDebug;
|
global $cDebug;
|
||||||
global $HTTPProxy;
|
global $HTTPProxy;
|
||||||
global $z_api_token;
|
|
||||||
|
|
||||||
// Initialize Curl instance
|
// Initialize Curl instance
|
||||||
_log('% postJSON: '.$url);
|
_log('% postJSON: '.$url);
|
||||||
@ -161,6 +143,7 @@
|
|||||||
$ch = curl_init();
|
$ch = curl_init();
|
||||||
|
|
||||||
// Set options
|
// Set options
|
||||||
|
|
||||||
if ((isset($HTTPProxy)) && ($HTTPProxy!=''))
|
if ((isset($HTTPProxy)) && ($HTTPProxy!=''))
|
||||||
{
|
{
|
||||||
if ($cDebug) { _log('% Using proxy: '.$HTTPProxy); }
|
if ($cDebug) { _log('% Using proxy: '.$HTTPProxy); }
|
||||||
@ -170,41 +153,18 @@
|
|||||||
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
|
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
|
||||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
|
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
|
||||||
|
|
||||||
// Set headers
|
|
||||||
$headers = ['Content-Type:application/json'];
|
|
||||||
|
|
||||||
// Bypass token authentication method if we are using API token method
|
|
||||||
if ($z_api_token != '') {
|
|
||||||
if ($data['method']!='apiinfo.version') {
|
|
||||||
$headers[] = 'Authorization: Bearer '.$z_api_token;
|
|
||||||
|
|
||||||
if ($cDebug) { _log('> Adding API bearer token'); }
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($data['auth'])) {
|
|
||||||
unset($data['auth']);
|
|
||||||
|
|
||||||
if ($cDebug) { _log('> Cleared AUTH information'); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
|
||||||
|
|
||||||
// Set POST
|
|
||||||
curl_setopt($ch, CURLOPT_POST, TRUE);
|
curl_setopt($ch, CURLOPT_POST, TRUE);
|
||||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||||
|
|
||||||
// Set URL and output-to-variable option
|
|
||||||
curl_setopt($ch, CURLOPT_URL, $url);
|
curl_setopt($ch, CURLOPT_URL, $url);
|
||||||
|
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
|
||||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
|
||||||
|
|
||||||
// Set Agent name
|
|
||||||
curl_setopt($ch, CURLOPT_USERAGENT, 'Zabbix-mailGraph - '.$cVersion);
|
curl_setopt($ch, CURLOPT_USERAGENT, 'Zabbix-mailGraph - '.$cVersion);
|
||||||
|
|
||||||
// Execute Curl
|
// Execute Curl
|
||||||
$data = curl_exec($ch);
|
$data = curl_exec($ch);
|
||||||
|
|
||||||
// Check if we have valid data
|
|
||||||
if ($data===FALSE)
|
if ($data===FALSE)
|
||||||
{
|
{
|
||||||
_log('! Failed: '.curl_error($ch));
|
_log('! Failed: '.curl_error($ch));
|
||||||
@ -241,7 +201,6 @@
|
|||||||
global $z_tmp_cookies;
|
global $z_tmp_cookies;
|
||||||
global $z_images_path;
|
global $z_images_path;
|
||||||
global $z_url_api;
|
global $z_url_api;
|
||||||
global $z_api_token;
|
|
||||||
global $cVersion;
|
global $cVersion;
|
||||||
global $cCRLF;
|
global $cCRLF;
|
||||||
global $HTTPProxy;
|
global $HTTPProxy;
|
||||||
@ -278,6 +237,9 @@
|
|||||||
"&graphtype=".$graphType."&legend=".$showLegend."&profileIdx=web.graphs.filter".
|
"&graphtype=".$graphType."&legend=".$showLegend."&profileIdx=web.graphs.filter".
|
||||||
"&from=now-".$period."&to=now";
|
"&from=now-".$period."&to=now";
|
||||||
|
|
||||||
|
// Prepare POST login
|
||||||
|
$z_login_data = array('name' => $z_user, 'password' => $z_pass, 'enter' => "Sign in");
|
||||||
|
|
||||||
// Cookie and image names
|
// Cookie and image names
|
||||||
$filename_cookie = $z_tmp_cookies ."zabbix_cookie_" .$graphid . "." .$thisTime. ".txt";
|
$filename_cookie = $z_tmp_cookies ."zabbix_cookie_" .$graphid . "." .$thisTime. ".txt";
|
||||||
$filename = "zabbix_graph_" .$graphid . "." . $thisTime . "-" . $period . ".png";
|
$filename = "zabbix_graph_" .$graphid . "." . $thisTime . "-" . $period . ".png";
|
||||||
@ -298,9 +260,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
|
||||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||||||
|
|
||||||
$z_login_data = array('name' => $z_user, 'password' => $z_pass, 'enter' => "Sign in");
|
|
||||||
curl_setopt($ch, CURLOPT_POST, true);
|
curl_setopt($ch, CURLOPT_POST, true);
|
||||||
curl_setopt($ch, CURLOPT_POSTFIELDS, $z_login_data);
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $z_login_data);
|
||||||
|
|
||||||
@ -312,9 +274,8 @@
|
|||||||
|
|
||||||
if ($login!='')
|
if ($login!='')
|
||||||
{
|
{
|
||||||
//TODO: Pick up the specific error from CURL?
|
|
||||||
echo 'Error logging in to Zabbix!'.$cCRLF;
|
echo 'Error logging in to Zabbix!'.$cCRLF;
|
||||||
return('');
|
die;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the graph
|
// Get the graph
|
||||||
@ -419,27 +380,50 @@
|
|||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Check the array if it contains information that should not be logged
|
// Check the array for information we do not want to share in any logging
|
||||||
|
|
||||||
function maskKey(&$theValue, $theKey)
|
function maskOutputFields($info)
|
||||||
{
|
{
|
||||||
switch($theKey)
|
foreach($info as $aKey=>$aValue)
|
||||||
|
{
|
||||||
|
switch($aKey)
|
||||||
{
|
{
|
||||||
case 'zabbix_user':
|
case 'zabbix_user':
|
||||||
case 'zabbix_user_pwd':
|
case 'zabbix_user_pwd':
|
||||||
case 'zabbix_api_user':
|
case 'zabbix_api_user':
|
||||||
case 'zabbix_api_pwd':
|
case 'zabbix_api_pwd':
|
||||||
case 'zabbix_api_token':
|
$info[$aKey] = '<masked>';
|
||||||
case 'username':
|
|
||||||
case 'password':
|
|
||||||
$theValue = '<masked>';
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return($info);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the array if it contains information that should not be logged
|
||||||
|
|
||||||
function maskOutputContent($info)
|
function maskOutputContent($info)
|
||||||
{
|
{
|
||||||
array_walk_recursive($info,'maskKey');
|
global $config;
|
||||||
|
|
||||||
|
foreach($info as $infoKey=>$infoValue)
|
||||||
|
{
|
||||||
|
if (is_array($infoValue)) { $info[$infoKey] = maskOutputContent($infoValue); }
|
||||||
|
|
||||||
|
foreach($config as $aKey=>$aValue)
|
||||||
|
{
|
||||||
|
switch($aKey)
|
||||||
|
{
|
||||||
|
case 'zabbix_user':
|
||||||
|
case 'zabbix_user_pwd':
|
||||||
|
case 'zabbix_api_user':
|
||||||
|
case 'zabbix_api_pwd':
|
||||||
|
if ($aValue==$infoValue) { $info[$infoKey] = '<masked>'; };
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return($info);
|
return($info);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -519,19 +503,13 @@
|
|||||||
// Initialize ///////////////////////////////////////////////////////////////////////////////////////////
|
// Initialize ///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// --- CHECK CURL
|
|
||||||
if (!extension_loaded('curl')) {
|
|
||||||
_log('! mailGraph requires the php-curl module to function properly. Please install this module and retry.');
|
|
||||||
die;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- CONFIG DATA ---
|
// --- CONFIG DATA ---
|
||||||
|
|
||||||
// [CONFIGURE] Change only when you want to place your config file somewhere else ...
|
// [CONFIGURE] Change only when you want to place your config file somewhere else ...
|
||||||
$config = readConfig(getcwd().'/config/config.json');
|
$config = readConfig(getcwd().'/config/config.json');
|
||||||
|
|
||||||
_log('# Configuration taken from config.json'.$cCRLF.
|
_log('# Configuration taken from config.json'.$cCRLF.
|
||||||
json_encode(maskOutputContent($config),JSON_PRETTY_PRINT|JSON_NUMERIC_CHECK));
|
json_encode(maskOutputFields($config),JSON_PRETTY_PRINT|JSON_NUMERIC_CHECK));
|
||||||
|
|
||||||
// --- MAIL DATA ---
|
// --- MAIL DATA ---
|
||||||
|
|
||||||
@ -698,9 +676,6 @@
|
|||||||
$p_graph_match = 'any';
|
$p_graph_match = 'any';
|
||||||
if ((isset($config['graph_match'])) && ($config['graph_match']=='exact')) { $p_graph_match = 'exact'; }
|
if ((isset($config['graph_match'])) && ($config['graph_match']=='exact')) { $p_graph_match = 'exact'; }
|
||||||
|
|
||||||
$p_item_value_truncate = 0;
|
|
||||||
if (isset($config['item_value_truncate'])) { $p_item_value_truncate = intval($config['item_value_truncate']); }
|
|
||||||
|
|
||||||
// --- GLOBAL CONFIGURATION ---
|
// --- GLOBAL CONFIGURATION ---
|
||||||
|
|
||||||
// Script related settings
|
// Script related settings
|
||||||
@ -733,13 +708,6 @@
|
|||||||
_log('+ created IMAGES directory "'.$z_images_path.'"');
|
_log('+ created IMAGES directory "'.$z_images_path.'"');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Zabbix token - if a token is defined this will be the selected login method automatically (username/password neglected)
|
|
||||||
$z_api_token = '';
|
|
||||||
|
|
||||||
if (isset($config['zabbix_api_token'])) {
|
|
||||||
$z_api_token = $config['zabbix_api_token'];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Zabbix user (requires Super Admin access rights to access image generator script)
|
// Zabbix user (requires Super Admin access rights to access image generator script)
|
||||||
$z_user = $config['zabbix_user'];
|
$z_user = $config['zabbix_user'];
|
||||||
$z_pass = $config['zabbix_user_pwd'];
|
$z_pass = $config['zabbix_user_pwd'];
|
||||||
@ -785,8 +753,6 @@
|
|||||||
// --- LOGIN ---
|
// --- LOGIN ---
|
||||||
// -------------
|
// -------------
|
||||||
|
|
||||||
// We only use the USER.LOGIN method if not using the API bearer token method
|
|
||||||
if ($z_api_token=='') {
|
|
||||||
_log('# LOGIN to Zabbix');
|
_log('# LOGIN to Zabbix');
|
||||||
|
|
||||||
$request = array('jsonrpc'=>'2.0',
|
$request = array('jsonrpc'=>'2.0',
|
||||||
@ -810,13 +776,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
_log('> Token = '.$token);
|
_log('> Token = '.$token);
|
||||||
} else {
|
|
||||||
if ($cDebug) {
|
|
||||||
_log('# Using API bearer token authentication to access Zabbix');
|
|
||||||
}
|
|
||||||
|
|
||||||
$token = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------
|
// -----------------------
|
||||||
// --- LOG API VERSION ---
|
// --- LOG API VERSION ---
|
||||||
@ -847,15 +806,11 @@
|
|||||||
$request = array('jsonrpc'=>'2.0',
|
$request = array('jsonrpc'=>'2.0',
|
||||||
'method'=>'problem.get',
|
'method'=>'problem.get',
|
||||||
'params'=>array('output'=>'extend',
|
'params'=>array('output'=>'extend',
|
||||||
'recent'=>TRUE,
|
'recent'=>'true',
|
||||||
'limit'=>1),
|
'limit'=>1),
|
||||||
'auth'=>$token,
|
'auth'=>$token,
|
||||||
'id'=>nextRequestID());
|
'id'=>nextRequestID());
|
||||||
|
|
||||||
if ($z_api_token=='') {
|
|
||||||
$request['auth'] = $token;
|
|
||||||
}
|
|
||||||
|
|
||||||
$thisProblems = postJSON($z_url_api, $request);
|
$thisProblems = postJSON($z_url_api, $request);
|
||||||
_log('> Problem data (recent)'.$cCRLF.json_encode($thisProblems,JSON_PRETTY_PRINT|JSON_NUMERIC_CHECK));
|
_log('> Problem data (recent)'.$cCRLF.json_encode($thisProblems,JSON_PRETTY_PRINT|JSON_NUMERIC_CHECK));
|
||||||
|
|
||||||
@ -866,7 +821,7 @@
|
|||||||
$request = array('jsonrpc'=>'2.0',
|
$request = array('jsonrpc'=>'2.0',
|
||||||
'method'=>'problem.get',
|
'method'=>'problem.get',
|
||||||
'params'=>array('output'=>'extend',
|
'params'=>array('output'=>'extend',
|
||||||
'recent'=>FALSE,
|
'recent'=>'false',
|
||||||
'limit'=>1),
|
'limit'=>1),
|
||||||
'auth'=>$token,
|
'auth'=>$token,
|
||||||
'id'=>nextRequestID());
|
'id'=>nextRequestID());
|
||||||
@ -891,7 +846,6 @@
|
|||||||
|
|
||||||
_log('# Retreiving EVENT information');
|
_log('# Retreiving EVENT information');
|
||||||
|
|
||||||
if ($apiVersionMajor<"7") {
|
|
||||||
$request = array('jsonrpc'=>'2.0',
|
$request = array('jsonrpc'=>'2.0',
|
||||||
'method'=>'event.get',
|
'method'=>'event.get',
|
||||||
'params'=>array('eventids'=>$p_eventId,
|
'params'=>array('eventids'=>$p_eventId,
|
||||||
@ -901,17 +855,6 @@
|
|||||||
'select_acknowledges'=>'extend'),
|
'select_acknowledges'=>'extend'),
|
||||||
'auth'=>$token,
|
'auth'=>$token,
|
||||||
'id'=>nextRequestID());
|
'id'=>nextRequestID());
|
||||||
} else {
|
|
||||||
$request = array('jsonrpc'=>'2.0',
|
|
||||||
'method'=>'event.get',
|
|
||||||
'params'=>array('eventids'=>$p_eventId,
|
|
||||||
'output'=>'extend',
|
|
||||||
'selectRelatedObject'=>'extend',
|
|
||||||
'selectSuppressionData'=>'extend',
|
|
||||||
'selectAcknowledges'=>'extend'),
|
|
||||||
'auth'=>$token,
|
|
||||||
'id'=>nextRequestID());
|
|
||||||
}
|
|
||||||
|
|
||||||
$thisEvent = postJSON($z_url_api,$request);
|
$thisEvent = postJSON($z_url_api,$request);
|
||||||
_log('> Event data'.$cCRLF.json_encode($thisEvent,JSON_PRETTY_PRINT|JSON_NUMERIC_CHECK));
|
_log('> Event data'.$cCRLF.json_encode($thisEvent,JSON_PRETTY_PRINT|JSON_NUMERIC_CHECK));
|
||||||
@ -939,7 +882,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// --- Collect and attach acknowledge messages for this event
|
// --- Collect and attach acknowledge messages for this event
|
||||||
if (count($thisEvent['result'][0]['acknowledges'])>0) {
|
if (sizeof($thisEvent['result'][0]['acknowledges']>0)) {
|
||||||
foreach($thisEvent['result'][0]['acknowledges'] as $aCount=>$anAck) {
|
foreach($thisEvent['result'][0]['acknowledges'] as $aCount=>$anAck) {
|
||||||
$mailData['ACKNOWLEDGES'][$aCount] = $anAck;
|
$mailData['ACKNOWLEDGES'][$aCount] = $anAck;
|
||||||
$mailData['ACKNOWLEDGES'][$aCount]['_clock'] = zabbixTStoString($anAck['clock']);
|
$mailData['ACKNOWLEDGES'][$aCount]['_clock'] = zabbixTStoString($anAck['clock']);
|
||||||
@ -1056,10 +999,6 @@
|
|||||||
_log('+ Trigger screen header = '.$triggerScreenPeriodHeader);
|
_log('+ Trigger screen header = '.$triggerScreenPeriodHeader);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'mailGraph.valueTruncate':
|
|
||||||
$p_item_value_truncate = intval($aTag['value']);
|
|
||||||
_log('+ Data value truncing = '.$p_item_value_truncate);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1104,11 +1043,9 @@
|
|||||||
if (substr($mailData['ITEM_LASTVALUE'],0,5)=='<?xml') { $mailData['ITEM_LASTVALUE'] = '[record]'; }
|
if (substr($mailData['ITEM_LASTVALUE'],0,5)=='<?xml') { $mailData['ITEM_LASTVALUE'] = '[record]'; }
|
||||||
if (substr($mailData['ITEM_PREVIOUSVALUE'],0,5)=='<?xml') { $mailData['ITEM_PREVIOUSTVALUE'] = '[record]'; }
|
if (substr($mailData['ITEM_PREVIOUSVALUE'],0,5)=='<?xml') { $mailData['ITEM_PREVIOUSTVALUE'] = '[record]'; }
|
||||||
|
|
||||||
// Handling long data elements
|
// Catch long elements
|
||||||
if ($p_item_value_truncate>0) {
|
if (strlen($mailData['ITEM_LASTVALUE'])>50) { $mailData['ITEM_LASTVALUE'] = substr($mailData['ITEM_LASTVALUE'],0,50).' ...'; }
|
||||||
if (strlen($mailData['ITEM_LASTVALUE'])>$p_item_value_truncate) { $mailData['ITEM_LASTVALUE'] = substr($mailData['ITEM_LASTVALUE'],0,$p_item_value_truncate).' ...'; }
|
if (strlen($mailData['ITEM_PREVIOUSVALUE'])>50) { $mailData['ITEM_PREVIOUSVALUE'] = substr($mailData['ITEM_PREVIOUSVALUE'],0,50).' ...'; }
|
||||||
if (strlen($mailData['ITEM_PREVIOUSVALUE'])>$p_item_value_truncate) { $mailData['ITEM_PREVIOUSVALUE'] = substr($mailData['ITEM_PREVIOUSVALUE'],0,$p_item_value_truncate).' ...'; }
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------------------
|
// ---------------------
|
||||||
// --- GET HOST INFO ---
|
// --- GET HOST INFO ---
|
||||||
@ -1338,7 +1275,6 @@
|
|||||||
|
|
||||||
$result = array();
|
$result = array();
|
||||||
|
|
||||||
if (isset($screenGrahps['result'][0]['screenitems'])) {
|
|
||||||
foreach($screenGraphs['result'][0]['screenitems'] as $anItem)
|
foreach($screenGraphs['result'][0]['screenitems'] as $anItem)
|
||||||
{
|
{
|
||||||
switch($anItem['resourcetype'])
|
switch($anItem['resourcetype'])
|
||||||
@ -1360,9 +1296,6 @@
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
_log('> No screen items associated to this screen?');
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- Sort the result according to SCREEN x,y position
|
// --- Sort the result according to SCREEN x,y position
|
||||||
|
|
||||||
@ -1588,12 +1521,6 @@
|
|||||||
$mailData['EVENT_DURATION'] = $p_duration;
|
$mailData['EVENT_DURATION'] = $p_duration;
|
||||||
$mailData['HOST_PROBLEMS_URL'] = $z_server.'zabbix.php?show=1&name=&inventory%5B0%5D%5Bfield%5D=type&inventory%5B0%5D%5Bvalue%5D=&evaltype=0&tags%5B0%5D%5Btag%5D=&tags%5B0%5D%5Boperator%5D=0&tags%5B0%5D%5Bvalue%5D=&show_tags=3&tag_name_format=0&tag_priority=&show_opdata=0&show_timeline=1&filter_name=&filter_show_counter=0&filter_custom_time=0&sort=clock&sortorder=DESC&age_state=0&show_suppressed=0&unacknowledged=0&compact_view=0&details=0&highlight_row=0&action=problem.view&hostids%5B%5D='.$mailData['HOST_ID'];
|
$mailData['HOST_PROBLEMS_URL'] = $z_server.'zabbix.php?show=1&name=&inventory%5B0%5D%5Bfield%5D=type&inventory%5B0%5D%5Bvalue%5D=&evaltype=0&tags%5B0%5D%5Btag%5D=&tags%5B0%5D%5Boperator%5D=0&tags%5B0%5D%5Bvalue%5D=&show_tags=3&tag_name_format=0&tag_priority=&show_opdata=0&show_timeline=1&filter_name=&filter_show_counter=0&filter_custom_time=0&sort=clock&sortorder=DESC&age_state=0&show_suppressed=0&unacknowledged=0&compact_view=0&details=0&highlight_row=0&action=problem.view&hostids%5B%5D='.$mailData['HOST_ID'];
|
||||||
|
|
||||||
// Handling long data elements
|
|
||||||
if ($p_item_value_truncate>0) {
|
|
||||||
if (strlen($mailData['ITEM_LASTVALUE'])>$p_item_value_truncate) { $mailData['ITEM_LASTVALUE'] = substr($mailData['ITEM_LASTVALUE'],0,$p_item_value_truncate).' ...'; }
|
|
||||||
if (strlen($mailData['ITEM_PREVIOUSVALUE'])>$p_item_value_truncate) { $mailData['ITEM_PREVIOUSVALUE'] = substr($mailData['ITEM_PREVIOUSVALUE'],0,$p_item_value_truncate).' ...'; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Compose & Send Message ///////////////////////////////////////////////////////////////////////////////
|
// Compose & Send Message ///////////////////////////////////////////////////////////////////////////////
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -60,7 +60,7 @@
|
|||||||
<value>https://myzabbix.com/mailGraph.php</value>
|
<value>https://myzabbix.com/mailGraph.php</value>
|
||||||
</parameter>
|
</parameter>
|
||||||
</parameters>
|
</parameters>
|
||||||
<script>// mailGraph v2.20
|
<script>// mailGraph v2.16
|
||||||
|
|
||||||
// Function to test string
|
// Function to test string
|
||||||
function isJSON(str) {
|
function isJSON(str) {
|
||||||
|
@ -101,7 +101,7 @@
|
|||||||
({{ HOST_ERROR }})
|
({{ HOST_ERROR }})
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<br/>
|
<br/>
|
||||||
{% if EVENT_OPDATA|length > 0 %}
|
{% if EVENT_OPDATE|length > 0 %}
|
||||||
Operational data: <b>{{ EVENT_OPDATA }}</b><br/>
|
Operational data: <b>{{ EVENT_OPDATA }}</b><br/>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
Status: <b>{{ EVENT_STATUS }}</b><br/>
|
Status: <b>{{ EVENT_STATUS }}</b><br/>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user