mirror of
				https://github.com/moudsen/mailGraph
				synced 2025-10-29 00:27:38 +01:00 
			
		
		
		
	Compare commits
	
		
			9 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 36fd2b1d23 | ||
|   | 2a39f94718 | ||
|   | 3d6ec8e735 | ||
|   | bfd5a1670c | ||
|   | ac1a6c49a7 | ||
|   | 6e06c5b0cc | ||
|   | cdccef3d4d | ||
|   | b874e38c30 | ||
|   | 1de203d79f | 
							
								
								
									
										19
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								README.md
									
									
									
									
									
								
							| @@ -23,10 +23,19 @@ Please refer to the Wiki how to get mailGraph installed and configured on your s | |||||||
| ## Reference websites ## | ## 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 | [Extensive GERMAN installation from scratch](https://znil.net/index.php?title=Zabbix_mailGraph_installieren_-_Trigger_Alerts_Emails_mit_Grafiken) - nice work from Bernard Linz | ||||||
|  |  | ||||||
| ## Announcement - Zabbix 5.x maintenance for mailGraph end-of-life - mailGraph 3.x development in progress ## | ## Announcements ## | ||||||
| _(2024/01/26)_ | _(2025/02/04)_ | ||||||
|  |  | ||||||
| First mailGraph v3 release is underway, now supporting Zabbix 7 (in particular the new API bearer token authentication method). | 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)_ | ||||||
|  |  | ||||||
| @@ -34,8 +43,12 @@ As per November 2023 the maintenance on mailGraph v2.x for Zabbix 5.x will stop | |||||||
|  |  | ||||||
| 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) | ||||||
|   | |||||||
| @@ -23,6 +23,7 @@ | |||||||
|     "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, | ||||||
|   | |||||||
							
								
								
									
										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 | ||||||
|  | } | ||||||
| @@ -23,6 +23,7 @@ | |||||||
|     "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 | ||||||
|   | |||||||
							
								
								
									
										
											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) { | ||||||
|   | |||||||
| @@ -45,6 +45,7 @@ | |||||||
|     // 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 |     // 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 | ||||||
|     // ------------------------------------------------------------------------------------------------------ |     // ------------------------------------------------------------------------------------------------------ | ||||||
|     // |     // | ||||||
|     // (C) M.J.Oudsen, mark.oudsen@puzzl.nl |     // (C) M.J.Oudsen, mark.oudsen@puzzl.nl | ||||||
| @@ -109,7 +110,7 @@ | |||||||
|     ///////////////////////////////////////////////////////////////////////////////////////////////////////// |     ///////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|     // CONSTANTS |     // CONSTANTS | ||||||
|     $cVersion = 'v2.20'; |     $cVersion = 'v2.21'; | ||||||
|     $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; | ||||||
| @@ -721,6 +722,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 | ||||||
| @@ -1076,6 +1080,10 @@ | |||||||
|                     _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; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1120,9 +1128,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 --- | ||||||
| @@ -1352,26 +1362,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 | ||||||
| @@ -1598,6 +1612,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 /////////////////////////////////////////////////////////////////////////////// | ||||||
|     ///////////////////////////////////////////////////////////////////////////////////////////////////////// |     ///////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|   | |||||||
| @@ -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