mirror of
				https://github.com/moudsen/mailGraph
				synced 2025-10-29 00:27:38 +01:00 
			
		
		
		
	Compare commits
	
		
			17 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | e40342cd94 | ||
|   | 36fd2b1d23 | ||
|   | 2a39f94718 | ||
|   | 3d6ec8e735 | ||
|   | bfd5a1670c | ||
|   | ac1a6c49a7 | ||
|   | 6e06c5b0cc | ||
|   | cdccef3d4d | ||
|   | b874e38c30 | ||
|   | 1de203d79f | ||
|   | a8c8e13a98 | ||
|   | fc13414ff2 | ||
|   | 0cbd766208 | ||
|   | 2e869f1999 | ||
|   | 2f11d76c76 | ||
|   | 88862f69eb | ||
|   | b31f686e24 | 
							
								
								
									
										28
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								README.md
									
									
									
									
									
								
							| @@ -20,20 +20,42 @@ 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. | ||||||
|  |  | ||||||
| ## Announcement - Zabbix 5.x maintenance for mailGraph end-of-life - mailGraph 3.x development in progress ## | ## Reference websites ## | ||||||
|  | [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) | ||||||
|  | - [WMP](https://github.com/WMP) | ||||||
|  | - [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. | ||||||
|   | |||||||
| @@ -16,13 +16,14 @@ | |||||||
|     "subject": "{{ HOST_NAME|raw }}:  ({{ EVENT_SEVERITY }}) {{ EVENT_NAME|raw }}", |     "subject": "{{ HOST_NAME|raw }}:  ({{ EVENT_SEVERITY }}) {{ EVENT_NAME|raw }}", | ||||||
|     "smtp_server": "localhost", |     "smtp_server": "localhost", | ||||||
|     "smtp_port": 25, |     "smtp_port": 25, | ||||||
|     "smtp_transport": "none", |     "smtp_security": "none", | ||||||
|  |     "smtp_strict": "yes", | ||||||
|     "smtp_from_address": "mailgraph@mydomain.com", |     "smtp_from_address": "mailgraph@mydomain.com", | ||||||
|     "smtp_from_name": "mailGraph", |     "smtp_from_name": "mailGraph", | ||||||
|     "smtp_reply_address": "feedback@mydomain.com", |     "smtp_reply_address": "feedback@mydomain.com", | ||||||
|     "smtp_reply_name": "mailGraph response mailbox", |     "smtp_reply_name": "mailGraph response mailbox", | ||||||
|     "smtp_strict": "yes", |  | ||||||
|     "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, | ||||||
|   | |||||||
							
								
								
									
										31
									
								
								config/config.json.template.api_token
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								config/config.json.template.api_token
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | { | ||||||
|  |     "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 | ||||||
|  | } | ||||||
| @@ -16,13 +16,14 @@ | |||||||
|     "subject": "{{ HOST_NAME|raw }}:  ({{ EVENT_SEVERITY }}) {{ EVENT_NAME|raw }}", |     "subject": "{{ HOST_NAME|raw }}:  ({{ EVENT_SEVERITY }}) {{ EVENT_NAME|raw }}", | ||||||
|     "smtp_server": "localhost", |     "smtp_server": "localhost", | ||||||
|     "smtp_port": 25, |     "smtp_port": 25, | ||||||
|     "smtp_transport": "none", |     "smtp_security": "none", | ||||||
|  |     "smtp_strict": "yes", | ||||||
|     "smtp_from_address": "mailgraph@mydomain.com", |     "smtp_from_address": "mailgraph@mydomain.com", | ||||||
|     "smtp_from_name": "mailGraph", |     "smtp_from_name": "mailGraph", | ||||||
|     "smtp_reply_address": "feedback@mydomain.com", |     "smtp_reply_address": "feedback@mydomain.com", | ||||||
|     "smtp_reply_name": "mailGraph response mailbox", |     "smtp_reply_name": "mailGraph response mailbox", | ||||||
|     "smtp_strict": "yes", |  | ||||||
|     "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 | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								images/mailGraph-small.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								images/mailGraph-small.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 55 KiB | 
| @@ -1,4 +1,4 @@ | |||||||
| // mailGraph v2.16 | // mailGraph v2.20 | ||||||
|  |  | ||||||
| // Function to test string | // Function to test string | ||||||
| function isJSON(str) { | function isJSON(str) { | ||||||
|   | |||||||
							
								
								
									
										338
									
								
								mailGraph.php
									
									
									
									
									
								
							
							
						
						
									
										338
									
								
								mailGraph.php
									
									
									
									
									
								
							| @@ -35,10 +35,18 @@ | |||||||
|     //                                 Fixed #45 handling of international characters - Dima-online |     //                                 Fixed #45 handling of international characters - Dima-online | ||||||
|     //                                 Tested with latest PHPMailer (6.9.3) and TWIG (3.11.3), PHP 7.4 |     //                                 Tested with latest PHPMailer (6.9.3) and TWIG (3.11.3), PHP 7.4 | ||||||
|     //                                 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 | ||||||
|  |     //      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+ | ||||||
|     // ------------------------------------------------------------------------------------------------------ |     // ------------------------------------------------------------------------------------------------------ | ||||||
|     // v2.17                           Testing on Zabbix 7.0 LTS (in progress), Zabbix 7.2 (in progress) |     // 2.20                            Tested in Zabbix 7.0.7 LTS and Zabbix 7.2.2 | ||||||
|  |     // 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 | ||||||
| @@ -52,16 +60,27 @@ | |||||||
|     // |     // | ||||||
|     // Notes |     // Notes | ||||||
|     // ----- |     // ----- | ||||||
|     // 1) mailGraph is following the environmental requirements from Zabbix, supporting PHP 7.4-8.3 ad per |     // 1) mailGraph is following the environmental requirements from Zabbix, supporting PHP 7 and 8 as 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 (seemless upgrade when using composer update) |     // 2) TWIG 3.18.0 is available on PHP 8 only | ||||||
|  |     //    - Seemless in-place upgrade when using composer update after upgrading  PHP 7.x to PHP 8.x | ||||||
|     // |     // | ||||||
|     // 3) Testing of composer libraries updates is limited to every 6 to 12 months |     // 3) Full testing of composer libraries updates/versions 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 | ||||||
|     // |     // | ||||||
|     ///////////////////////////////////////////////////////////////////////////////////////////////////////// |     ///////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|     ///////////////////////////////////////////////////////////////////////////////////////////////////////// |     ///////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
| @@ -73,7 +92,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 facility (SCREEN was abandoned in Zabbix 5.4 |     // - Add DASHBOARD processing facility (SCREEN was abandoned after Zabbix 5.4) [idea only] | ||||||
|     // - Extract Graph API functionality to seperate code unit/object |     // - Extract Graph API functionality to seperate code unit/object | ||||||
|     // |     // | ||||||
|     ///////////////////////////////////////////////////////////////////////////////////////////////////////// |     ///////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
| @@ -92,7 +111,7 @@ | |||||||
|     ///////////////////////////////////////////////////////////////////////////////////////////////////////// |     ///////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|     // CONSTANTS |     // CONSTANTS | ||||||
|     $cVersion = 'v2.17'; |     $cVersion = 'v2.22'; | ||||||
|     $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; | ||||||
| @@ -122,7 +141,7 @@ | |||||||
|  |  | ||||||
|     ///////////////////////////////////////////////////////////////////////////////////////////////////////// |     ///////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|     ///////////////////////////////////////////////////////////////////////////////////////////////////////// |     ///////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|     // Fetch the HTML source of the given URL |     // Fetch the response 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 | ||||||
| @@ -133,6 +152,7 @@ | |||||||
|         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); | ||||||
| @@ -141,7 +161,6 @@ | |||||||
|         $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); } | ||||||
| @@ -151,18 +170,41 @@ | |||||||
|         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)); | ||||||
| @@ -199,6 +241,7 @@ | |||||||
|         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; | ||||||
| @@ -235,9 +278,6 @@ | |||||||
|                                        "&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"; | ||||||
| @@ -258,9 +298,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); | ||||||
|  |  | ||||||
| @@ -272,8 +312,9 @@ | |||||||
|  |  | ||||||
|         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; | ||||||
|             die; |             return(''); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // Get the graph |         // Get the graph | ||||||
| @@ -378,50 +419,27 @@ | |||||||
|  |  | ||||||
|     ///////////////////////////////////////////////////////////////////////////////////////////////////////// |     ///////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|     ///////////////////////////////////////////////////////////////////////////////////////////////////////// |     ///////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|     // Check the array for information we do not want to share in any logging |     // Check the array if it contains information that should not be logged | ||||||
|  |  | ||||||
|     function maskOutputFields($info) |     function maskKey(&$theValue, $theKey) | ||||||
|     { |     { | ||||||
|         foreach($info as $aKey=>$aValue) |         switch($theKey) | ||||||
|         { |         { | ||||||
|             switch($aKey) |             case 'zabbix_user': | ||||||
|             { |             case 'zabbix_user_pwd': | ||||||
|                 case 'zabbix_user': |             case 'zabbix_api_user': | ||||||
|                 case 'zabbix_user_pwd': |             case 'zabbix_api_pwd': | ||||||
|                 case 'zabbix_api_user': |             case 'zabbix_api_token': | ||||||
|                 case 'zabbix_api_pwd': |             case 'username': | ||||||
|                     $info[$aKey] = '<masked>'; |             case 'password': | ||||||
|                     break; |                 $theValue = '<masked>'; | ||||||
|  |                 break; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return($info); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // Check the array if it contains information that should not be logged |  | ||||||
|  |  | ||||||
|     function maskOutputContent($info) |     function maskOutputContent($info) | ||||||
|     { |     { | ||||||
|         global $config; |         array_walk_recursive($info,'maskKey'); | ||||||
|  |  | ||||||
|         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); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -501,13 +519,19 @@ | |||||||
|     // 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(maskOutputFields($config),JSON_PRETTY_PRINT|JSON_NUMERIC_CHECK)); |          json_encode(maskOutputContent($config),JSON_PRETTY_PRINT|JSON_NUMERIC_CHECK)); | ||||||
|  |  | ||||||
|     // --- MAIL DATA --- |     // --- MAIL DATA --- | ||||||
|  |  | ||||||
| @@ -640,6 +664,10 @@ | |||||||
|     $p_smtp_strict = 'yes'; |     $p_smtp_strict = 'yes'; | ||||||
|     if ((isset($config['smtp_strict'])) && ($config['smtp_strict']=='no')) { $p_smtp_strict = 'no'; } |     if ((isset($config['smtp_strict'])) && ($config['smtp_strict']=='no')) { $p_smtp_strict = 'no'; } | ||||||
|  |  | ||||||
|  |     $p_smtp_security = 'none'; | ||||||
|  |     if ((isset($config['smtp_security'])) && ($config['smtp_security']=='smtps')) { $p_smtp_security = 'smtps'; } | ||||||
|  |     if ((isset($config['smtp_security'])) && ($config['smtp_security']=='starttls')) { $p_smtp_security = 'starttls'; } | ||||||
|  |  | ||||||
|     $p_smtp_username = ''; |     $p_smtp_username = ''; | ||||||
|     if (isset($config['smtp_username'])) { $p_smtp_username = $config['smtp_username']; } |     if (isset($config['smtp_username'])) { $p_smtp_username = $config['smtp_username']; } | ||||||
|  |  | ||||||
| @@ -670,6 +698,9 @@ | |||||||
|     $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 | ||||||
| @@ -702,6 +733,13 @@ | |||||||
|         _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']; | ||||||
| @@ -747,30 +785,39 @@ | |||||||
|     // --- LOGIN --- |     // --- LOGIN --- | ||||||
|     // ------------- |     // ------------- | ||||||
|  |  | ||||||
|     _log('# LOGIN to Zabbix'); |     // We only use the USER.LOGIN method if not using the API bearer token method | ||||||
|  |     if ($z_api_token=='') { | ||||||
|  |         _log('# LOGIN to Zabbix'); | ||||||
|  |  | ||||||
|     $request = array('jsonrpc'=>'2.0', |         $request = array('jsonrpc'=>'2.0', | ||||||
|                      'method'=>'user.login', |                          'method'=>'user.login', | ||||||
|                      'params'=>array('username'=>$z_api_user, |                          'params'=>array('username'=>$z_api_user, | ||||||
|                                      'password'=>$z_api_pass), |                                          'password'=>$z_api_pass), | ||||||
|                      'id'=>nextRequestID(), |                          'id'=>nextRequestID(), | ||||||
|                      'auth'=>null); |                          'auth'=>null); | ||||||
|  |  | ||||||
|     $result = postJSON($z_url_api,$request); |         $result = postJSON($z_url_api,$request); | ||||||
|  |  | ||||||
|     $token = ''; |         $token = ''; | ||||||
|     if (isset($result['result'])) { $token = $result['result']; } |         if (isset($result['result'])) { $token = $result['result']; } | ||||||
|  |  | ||||||
|     if ($token=='') |         if ($token=='') | ||||||
|     { |         { | ||||||
|         echo 'Error logging in to Zabbix? ('.$z_url_api.'): '.$cCRLF; |             echo 'Error logging in to Zabbix? ('.$z_url_api.'): '.$cCRLF; | ||||||
|         echo var_dump($request).$cCRLF; |             echo var_dump($request).$cCRLF; | ||||||
|         echo var_dump($result).$cCRLF; |             echo var_dump($result).$cCRLF; | ||||||
|         die; |             die; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         _log('> Token = '.$token); | ||||||
|  |     } else { | ||||||
|  |         if ($cDebug) { | ||||||
|  |             _log('# Using API bearer token authentication to access Zabbix'); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         $token = ''; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _log('> Token = '.$token); |  | ||||||
|  |  | ||||||
|     // ----------------------- |     // ----------------------- | ||||||
|     // --- LOG API VERSION --- |     // --- LOG API VERSION --- | ||||||
|     // ----------------------- |     // ----------------------- | ||||||
| @@ -785,6 +832,7 @@ | |||||||
|     $result = postJSON($z_url_api, $request); |     $result = postJSON($z_url_api, $request); | ||||||
|  |  | ||||||
|     $apiVersion = $result['result']; |     $apiVersion = $result['result']; | ||||||
|  |     $apiVersionMajor = substr($apiVersion,0,01); | ||||||
|  |  | ||||||
|     _log('> API version '.$apiVersion); |     _log('> API version '.$apiVersion); | ||||||
|  |  | ||||||
| @@ -799,11 +847,15 @@ | |||||||
|         $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)); | ||||||
|  |  | ||||||
| @@ -814,7 +866,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()); | ||||||
| @@ -839,15 +891,27 @@ | |||||||
|  |  | ||||||
|     _log('# Retreiving EVENT information'); |     _log('# Retreiving EVENT information'); | ||||||
|  |  | ||||||
|     $request = array('jsonrpc'=>'2.0', |     if ($apiVersionMajor<"7") { | ||||||
|                      'method'=>'event.get', |         $request = array('jsonrpc'=>'2.0', | ||||||
|                      'params'=>array('eventids'=>$p_eventId, |                          'method'=>'event.get', | ||||||
|                                      'output'=>'extend', |                          'params'=>array('eventids'=>$p_eventId, | ||||||
|                                      'selectRelatedObject'=>'extend', |                                          'output'=>'extend', | ||||||
|                                      'selectSuppressionData'=>'extend', |                                          'selectRelatedObject'=>'extend', | ||||||
|                                      'select_acknowledges'=>'extend'), |                                          'selectSuppressionData'=>'extend', | ||||||
|                      'auth'=>$token, |                                          'select_acknowledges'=>'extend'), | ||||||
|                      'id'=>nextRequestID()); |                          'auth'=>$token, | ||||||
|  |                          '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)); | ||||||
| @@ -875,7 +939,7 @@ | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     // --- Collect and attach acknowledge messages for this event |     // --- Collect and attach acknowledge messages for this event | ||||||
|     if (sizeof($thisEvent['result'][0]['acknowledges']>0)) { |     if (count($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']); | ||||||
| @@ -971,18 +1035,30 @@ | |||||||
|                 break; |                 break; | ||||||
|  |  | ||||||
|             case 'mailGraph.screen': |             case 'mailGraph.screen': | ||||||
|                 $triggerScreen = intval($aTag['value']); | 		if ($apiVersionMajor<="5") { | ||||||
|                 _log('+ Trigger screen = '.$triggerScreen); |                     $triggerScreen = intval($aTag['value']); | ||||||
|  |                     _log('+ Trigger screen = '.$triggerScreen); | ||||||
|  |                 } else { | ||||||
|  |                     _log('- Trigger screen value ignored'); | ||||||
|  |                 } | ||||||
|                 break; |                 break; | ||||||
|  |  | ||||||
|             case 'mailGraph.screenPeriod': |             case 'mailGraph.screenPeriod': | ||||||
|                 $triggerScreenPeriod = $aTag['value']; | 		if ($apiVersionMajor<="5") { | ||||||
|                 _log('+ Trigger screen period = '.$triggerScreenPeriod); |                     $triggerScreenPeriod = $aTag['value']; | ||||||
|  |                     _log('+ Trigger screen period = '.$triggerScreenPeriod); | ||||||
|  |                 } | ||||||
|                 break; |                 break; | ||||||
|  |  | ||||||
|             case 'mailGraph.screenPeriodHeader': |             case 'mailGraph.screenPeriodHeader': | ||||||
|                 $triggerScreenPeriodHeader = $aTag['value']; |                 if ($apiVersionMajor<="5") { | ||||||
|                 _log('+ Trigger screen header = '.$triggerScreenPeriodHeader); |                     $triggerScreenPeriodHeader = $aTag['value']; | ||||||
|  |                     _log('+ Trigger screen header = '.$triggerScreenPeriodHeader); | ||||||
|  |                 } | ||||||
|  |                 break; | ||||||
|  |             case 'mailGraph.valueTruncate': | ||||||
|  |                 $p_item_value_truncate = intval($aTag['value']); | ||||||
|  |                 _log('+ Data value truncing = '.$p_item_value_truncate); | ||||||
|                 break; |                 break; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -1028,9 +1104,11 @@ | |||||||
|     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]'; } | ||||||
|  |  | ||||||
|     // Catch long elements |     // Handling long data elements | ||||||
|     if (strlen($mailData['ITEM_LASTVALUE'])>50) { $mailData['ITEM_LASTVALUE'] = substr($mailData['ITEM_LASTVALUE'],0,50).' ...'; } |     if ($p_item_value_truncate>0) { | ||||||
|     if (strlen($mailData['ITEM_PREVIOUSVALUE'])>50) { $mailData['ITEM_PREVIOUSVALUE'] = substr($mailData['ITEM_PREVIOUSVALUE'],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'])>$p_item_value_truncate) { $mailData['ITEM_PREVIOUSVALUE'] = substr($mailData['ITEM_PREVIOUSVALUE'],0,$p_item_value_truncate).' ...'; } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     // --------------------- |     // --------------------- | ||||||
|     // --- GET HOST INFO --- |     // --- GET HOST INFO --- | ||||||
| @@ -1260,26 +1338,30 @@ | |||||||
|  |  | ||||||
|         $result = array(); |         $result = array(); | ||||||
|  |  | ||||||
|         foreach($screenGraphs['result'][0]['screenitems'] as $anItem) |         if (isset($screenGrahps['result'][0]['screenitems'])) { | ||||||
|         { |             foreach($screenGraphs['result'][0]['screenitems'] as $anItem) | ||||||
|             switch($anItem['resourcetype']) |  | ||||||
|             { |             { | ||||||
|                 case 0: // Graph |                 switch($anItem['resourcetype']) | ||||||
|                     $request = array('jsonrpc'=>'2.0', |                 { | ||||||
|                                      'method'=>'graph.get', |                     case 0: // Graph | ||||||
|                                      'params'=>array('graphids'=>$anItem['resourceid'], |                         $request = array('jsonrpc'=>'2.0', | ||||||
|                                                      'expandName'=>1, |                                          'method'=>'graph.get', | ||||||
|                                                      'output'=>'extend'), |                                          'params'=>array('graphids'=>$anItem['resourceid'], | ||||||
|                                      'auth'=>$token, |                                                          'expandName'=>1, | ||||||
|                                      'id'=>nextRequestID()); |                                                          'output'=>'extend'), | ||||||
|  |                                          'auth'=>$token, | ||||||
|  |                                          'id'=>nextRequestID()); | ||||||
|  |  | ||||||
|                     $screenGraph = postJSON($z_url_api,$request); |                         $screenGraph = postJSON($z_url_api,$request); | ||||||
|                     _log('+ Graph data for screen item #'.$anItem['screenitemid'].$cCRLF. |                         _log('+ Graph data for screen item #'.$anItem['screenitemid'].$cCRLF. | ||||||
|                          json_encode($screenGraph,JSON_PRETTY_PRINT|JSON_NUMERIC_CHECK)); |                              json_encode($screenGraph,JSON_PRETTY_PRINT|JSON_NUMERIC_CHECK)); | ||||||
|  |  | ||||||
|                     $result[] = array('screen'=>$anItem,'name'=>$screenGraphs['result'][0]['name'],'graph'=>$screenGraph['result'][0]); |                         $result[] = array('screen'=>$anItem,'name'=>$screenGraphs['result'][0]['name'],'graph'=>$screenGraph['result'][0]); | ||||||
|                     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 | ||||||
| @@ -1506,6 +1588,12 @@ | |||||||
|     $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 /////////////////////////////////////////////////////////////////////////////// | ||||||
|     ///////////////////////////////////////////////////////////////////////////////////////////////////////// |     ///////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
| @@ -1523,11 +1611,34 @@ | |||||||
|         $mail->CharSet = "UTF-8"; |         $mail->CharSet = "UTF-8"; | ||||||
|         $mail->Encoding = "base64"; |         $mail->Encoding = "base64"; | ||||||
|  |  | ||||||
| 	// Inialize SMTP parameters | 	// --- Inialize SMTP parameters | ||||||
|         $mail->isSMTP(); |         $mail->isSMTP(); | ||||||
|         $mail->Host = $p_smtp_server; |         $mail->Host = $p_smtp_server; | ||||||
|         $mail->Port = $p_smtp_port; |         $mail->Port = $p_smtp_port; | ||||||
|  |  | ||||||
|  |         // --- Initialize transport security | ||||||
|  |         switch($p_smtp_security) { | ||||||
|  |             case 'smtps': | ||||||
|  |                 _log('> Using SMTPS transport encryption method'); | ||||||
|  |                 $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; | ||||||
|  |                 break; | ||||||
|  |             case 'starttls': | ||||||
|  |                 _log('> Using STARTTLS transport encryption method'); | ||||||
|  |                 $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; | ||||||
|  |                 break; | ||||||
|  |             default: | ||||||
|  |                 _log('> Plain transport (no encryption)'); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // --- Disable strict certificate checking? | ||||||
|  |         if ($p_smtp_strict=='no') | ||||||
|  |         { | ||||||
|  |             _log('> No strict TLS checking'); | ||||||
|  |             $mail->SMTPOptions = [ | ||||||
|  |                 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ] | ||||||
|  |             ]; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         // --- Authentication required? |         // --- Authentication required? | ||||||
|         if ($p_smtp_username!="") |         if ($p_smtp_username!="") | ||||||
|         { |         { | ||||||
| @@ -1536,14 +1647,6 @@ | |||||||
|             $mail->Password = $p_smtp_password; |             $mail->Password = $p_smtp_password; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // --- Disable strict certificate checking? |  | ||||||
|         if ($p_smtp_strict=='no') |  | ||||||
|         { |  | ||||||
|             $mail->SMTPOptions = [ |  | ||||||
|                 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ] |  | ||||||
|             ]; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // --- Define from |         // --- Define from | ||||||
|         $mail->Sender = $p_smtp_from_address; |         $mail->Sender = $p_smtp_from_address; | ||||||
|         $mail->SetFrom($p_smtp_from_address, $p_smtp_from_name, FALSE); |         $mail->SetFrom($p_smtp_from_address, $p_smtp_from_name, FALSE); | ||||||
| @@ -1633,6 +1736,7 @@ | |||||||
|     { |     { | ||||||
|        echo "! Failed to send message".$cCRLF; |        echo "! Failed to send message".$cCRLF; | ||||||
|        echo "! Error message: ".$e->getMessage().$cCRLF; |        echo "! Error message: ".$e->getMessage().$cCRLF; | ||||||
|  |        echo "! Check your mail server and/or transport settings!".$cCRLF; | ||||||
|        _log("! Failed: ".$e->getMessage()); |        _log("! Failed: ".$e->getMessage()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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.16 |             <script>// mailGraph v2.20 | ||||||
|  |  | ||||||
| // 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_OPDATE|length > 0 %} | {% if EVENT_OPDATA|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/> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user