mirror of
https://github.com/moudsen/mailGraph
synced 2025-10-28 16:17:39 +01:00
Compare commits
107 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3ef16ae597 | ||
|
|
a597ce6ab3 | ||
|
|
a04050c3bc | ||
|
|
b81414e06d | ||
|
|
accb8f40d6 | ||
|
|
bf5bbcb778 | ||
|
|
702725e5f7 | ||
|
|
0725e01bc0 | ||
|
|
a8858784a5 | ||
|
|
39ada5d6ff | ||
|
|
32b8582757 | ||
|
|
9c42ee4b89 | ||
|
|
fa7fba040a | ||
|
|
3a4a7ab23e | ||
|
|
7075b40ad1 | ||
|
|
8bc476ed63 | ||
|
|
e80a2a56a3 | ||
|
|
4b28d3f066 | ||
|
|
93535d4006 | ||
|
|
b9622da72f | ||
|
|
56fb68ae9c | ||
|
|
fa51c3e59e | ||
|
|
4ae62b3a1f | ||
|
|
0731b87d44 | ||
|
|
bdf4b05a6b | ||
|
|
df16444665 | ||
|
|
bccd134523 | ||
|
|
27c1d64511 | ||
|
|
8597658670 | ||
|
|
b7e2062486 | ||
|
|
2955ffc404 | ||
|
|
2976a4af9c | ||
|
|
2882367308 | ||
|
|
8b4885038a | ||
|
|
f541719fbe | ||
|
|
9edab245d8 | ||
|
|
341bd561ab | ||
|
|
e2f657f3dd | ||
|
|
82a8fe4121 | ||
|
|
bee76b63c0 | ||
|
|
ba0d474bdb | ||
|
|
a5a0f0ace1 | ||
|
|
8655d4ca2c | ||
|
|
76321be3f8 | ||
|
|
9d4f00ce87 | ||
|
|
1278d43acb | ||
|
|
18c22abf17 | ||
|
|
0a623f3137 | ||
|
|
634134b423 | ||
|
|
58668311ee | ||
|
|
9052b71562 | ||
|
|
74b6ee15c7 | ||
|
|
398637e582 | ||
|
|
9e40060cdd | ||
|
|
e85400b0de | ||
|
|
e05fcbfba7 | ||
|
|
66b504a66c | ||
|
|
bc0c83b544 | ||
|
|
17cdbea2bd | ||
|
|
fb51354649 | ||
|
|
78061964c4 | ||
|
|
1c9786c549 | ||
|
|
37b1ea7ea2 | ||
|
|
cb96ecaf24 | ||
|
|
71df37e612 | ||
|
|
e861d0c7d0 | ||
|
|
73ce4adb9c | ||
|
|
e262f21dc8 | ||
|
|
7f6d5ccd03 | ||
|
|
162bf1b932 | ||
|
|
6ff6a2c55d | ||
|
|
7ee5324aeb | ||
|
|
88d8c018f5 | ||
|
|
b7935b0a47 | ||
|
|
d624fa694d | ||
|
|
7c4d8a7ff8 | ||
|
|
1a82a1ac85 | ||
|
|
5797538519 | ||
|
|
0c7d577975 | ||
|
|
497e7c3fe9 | ||
|
|
fd48cb604e | ||
|
|
f2075d161d | ||
|
|
2970f10be1 | ||
|
|
e3913d9813 | ||
|
|
c0e31d37be | ||
|
|
42bea0df98 | ||
|
|
cb8d2cb546 | ||
|
|
2808544170 | ||
|
|
995fdf0b68 | ||
|
|
db81193e17 | ||
|
|
1fb10ed089 | ||
|
|
7e1c5e5d98 | ||
|
|
4f4c41f991 | ||
|
|
15512cf35a | ||
|
|
2ba2946f30 | ||
|
|
ff0c686ae0 | ||
|
|
6289a1cbdb | ||
|
|
3ec9004db9 | ||
|
|
dcb523d1cb | ||
|
|
f4d7adca16 | ||
|
|
617df995b4 | ||
|
|
2d93ce0425 | ||
|
|
06eebd02e1 | ||
|
|
010bce74bc | ||
|
|
931ce2ca9b | ||
|
|
b2ebf778ac | ||
|
|
e3cd9815d2 |
49
CODE_OF_CONDUCT.md
Normal file
49
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,49 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate,
|
||||
threatening, offensive, or harmful.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at abuse@puzzl.nl. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see https://www.contributor-covenant.org/faq
|
||||
181
README.md
181
README.md
@@ -1,146 +1,95 @@
|
||||
# mailGraph
|
||||
Zabbix Media module and scripts for sending e-mail alerts with graphs.
|
||||
## Introduction ##
|
||||
Over the years I've been using Zabbix as both personal and business solution for monitoring. One of the missing features in Zabbix itself was the ability to have graphs generated and associated to monitoring messages as well as an easy way to jump back into Zabbix when searching for monitoring information for specific events, problems or to have a direct link to the associated Zabbix item or host.
|
||||
|
||||
# WORK IN PROGRESS
|
||||
Getting the code ready for further distribution.
|
||||
This initiated the development of mailGraph v1 in Zabbix 5.4 delivering an elementary solution for sending HTML enriched messages from Zabbix including graphs.
|
||||
To facilitate in a very flexible way to setup and format messages including the graphs, Twig made its introduction towards mailGraph v2, the current release branch of mailGraph.
|
||||
|
||||
# Installation pre-requisites
|
||||
The suggested installation path of this script is on the same host where Zabbix lives but outside the actual Zabbix directory, although it is possible to run the script entirely somewhere else (the code is webhook based, picking up information from Zabbix is via the front-end login and API).
|
||||
The below message is just an example of what MailGraph is capable of. The template engine in Twig allows for a fully customized message creation to your needs! It is also possible to add more Zabbix fields as any field is passed to Twig when accessible in Zabbix through the macro mechanism. Example: `{ITEM.ID}`.
|
||||
|
||||
# I'm assuming
|
||||
- you are familiar with "composer"
|
||||
- you know how to configure a webserver/virtual host
|
||||
- that you have CURL and PHP installed
|
||||
Note that all Zabbix host, item or screen related information is made available to Twig automatically.
|
||||
|
||||
# Prepare the installation
|
||||
- Pick a directory within a (virtual) host of your webserver
|
||||
- Create the directories "config", "images", "log", "templates" and "tmp" inside this directory
|
||||
- Copy .htaccess to the main directory _(if not using Apache make sure your webserver denies access to /config!)_
|
||||
- Copy mailGraph.php to the main directory
|
||||
- Install SwiftMailer: "composer require swiftmailer/swiftmailer"
|
||||
- Install TWIG: "composer require twig/twig"
|
||||
- Copy config/config.php to your /config directory
|
||||
- Copy config/config.json.template to your /config/ directory and rename to "config.json"
|
||||
- Copy templates/html.template and templates/plain.template to your templates directory
|
||||
- Copy mailGraph.xml to a location where you can upload the Media Type to Zabbix
|
||||
Example message:
|
||||
|
||||
# Configuration
|
||||
- Goto your /config directory
|
||||
- Two ways to configure the config.json file: 1) with config.php or 2) with your favorite text editor (note that you must have knowledge of JSON format to use this option)'
|
||||
- List the available configuration options with "php config.php config.json list"
|
||||
- Change any option with "php config.php config.json replace 'key_name' 'new_value'" (note the usage of the single quotes from the command-line!)
|
||||
[](images/Example-mail-message-v122.png)
|
||||
|
||||
**"script_baseurl"** should point to the URL of your directory (ie. "https://mydomain.com/mailgraph/"). Note the ending '/'!
|
||||
mailGraph is capable of adding several series of graphs into a single message delivering a unique experience when and how groups of graph images per the requested periods of time are added.
|
||||
Currently mailGraph supports hosts, (one or more related) items and screens (applicable to Zabbix 5.4 only).
|
||||
|
||||
**"zabbix_user"** must be a Zabbix SuperAdmin user you create to login to Zabbix (this is for grabbing the images via the regular Zabbix routines).
|
||||
More information can be found in the Wiki.
|
||||
|
||||
**"zabbix_user_api"** must also be a Zabbix SuperAdmin user your create to login to the Zabbix API (this is for grabbing the information of the event via the Zabbix API).
|
||||
## Installation ##
|
||||
Please refer to the Wiki how to get mailGraph installed and configured on your system.
|
||||
|
||||
**"mail_from"** must be a valid e-mail address which represents the 'from' address in the mails that are sent (ie. "zabbix.mailgraph.noreply@domain.com").
|
||||
## mailGraph v2.13 release ##
|
||||
_(2023/07/03)_
|
||||
|
||||
# Load the Media Type "MailGraph" into Zabbix
|
||||
- Login to your Zabbix instance
|
||||
- Goto "Administration" => "Media yypes"
|
||||
- Import the "mailGraph.xml" file
|
||||
- Edit the new media type
|
||||
- Configure some of the macros associated
|
||||
_This version has been verified with Zabbix 5.4 and 6.0 LTS and is expected to work with 6.4 and later (based on v2.10 testing)_
|
||||
|
||||
"baseURL" must contain your Zabbix URL (ie. "https://mydomain.com/zabbix/"). Note the ending '/'!
|
||||
Release notes
|
||||
- Fixed references into Zabbix
|
||||
- Trigger was missing "context" parameter
|
||||
- Item was missing "context" parameter
|
||||
- Problems reference to this host was not generated at all
|
||||
|
||||
You can set your custom "graphWidth" and "GraphHeight" to your convenience.
|
||||
## mailGraph v2.12 release ##
|
||||
_(2023/07/02)_
|
||||
|
||||
You can switch the graph legend on/off with "showLegend" (0=off,1=on).
|
||||
_This version has been verified with Zabbix 5.4 and 6.0 LTS and is expected to work with 6.4 and later (based on v2.10 testing)_
|
||||
|
||||
You can change the "subject" of the e-mail that is sent (note that the markup can be a combination of Zabbix MACRO or TWIG notation!).
|
||||
Release notes
|
||||
- Replaced Swiftmailer with PHPMailer
|
||||
- Configuration option "smtp_transport" removed (using PHPMailer AutoTLS)
|
||||
- Code cleanup (markup and obsolete related parts)
|
||||
- Addressed any PHP message (deprecation or error) - mailGraph debug output is now "clean" in PHP 7.4.x and PHP 8.2.x
|
||||
- Increased maximum number of graphs from 4 to 8
|
||||
|
||||
"URL" is the url to the mailGraph script (ie. "https://mydomain.com/mailGraph.php").
|
||||
## mailGraph v2.11 release ##
|
||||
_(2023/07/01)_
|
||||
|
||||
# Actions configuration
|
||||
At this point the Media type is ready for configuration under "actions" as per the regular way of Zabbix alert processing. Please refer to the manual how to configure.
|
||||
_This version has been verified with Zabbix 5.4 and 6.0 LTS and is expected to work with 6.4 and later (based on v2.10 testing)_
|
||||
|
||||
# Template adjustments
|
||||
I've picked TWIG as the template processor, where the following macros are available for your convenience. Feel free to adjust the html.template and plain.template files as you see fit for your situation!
|
||||
Release notes
|
||||
- Added pre- and postchecking of variables to the Zabbix javascript - this will prevent the 'invalid JSON' messages and provide better feedback for errors
|
||||
- When testing MailGraph it is now possible to set the eventId to zero - a random problem will be picked up via the API
|
||||
- Zabbix Media Type XML reverted back to version 5.4 (for backwards compatibility)
|
||||
|
||||
Values available:
|
||||
Modified files
|
||||
- mailGraph.php
|
||||
- mailGraph.xml
|
||||
- javascript/zabbix.mailGraph.js
|
||||
|
||||
{{ baseURL }} - base url of the Zabbix system (use for references to API and login)
|
||||
For those upgrading to the latest release without installing the media type:
|
||||
- copy new mailGraph.php over existing mailGraph.php
|
||||
- open the Media type MailGraph in Zabbix and edit the javascript
|
||||
-- replace the script contents with the contents of javascript/zabbix.mailGraph.js
|
||||
|
||||
{{ TRIGGER_ID }} - id of the applicable trigger
|
||||
Changes are in effect immediately, no need to restart any services.
|
||||
|
||||
{{ TRIGGER_DESCRIPTION }} - raw trigger description (note: macros are not parsed!)
|
||||
## mailGraph v2.10 release ##
|
||||
_(2023/06/30)_
|
||||
|
||||
{{ TRIGGER_COMMENTS }} - comments of the trigger
|
||||
_This version has been verified with Zabbix 5.4, 6.0 LTS and 6.4, PHP 7.4 and 8.2 and recent versions of libraries used via composer._
|
||||
|
||||
{{ TRIGGER_URL }} - url of the trigger form
|
||||
Minor updates to the mailGraph code
|
||||
- When not defining zabbix_api_user and zabbix_api_pwd in the configuration file the zbx_user and zbx_user_pwd wll be used
|
||||
|
||||
{{ ITEM_ID }} - id of the associated item to the trigger
|
||||
## Zabbix 6.4.x testing ##
|
||||
_(2023/06/30)_
|
||||
|
||||
{{ ITEM_KEY }} - key of the item
|
||||
Zabbix 6.4 verification has succesfully completed.
|
||||
- Refactored code to remove deprecated and removed functions since Zabbix 6.4.0
|
||||
-- Zabbix Javascript now using HttpRequest instead of CurlHttpRequest (function name changes implemented)
|
||||
-- Zabbix API user.login is now based on "username" (instead of "user")
|
||||
|
||||
{{ ITEM_NAME }} - item name
|
||||
Sidenotes
|
||||
- Zabbix logging still shows deprecation messages however it is believed these are internal to Zabbix and not related to mailGraph
|
||||
|
||||
{{ ITEM_DESCRIPTION }} - description of the item
|
||||
_(2023/06/29)_
|
||||
|
||||
{{ ITEM_LASTVALUE }} - last value of the item
|
||||
Zabbix 6.4.x verification is in progress. Required intermediate release to fix one major issue (Zabbix login parameters deprecation) and some minor coding updates.
|
||||
Expect to continue with automatic configuration within the next 2 months.
|
||||
|
||||
{{ ITEM_PREVIOUSVALUE }} - the value of the before LASTVALUE
|
||||
## IMPORTANT NOTE for users of mailGraph v1 and Zabbix versions under 5.4 ##
|
||||
As a result of a major functional change in Zabbix 5.4 (Screens no longer exist and are all moved into Dashboards) the mailGraph.screen macro no longer functions under Zabbix 5.4+. A code rewrite is in progress to deal with detecting the Zabbix version and to pick dashboard.get instead of screen.get as a source list for the graphs that should be included in the mail message.
|
||||
|
||||
{{ ITEM_URL }} - url of the item form
|
||||
|
||||
{{ HOST_ID }} - id of the associated host to the item
|
||||
|
||||
{{ HOST_NAME }} - name of the host
|
||||
|
||||
{{ HOST_ERROR }} - last error state of the applicable host
|
||||
|
||||
{{ HOST_DESCRIPTION }} - description of the host
|
||||
|
||||
{{ HOST_URL }} - url of the host form
|
||||
|
||||
{{ EVENT_ID }} - id of the associated event
|
||||
|
||||
{{ EVENT_NAME }} - name of the event (note: macros are parsed!)
|
||||
|
||||
{{ EVENT_OPDATA }} - associated operational data of the vent
|
||||
|
||||
{{ EVENT_VALUE }} - event state (0=Recovered, 1=Triggered/Active)
|
||||
|
||||
{{ EVENT_SEVERITY }} - severity of the event
|
||||
|
||||
{{ EVENT_STATUS }} - status of the event
|
||||
|
||||
{{ EVENT_URL }} - url of the event details
|
||||
|
||||
{{ GRAPH_ID }} - id of the (first) associated graph that contains the item
|
||||
|
||||
{{ GRAPH_NAME }} - name of this graph
|
||||
|
||||
{{ GRAPH_URL }} - URL to this graph (assuming script produces to an accessible location)
|
||||
|
||||
{{ GRAPH_CID }} - IMG embed string (<img src="{{ GRAPH_CID }}" />)
|
||||
|
||||
{{ LOG_HTML }} - script log in HTML format
|
||||
|
||||
{{ LOG_PLAIN }} - script log in PLAIN text format
|
||||
|
||||
# Troubleshooting
|
||||
In general if something goes wrong (no output), use the following sequence to identify where the error has occured (and raise an issue in this repository so I can take a look at it):
|
||||
- Goto Zabbix => Reports => Action Log and search for events with Status "Failed"
|
||||
- Note the itemId, triggerId and eventId from this event for testing the Media Type manually
|
||||
- If the popup message says "Syntax Error" something went wrong with the processing during the script. In this case you have to investigate a bit more what is happening.
|
||||
|
||||
The easiest way to test what is happening is to now goto Administration => Media types and hit the "Test" at the right hand side for MailGraph.
|
||||
- Replace relevant macros with information (eventId, triggerId, itemId, recipient, baseUrl and URL) and hit "Test"
|
||||
- The last line in the result will tell you what the problem is (most likely an access or connectivity issue)
|
||||
- Fix accordingly and retry
|
||||
|
||||
To facilitate troubleshooting, you can (at code level):
|
||||
- switch on $cDebugMail to receive processing logs as attachment of an e-mail message
|
||||
- store logs in the /log directory when $cDebug is switched on
|
||||
|
||||
In case of an issue that happens before an e-mail is sent, you can also perform a CLI based test:
|
||||
- php mailGraph.php test
|
||||
|
||||
Note that you have to set the configuration items starting with "cli" in config.json with actual values from a previous message to make this work!
|
||||
|
||||
Last resort is to raise an issue in this repository and I will try to assist as soon as possible to fix it.
|
||||
**v1.x is no longer supported; please upgrade to the current v2 release**
|
||||
|
||||
@@ -1,15 +1,28 @@
|
||||
{
|
||||
"script_baseurl": "https:\/\/domain.com\/",
|
||||
"script_baseurl": "https:\/\/mydomain.com\/",
|
||||
"cli_itemId": 0,
|
||||
"cli_triggerId": 0,
|
||||
"cli_eventId": 0,
|
||||
"cli_eventValue": 0,
|
||||
"cli_duration": 0,
|
||||
"cli_recipient": "recipient@domain.com",
|
||||
"cli_baseURL": "https:\/\/domain.com\/zabbix\/",
|
||||
"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_pwd": "astrongpassword",
|
||||
"zabbix_user_pwd": "astrongpassword",
|
||||
"zabbix_api_user": "alogicalusername",
|
||||
"zabbix_api_pwd": "astrongpassword",
|
||||
"mail_from": "sender@domain.com"
|
||||
"mail_from": "sender@mydomain.com",
|
||||
"subject": "{{ HOST_NAME|raw }}: ({{ EVENT_SEVERITY }}) {{ EVENT_NAME|raw }}",
|
||||
"smtp_server": "localhost",
|
||||
"smtp_port": 25,
|
||||
"smtp_transport": "none",
|
||||
"smtp_strict": "yes",
|
||||
"graph_match": "any",
|
||||
"period": "20m",
|
||||
"period_header": "Last 20 minutes",
|
||||
"debug": 0
|
||||
}
|
||||
|
||||
28
config/config.json.template.multigraph
Normal file
28
config/config.json.template.multigraph
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"script_baseurl": "https:\/\/mydomain.com\/",
|
||||
"cli_itemId": 0,
|
||||
"cli_triggerId": 0,
|
||||
"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_periods": "10m,4h,2d,7d",
|
||||
"cli_periods_headers": "Last 10 minutes,Last 4 hours,Last 2 days,Last 7 days",
|
||||
"cli_debug": 1,
|
||||
"cli_proxy": "",
|
||||
"zabbix_user": "alogicalusername",
|
||||
"zabbix_user_pwd": "astrongpassword",
|
||||
"zabbix_api_user": "alogicalusername",
|
||||
"zabbix_api_pwd": "astrongpassword",
|
||||
"mail_from": "sender@mydomain.com",
|
||||
"subject": "{{ HOST_NAME|raw }}: ({{ EVENT_SEVERITY }}) {{ EVENT_NAME|raw }}",
|
||||
"smtp_server": "localhost",
|
||||
"smtp_port": 25,
|
||||
"smtp_transport": "none",
|
||||
"smtp_strict": "yes",
|
||||
"graph_match": "any",
|
||||
"periods": "10m,4h,2d,7d",
|
||||
"periods_headers": "Last 10 minutes,Last 4 hours,Last 2 days,Last 7 days",
|
||||
"debug": 0
|
||||
}
|
||||
@@ -27,7 +27,7 @@
|
||||
$content = file_get_contents($argv[1]);
|
||||
$data = json_decode($content,TRUE);
|
||||
|
||||
if ($data==NULL)
|
||||
if (($data==NULL) && (sizeof($content)>2))
|
||||
{
|
||||
echo 'Invalid JSON format in config file?!'.$cCRLF;
|
||||
die;
|
||||
|
||||
BIN
images/Example-Zabbix-MediaType-Config.png
Normal file
BIN
images/Example-Zabbix-MediaType-Config.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 85 KiB |
BIN
images/Example-mail-message-v122.png
Executable file
BIN
images/Example-mail-message-v122.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 95 KiB |
1
javascript/READ.ME
Normal file
1
javascript/READ.ME
Normal file
@@ -0,0 +1 @@
|
||||
Issue #32 has been resolved. The javascript code now works for Zabbix 5.4, 6.0 LTS and 6.4.
|
||||
86
javascript/zabbix.mailGraph.js
Normal file
86
javascript/zabbix.mailGraph.js
Normal file
@@ -0,0 +1,86 @@
|
||||
// mailGraph v2.13
|
||||
try {
|
||||
// Pickup parameters
|
||||
params = JSON.parse(value),
|
||||
req = new HttpRequest(),
|
||||
fields = {},
|
||||
resp = '',
|
||||
result = { tags: {} };
|
||||
|
||||
// Set HTTP proxy if required
|
||||
if (typeof params.HTTPProxy === 'string' && params.HTTPProxy.trim() !== '') {
|
||||
req.setProxy(params.HTTPProxy);
|
||||
fields.HTTPProxy = params.HTTPProxy;
|
||||
}
|
||||
|
||||
// Declare output type
|
||||
req.addHeader('Content-Type: application/json');
|
||||
|
||||
// Must have fields
|
||||
fields.itemId = params.itemId * 1;
|
||||
fields.eventId = params.eventId * 1;
|
||||
fields.recipient = params.recipient;
|
||||
fields.baseURL = params.baseURL;
|
||||
fields.duration = params.duration * 1;
|
||||
|
||||
if (isNaN(fields.eventId)) {
|
||||
throw '[MailGraph Webhook] Invalid event ID? Integer required (use actual event ID from Zabbix!)';
|
||||
}
|
||||
|
||||
if (isNaN(fields.duration)) {
|
||||
throw '[MailGraph Webhook] Invalid duration? Integer required (set to zero if unknown)!';
|
||||
}
|
||||
|
||||
if (fields.recipient.charAt(0) == '{') {
|
||||
throw '[MailGraph Webhook] Please define recipient for the test message!';
|
||||
}
|
||||
|
||||
// Optional fields
|
||||
if (typeof params.graphWidth === 'string') { fields.graphWidth = params.graphWidth; }
|
||||
if (typeof params.graphHeight === 'string') { fields.graphHeight = params.graphHeight; }
|
||||
if (typeof params.subject === 'string') { fields.subject = params.subject; }
|
||||
if (typeof params.showLegend === 'string') { fields.showLegend = params.showLegend; }
|
||||
if (typeof params.periods === 'string') { fields.periods = params.periods; }
|
||||
if (typeof params.periods_headers === 'string') { fields.periods_headers = params.periods_headers; }
|
||||
if (typeof params.debug === 'string') { fields.debug = params.debug; }
|
||||
|
||||
// Add generic fields
|
||||
Object.keys(params).forEach(function(key) {
|
||||
if (key.substring(0, 4) == 'info') {
|
||||
fields[key] = params[key];
|
||||
}
|
||||
});
|
||||
|
||||
// Post information to the processing script
|
||||
Zabbix.Log(4, '[MailGraph Webhook] Sending request: ' + params.URL + '?' + JSON.stringify(fields));
|
||||
var resp = req.post(params.URL,JSON.stringify(fields));
|
||||
Zabbix.Log(4, '[Mailgraph Webhook] Received response:' + resp);
|
||||
|
||||
// If blank the email address is likely incorrect
|
||||
if (resp==null) {
|
||||
throw '[MailGraph Webhook] No data received from mailGraph! Likely the email processing failed? Check mailGraph logging';
|
||||
}
|
||||
|
||||
// If there was an error, report it and stop
|
||||
if (req.getStatus() != 200) { throw JSON.parse(resp).errors[0]; }
|
||||
|
||||
// If no datas returned, report it and stop
|
||||
if (resp.charAt(0) == "!") {
|
||||
throw '[MailGraph Webhook] No data received from mailGraph! Likely the event ID provided does not exist? Check mailGraph logging';
|
||||
}
|
||||
|
||||
// We expect the message id back from the processing script
|
||||
msg = JSON.parse(resp);
|
||||
|
||||
result.tags.__message_id = msg.messageId;
|
||||
Zabbix.Log(4, '[MailGraph Webhook] Message sent with identification "' + msg.messageId + '"');
|
||||
|
||||
// Pass the result back to Zabbix
|
||||
return JSON.stringify(result);
|
||||
}
|
||||
catch (error)
|
||||
{
|
||||
// In case something went wrong in the processing, pass the error back to Zabbix
|
||||
Zabbix.Log(127, 'MailGraph notification failed: '+error);
|
||||
throw 'MailGraph notification failed : '+error;
|
||||
}
|
||||
1297
mailGraph.php
1297
mailGraph.php
File diff suppressed because it is too large
Load Diff
273
mailGraph.xml
273
mailGraph.xml
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<zabbix_export>
|
||||
<version>5.0</version>
|
||||
<date>2021-02-27T16:34:16Z</date>
|
||||
<version>5.4</version>
|
||||
<date>2023-07-02T12:48:36Z</date>
|
||||
<media_types>
|
||||
<media_type>
|
||||
<name>MailGraph</name>
|
||||
@@ -9,7 +9,7 @@
|
||||
<parameters>
|
||||
<parameter>
|
||||
<name>baseURL</name>
|
||||
<value>https://zbx.puzzl.nl/zabbix/</value>
|
||||
<value>https://myzabbix.example.com/</value>
|
||||
</parameter>
|
||||
<parameter>
|
||||
<name>duration</name>
|
||||
@@ -19,10 +19,6 @@
|
||||
<name>eventId</name>
|
||||
<value>{EVENT.ID}</value>
|
||||
</parameter>
|
||||
<parameter>
|
||||
<name>eventValue</name>
|
||||
<value>{EVENT.VALUE}</value>
|
||||
</parameter>
|
||||
<parameter>
|
||||
<name>graphHeight</name>
|
||||
<value>120</value>
|
||||
@@ -35,10 +31,22 @@
|
||||
<name>HTTPProxy</name>
|
||||
<value/>
|
||||
</parameter>
|
||||
<parameter>
|
||||
<name>infoTest</name>
|
||||
<value>Test</value>
|
||||
</parameter>
|
||||
<parameter>
|
||||
<name>itemId</name>
|
||||
<value>{ITEM.ID}</value>
|
||||
</parameter>
|
||||
<parameter>
|
||||
<name>periods</name>
|
||||
<value>10m,4h,1d,7d</value>
|
||||
</parameter>
|
||||
<parameter>
|
||||
<name>periods_headers</name>
|
||||
<value>Last 10 minutes,Last 4 hours,Last day,Last 7 days</value>
|
||||
</parameter>
|
||||
<parameter>
|
||||
<name>recipient</name>
|
||||
<value>{ALERT.SENDTO}</value>
|
||||
@@ -49,156 +57,159 @@
|
||||
</parameter>
|
||||
<parameter>
|
||||
<name>subject</name>
|
||||
<value>{{ EVENT_SEVERITY }} --- {{ EVENT_NAME }}</value>
|
||||
</parameter>
|
||||
<parameter>
|
||||
<name>triggerId</name>
|
||||
<value>{TRIGGER.ID}</value>
|
||||
<value>{{ HOST_NAME|raw }}: ({{ EVENT_SEVERITY }}) {{ EVENT_NAME|raw }}</value>
|
||||
</parameter>
|
||||
<parameter>
|
||||
<name>URL</name>
|
||||
<value>https://zbx.puzzl.nl/mailGraph.php</value>
|
||||
<value>https://myzabbix.example.com/mailGraph.php</value>
|
||||
</parameter>
|
||||
</parameters>
|
||||
<script>try {
|
||||
// Pickup parameters
|
||||
params = JSON.parse(value),
|
||||
req = new CurlHttpRequest(),
|
||||
fields = {},
|
||||
resp = '',
|
||||
result = { tags: {} };
|
||||
|
||||
// Set HTTP proxy if required
|
||||
if (typeof params.HTTPProxy === 'string' && params.HTTPProxy.trim() !== '') { req.setProxy(params.HTTPProxy); }
|
||||
|
||||
// Declare output type
|
||||
req.AddHeader('Content-Type: application/json');
|
||||
|
||||
// Must have fields
|
||||
fields.itemId = params.itemId;
|
||||
fields.triggerId = params.triggerId;
|
||||
fields.eventId = params.eventId;
|
||||
fields.eventValue = params.eventValue;
|
||||
fields.recipient = params.recipient;
|
||||
fields.baseURL = params.baseURL;
|
||||
fields.duration = params.duration;
|
||||
|
||||
// Optional fields
|
||||
if (typeof params.graphWidth === 'string') { fields.graphWidth = params.graphWidth; }
|
||||
if (typeof params.graphHeight === 'string') { fields.graphHeight = params.graphHeight; }
|
||||
if (typeof params.subject === 'string') { fields.subject = params.subject; }
|
||||
if (typeof params.showLegend === 'string') { fields.showLegend = params.showLegend; }
|
||||
|
||||
// Post information to the processing script
|
||||
Zabbix.Log(4, '[MailGraph Webhook] Sending request: ' + params.URL + '?' + JSON.stringify(fields));
|
||||
var resp = req.Post(params.URL,JSON.stringify(fields));
|
||||
Zabbix.Log(4, '[Mailgraph Webhook] Receiving response:' + resp);
|
||||
|
||||
// If there was an error, report it
|
||||
if (req.Status() != 200) { throw JSON.parse(resp).errors[0]; }
|
||||
|
||||
// We expect the message id back from the processing script
|
||||
resp = JSON.parse(resp);
|
||||
result.tags.__message_id = resp.messageId;
|
||||
|
||||
// Pass the result back to Zabbix
|
||||
return JSON.stringify(result);
|
||||
}
|
||||
catch (error)
|
||||
{
|
||||
// In case something went wrong in the processing, pass the error back to Zabbix
|
||||
Zabbix.Log(127, 'MailGraph notification failed : '+error);
|
||||
throw 'MailGraph notification failed : '+error;
|
||||
<script>// mailGraph v2.13
|
||||
try {
|
||||
// Pickup parameters
|
||||
params = JSON.parse(value),
|
||||
req = new HttpRequest(),
|
||||
fields = {},
|
||||
resp = '',
|
||||
result = { tags: {} };
|
||||
|
||||
// Set HTTP proxy if required
|
||||
if (typeof params.HTTPProxy === 'string' && params.HTTPProxy.trim() !== '') {
|
||||
req.setProxy(params.HTTPProxy);
|
||||
fields.HTTPProxy = params.HTTPProxy;
|
||||
}
|
||||
|
||||
// Declare output type
|
||||
req.addHeader('Content-Type: application/json');
|
||||
|
||||
// Must have fields
|
||||
fields.itemId = params.itemId * 1;
|
||||
fields.eventId = params.eventId * 1;
|
||||
fields.recipient = params.recipient;
|
||||
fields.baseURL = params.baseURL;
|
||||
fields.duration = params.duration * 1;
|
||||
|
||||
if (isNaN(fields.eventId)) {
|
||||
throw '[MailGraph Webhook] Invalid event ID? Integer required (use actual event ID from Zabbix!)';
|
||||
}
|
||||
|
||||
if (isNaN(fields.duration)) {
|
||||
throw '[MailGraph Webhook] Invalid duration? Integer required (set to zero if unknown)!';
|
||||
}
|
||||
|
||||
if (fields.recipient.charAt(0) == '{') {
|
||||
throw '[MailGraph Webhook] Please define recipient for the test message!';
|
||||
}
|
||||
|
||||
// Optional fields
|
||||
if (typeof params.graphWidth === 'string') { fields.graphWidth = params.graphWidth; }
|
||||
if (typeof params.graphHeight === 'string') { fields.graphHeight = params.graphHeight; }
|
||||
if (typeof params.subject === 'string') { fields.subject = params.subject; }
|
||||
if (typeof params.showLegend === 'string') { fields.showLegend = params.showLegend; }
|
||||
if (typeof params.periods === 'string') { fields.periods = params.periods; }
|
||||
if (typeof params.periods_headers === 'string') { fields.periods_headers = params.periods_headers; }
|
||||
if (typeof params.debug === 'string') { fields.debug = params.debug; }
|
||||
|
||||
// Add generic fields
|
||||
Object.keys(params).forEach(function(key) {
|
||||
if (key.substring(0, 4) == 'info') {
|
||||
fields[key] = params[key];
|
||||
}
|
||||
});
|
||||
|
||||
// Post information to the processing script
|
||||
Zabbix.Log(4, '[MailGraph Webhook] Sending request: ' + params.URL + '?' + JSON.stringify(fields));
|
||||
var resp = req.post(params.URL,JSON.stringify(fields));
|
||||
Zabbix.Log(4, '[Mailgraph Webhook] Received response:' + resp);
|
||||
|
||||
// If blank the email address is likely incorrect
|
||||
if (resp==null) {
|
||||
throw '[MailGraph Webhook] No data received from mailGraph! Likely the email processing failed? Check mailGraph logging';
|
||||
}
|
||||
|
||||
// If there was an error, report it and stop
|
||||
if (req.getStatus() != 200) { throw JSON.parse(resp).errors[0]; }
|
||||
|
||||
// If no datas returned, report it and stop
|
||||
if (resp.charAt(0) == "!") {
|
||||
throw '[MailGraph Webhook] No data received from mailGraph! Likely the event ID provided does not exist? Check mailGraph logging';
|
||||
}
|
||||
|
||||
// We expect the message id back from the processing script
|
||||
msg = JSON.parse(resp);
|
||||
|
||||
result.tags.__message_id = msg.messageId;
|
||||
Zabbix.Log(4, '[MailGraph Webhook] Message sent with identification "' + msg.messageId + '"');
|
||||
|
||||
// Pass the result back to Zabbix
|
||||
return JSON.stringify(result);
|
||||
}
|
||||
catch (error)
|
||||
{
|
||||
// In case something went wrong in the processing, pass the error back to Zabbix
|
||||
Zabbix.Log(127, 'MailGraph notification failed: '+error);
|
||||
throw 'MailGraph notification failed : '+error;
|
||||
}</script>
|
||||
<process_tags>YES</process_tags>
|
||||
<description>The "URL" must point to the location of the processing script. If a proxy is required, define "HTTPProxy" for the proxy address.
|
||||
|
||||
Customization:
|
||||
- "graphWidth" and "graphWidth" can be defined for the image size
|
||||
- "showLegend" can be defined to show or hide the legend of the graph
|
||||
- "subject" can be defined for a customized subject for the mail message
|
||||
|
||||
The html.template and plain.template files can be adjusted (TWIG format).
|
||||
|
||||
Values available:
|
||||
{{ baseURL }} - base url of the Zabbix system (use for references to API and login)
|
||||
{{ TRIGGER_ID }} - id of the applicable trigger
|
||||
{{ TRIGGER_DESCRIPTION }} - raw trigger description (note: macros are not parsed!)
|
||||
{{ TRIGGER_COMMENTS }} - comments of the trigger
|
||||
{{ TRIGGER_URL }} - url of the trigger form
|
||||
{{ ITEM_ID }} - id of the associated item to the trigger
|
||||
{{ ITEM_KEY }} - key of the item
|
||||
{{ ITEM_NAME }} - item name
|
||||
{{ ITEM_DESCRIPTION }} - description of the item
|
||||
{{ ITEM_LASTVALUE }} - last value of the item
|
||||
{{ ITEM_PREVIOUSVALUE }} - the value of the before LASTVALUE
|
||||
{{ ITEM_URL }} - url of the item form
|
||||
{{ HOST_ID }} - id of the associated host to the item
|
||||
{{ HOST_NAME }} - name of the host
|
||||
{{ HOST_ERROR }} - last error state of the applicable host
|
||||
{{ HOST_DESCRIPTION }} - description of the host
|
||||
{{ HOST_URL }} - url of the host form
|
||||
{{ EVENT_ID }} - id of the associated event
|
||||
{{ EVENT_NAME }} - name of the event (note: macros are parsed!)
|
||||
{{ EVENT_OPDATA }} - associated operational data of the vent
|
||||
{{ EVENT_VALUE }} - event state (0=Recovered, 1=Triggered/Active)
|
||||
{{ EVENT_SEVERITY }} - severity of the event
|
||||
{{ EVENT_STATUS }} - status of the event
|
||||
{{ EVENT_URL }} - url of the event details
|
||||
{{ GRAPH_ID }} - id of the (first) associated graph that contains the item
|
||||
{{ GRAPH_NAME }} - name of this graph
|
||||
{{ GRAPH_URL }} - URL to this graph (assuming script produces to an accessible location)
|
||||
{{ GRAPH_CID }} - IMG embed string (<img src="{{ GRAPH_CID }}" />)
|
||||
{{ LOG_HTML }} - script log in HTML format
|
||||
{{ LOG_PLAIN }} - script log in PLAIN text format</description>
|
||||
<description>The "URL" must point to the location of the processing script. If a proxy is required, define "HTTPProxy" for the proxy address.
|
||||
|
||||
Customization:
|
||||
- "graphWidth" and "graphWidth" can be defined for the image size
|
||||
- "showLegend" can be defined to show or hide the legend of the graph
|
||||
- "subject" can be defined for a customized subject for the mail message
|
||||
- "periods" and "periods_headers" can be defined for displaying multiple periods of the same graph, or
|
||||
- "period" and "period_header" can be defined to display a single graph
|
||||
|
||||
The html.template and plain.template files can be adjusted (TWIG format).
|
||||
|
||||
More details are available at https://github.com/moudsen/mailGraph</description>
|
||||
<message_templates>
|
||||
<message_template>
|
||||
<event_source>TRIGGERS</event_source>
|
||||
<operation_mode>PROBLEM</operation_mode>
|
||||
<subject>Problem: {EVENT.NAME}</subject>
|
||||
<message>Problem started at {EVENT.TIME} on {EVENT.DATE}
|
||||
Problem name: {EVENT.NAME}
|
||||
Host: {HOST.NAME}
|
||||
Severity: {EVENT.SEVERITY}
|
||||
Operational data: {EVENT.OPDATA}
|
||||
Original problem ID: {EVENT.ID}
|
||||
{TRIGGER.URL}
|
||||
|
||||
eventId: {EVENT.ID}
|
||||
TriggerId: {TRIGGER.ID}
|
||||
<message>Problem started at {EVENT.TIME} on {EVENT.DATE}
|
||||
Problem name: {EVENT.NAME}
|
||||
Host: {HOST.NAME}
|
||||
Severity: {EVENT.SEVERITY}
|
||||
Operational data: {EVENT.OPDATA}
|
||||
Original problem ID: {EVENT.ID}
|
||||
{TRIGGER.URL}
|
||||
|
||||
eventId: {EVENT.ID}
|
||||
TriggerId: {TRIGGER.ID}
|
||||
itemId: {ITEM.ID]</message>
|
||||
</message_template>
|
||||
<message_template>
|
||||
<event_source>TRIGGERS</event_source>
|
||||
<operation_mode>RECOVERY</operation_mode>
|
||||
<subject>Resolved in {EVENT.DURATION}: {EVENT.NAME}</subject>
|
||||
<message>Problem has been resolved at {EVENT.RECOVERY.TIME} on {EVENT.RECOVERY.DATE}
|
||||
Problem name: {EVENT.NAME}
|
||||
Problem duration: {EVENT.DURATION}
|
||||
Host: {HOST.NAME}
|
||||
Severity: {EVENT.SEVERITY}
|
||||
Original problem ID: {EVENT.ID}
|
||||
{TRIGGER.URL}
|
||||
|
||||
eventId: {EVENT.ID}
|
||||
TriggerId: {TRIGGER.ID}
|
||||
<subject>Resolved in {EVENT.DURATION}: {EVENT.RECOVERY.NAME}</subject>
|
||||
<message>Problem has been resolved at {EVENT.RECOVERY.TIME} on {EVENT.RECOVERY.DATE}
|
||||
Problem name: {EVENT.RECOVERY.NAME}
|
||||
Problem duration: {EVENT.DURATION}
|
||||
Host: {HOST.NAME}
|
||||
Severity: {EVENT.SEVERITY}
|
||||
Original problem ID: {EVENT.ID}
|
||||
{TRIGGER.URL}
|
||||
|
||||
eventId: {EVENT.ID}
|
||||
TriggerId: {TRIGGER.ID}
|
||||
itemId: {ITEM.ID]</message>
|
||||
</message_template>
|
||||
<message_template>
|
||||
<event_source>TRIGGERS</event_source>
|
||||
<operation_mode>UPDATE</operation_mode>
|
||||
<subject>Updated problem in {EVENT.AGE}: {EVENT.NAME}</subject>
|
||||
<message>{USER.FULLNAME} {EVENT.UPDATE.ACTION} problem at {EVENT.UPDATE.DATE} {EVENT.UPDATE.TIME}.
|
||||
{EVENT.UPDATE.MESSAGE}
|
||||
|
||||
Current problem status is {EVENT.STATUS}, age is {EVENT.AGE}, acknowledged: {EVENT.ACK.STATUS}.
|
||||
|
||||
eventId: {EVENT.ID}
|
||||
TriggerId: {TRIGGER.ID}
|
||||
<message>{USER.FULLNAME} {EVENT.UPDATE.ACTION} problem at {EVENT.UPDATE.DATE} {EVENT.UPDATE.TIME}.
|
||||
{EVENT.UPDATE.MESSAGE}
|
||||
|
||||
Current problem status is {EVENT.STATUS}, age is {EVENT.AGE}, acknowledged: {EVENT.ACK.STATUS}.
|
||||
|
||||
eventId: {EVENT.ID}
|
||||
TriggerId: {TRIGGER.ID}
|
||||
itemId: {ITEM.ID]</message>
|
||||
</message_template>
|
||||
</message_templates>
|
||||
</media_type>
|
||||
</media_types>
|
||||
</zabbix_export>
|
||||
|
||||
|
||||
@@ -1,74 +1,192 @@
|
||||
<html lang="en"><head><meta http-equiv=Content-Type content="text/html; charset=UTF-8">
|
||||
<style>
|
||||
.Resolved {
|
||||
background-color:#86cc89;
|
||||
border:1px solid #57bd5b;
|
||||
font-family:Tahoma,Geneva,Arial,sans-serif;font-size:14px;
|
||||
}
|
||||
.Information {
|
||||
background-color:#7499ff;
|
||||
border:1px solid #4673f0;
|
||||
font-family:Tahoma,Geneva,Arial,sans-serif;font-size:14px;
|
||||
}
|
||||
.Warning {
|
||||
background-color:#FFC859;
|
||||
border:1px solid #E69F10;
|
||||
font-family:Tahoma,Geneva,Arial,sans-serif;font-size:14px;
|
||||
}
|
||||
.Average {
|
||||
background-color:#FFA059;
|
||||
border:1px solid #e66e15;
|
||||
font-family:Tahoma,Geneva,Arial,sans-serif;font-size:14px;
|
||||
}
|
||||
.High {
|
||||
background-color:#E97659;
|
||||
border:1px solid #E45959;
|
||||
font-family:Tahoma,Geneva,Arial,sans-serif;font-size:14px;
|
||||
}
|
||||
.Disaster {
|
||||
background-color:#E45959;
|
||||
border:1px solid #DE1E09;
|
||||
font-family:Tahoma,Geneva,Arial,sans-serif;font-size:14px;
|
||||
}
|
||||
body {
|
||||
font-family: Arial,sans-serif;
|
||||
}
|
||||
.Resolved {
|
||||
background-color:#86cc89;
|
||||
border:1px solid #57bd5b;
|
||||
}
|
||||
.Information {
|
||||
background-color:#7499ff;
|
||||
border:1px solid #4673f0;
|
||||
}
|
||||
.Warning {
|
||||
background-color:#FFC859;
|
||||
border:1px solid #E69F10;
|
||||
}
|
||||
.Average {
|
||||
background-color:#FFA059;
|
||||
border:1px solid #e66e15;
|
||||
}
|
||||
.High {
|
||||
background-color:#E97659;
|
||||
border:1px solid #E45959;
|
||||
}
|
||||
.Disaster {
|
||||
background-color:#E45959;
|
||||
border:1px solid #DE1E09;
|
||||
}
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: #010059;
|
||||
}
|
||||
a:link {
|
||||
text-decoration: none;
|
||||
color: #010059;
|
||||
}
|
||||
a:visited {
|
||||
text-decoration: none;
|
||||
color: #010059;
|
||||
}
|
||||
a:active {
|
||||
text-decoration: none;
|
||||
color: #010059;
|
||||
}
|
||||
hr {
|
||||
border: none;
|
||||
height: 1px;
|
||||
color: #333; /* old IE */
|
||||
background-color: #333;
|
||||
}
|
||||
.MsgBody {
|
||||
width: 100%;
|
||||
}
|
||||
#maintable {
|
||||
width: 800px;
|
||||
}
|
||||
@media screen and (max-width: 800px;) {
|
||||
#maintable {
|
||||
width: 100%;
|
||||
max-width: 790px;
|
||||
}
|
||||
#mainimage {
|
||||
-ms-interpolation-mode: bicubic;
|
||||
width: 100%;
|
||||
max-width: 790px;
|
||||
max-height: 450px;
|
||||
}
|
||||
}
|
||||
.links {
|
||||
font-size: 9px;
|
||||
}
|
||||
.header {
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.graphHeader {
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.content {
|
||||
font-size: 14px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table style="margin: 10px;border-spacing:0 15px;border-collapse: separate;">
|
||||
<tr>
|
||||
<td class="{{ EVENT_SEVERITY }}" style="border-radius:10px;padding: 10px 36px 10px 36px; ">
|
||||
<table class="{{ EVENT_SEVERITY }}" style="border:0; text-align:left;" cellpadding="0" cellspacing="0">
|
||||
<tr><td>
|
||||
<p><b>EVENT INFORMATION</b></p>
|
||||
Description: <b>{{ EVENT_NAME }}</b><br/>
|
||||
Host: <b>{{ HOST_NAME }}</b>
|
||||
<table style="margin: 5px;border-spacing:0 10px;border-collapse: separate;" align=center>
|
||||
<tr>
|
||||
<td class="{{ EVENT_SEVERITY }}" style="border-radius:10px;padding:5px 18px 5px 18px; ">
|
||||
<table class="{{ EVENT_SEVERITY }}" style="border:0; text-align:left;" cellpadding="0" cellspacing="0">
|
||||
<tr>
|
||||
<td>
|
||||
<p><span class="header">EVENT INFORMATION</span></p>
|
||||
<span class="content">
|
||||
Description: <b>{{ EVENT_NAME }}</b><br/>
|
||||
Host: <b>{{ HOST_NAME }}</b>
|
||||
{% if HOST_ERROR|length > 0 %}
|
||||
({{ HOST_ERROR }})
|
||||
({{ HOST_ERROR }})
|
||||
{% endif %}
|
||||
<br/>
|
||||
Operational data: <b>{{ EVENT_OPDATA }}</b><br/>
|
||||
Status: <b>{{ EVENT_STATUS }}</b><br/>
|
||||
Severity: <b>{{ EVENT_SEVERITY }}</b><br/>
|
||||
<br/>
|
||||
{% if EVENT_OPDATE|length > 0 %}
|
||||
Operational data: <b>{{ EVENT_OPDATA }}</b><br/>
|
||||
{% endif %}
|
||||
Status: <b>{{ EVENT_STATUS }}</b><br/>
|
||||
Severity: <b>{{ EVENT_SEVERITY }}</b><br/>
|
||||
{% if EVENT_SEVERITY == "Resolved" %}
|
||||
Duration: <b>{{ EVENT_DURATION }}</b><br/>
|
||||
Duration: <b>{{ EVENT_DURATION }}</b><br/>
|
||||
{% endif %}
|
||||
Item: <b>{{ ITEM_NAME }}</b> ({{ ITEM_KEY }})<br/>
|
||||
Previous/Last: {{ ITEM_PREVIOUSVALUE }} ==> {{ ITEM_LASTVALUE }}
|
||||
<p><a href="{{ EVENT_URL }}">Event Details</a><br/></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
{% if GRAPH_CID|length > 0 %}
|
||||
<tr>
|
||||
<td align="center"><img src="{{ GRAPH_CID }}" /></td>
|
||||
</tr>
|
||||
Item: <b>{{ ITEM_NAME }}</b><br/>
|
||||
Previous/Last: {{ ITEM_PREVIOUSVALUE }} ==> {{ ITEM_LASTVALUE }}
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="links">
|
||||
<div align=center>
|
||||
Event ID: <a href="{{ EVENTDETAILS_URL }}">{{ EVENT_ID }}</a> //
|
||||
Trigger ID: <a href="{{ TRIGGER_URL }}">{{ TRIGGER_ID }}</a> //
|
||||
Item ID: <a href="{{ ITEM_URL }}">{{ ITEM_ID }}</a> //
|
||||
Host ID: <a href="{{ HOST_URL }}">{{ HOST_ID }}</a>
|
||||
{% if GRAPH_ZABBIXLINK|length > 0 %}
|
||||
// Graph ID: <a href="{{ GRAPH_ZABBIXLINK }}">{{ GRAPH_ID }}</a>
|
||||
{% endif %}
|
||||
</table>
|
||||
<p style="font-size:10px">
|
||||
Event ID: <a href="{{ EVENT_URL }}">{{ EVENT_ID }}</a> //
|
||||
Trigger ID: <a href="{{ TRIGGER_URL }}">{{ TRIGGER_ID }}</a> //
|
||||
Item ID: <a href="{{ ITEM_URL }}">{{ ITEM_ID }}</a> //
|
||||
Host ID: <a href="{{ HOST_URL }}">{{ HOST_ID }}</a>
|
||||
</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{% for aGraph in GRAPHS_I %}
|
||||
<tr>
|
||||
<div align=justify>
|
||||
<td align="center">
|
||||
<span class="graphHeader">{{ aGraph.HEADER }}</span><br/>
|
||||
<img id="mainimage" border=0 style="width: 100%; max-width: 790px" alt="Zabbix Graph" src="{{ aGraph.CID }}" />
|
||||
</td>
|
||||
</div>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% if TRIGGER_SCREEN > 0 %}
|
||||
<tr>
|
||||
<div align=justify>
|
||||
<td align="center">
|
||||
<span class="graphHeader">{{ GRAPHS_T_HEADER }} - {{ GRAPHS_T_PERIODHEADER }}</span>
|
||||
</td>
|
||||
</div>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="links">
|
||||
<div align="center">
|
||||
Screen ID: <a href="{{ GRAPHS_T_LINK }}">{{ TRIGGER_SCREEN }}</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{% for aGraph in GRAPHS_T %}
|
||||
<tr>
|
||||
<div align=justify>
|
||||
<td align="center">
|
||||
<img id="mainimage" border=0 style="width: 100%; max-width: 790px" alt="Zabbix Graph" src="{{ aGraph.CID }}" />
|
||||
</td>
|
||||
</div>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if HOST_SCREEN > 0 %}
|
||||
<tr>
|
||||
<div align=justify>
|
||||
<td align="center">
|
||||
<span class="graphHeader">{{ GRAPHS_H_HEADER }} - {{ GRAPHS_H_PERIODHEADER }}</span>
|
||||
</td>
|
||||
</div>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="links">
|
||||
<div align="center">
|
||||
Screen ID: <a href="{{ GRAPHS_H_LINK }}">{{ HOST_SCREEN }}</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{% for aGraph in GRAPHS_H %}
|
||||
<tr>
|
||||
<div align=justify>
|
||||
<td align="center">
|
||||
<img id="mainimage" border=0 style="width: 100%; max-width: 790px" alt="Zabbix Graph" src="{{ aGraph.CID }}" />
|
||||
</td>
|
||||
</div>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
@@ -3,10 +3,10 @@ EVENT INFORMATION #{{ EVENT_ID }}
|
||||
Severity: {{ EVENT_SEVERITY }}
|
||||
Description: {{ EVENT_NAME }}
|
||||
|
||||
{% if GRAPH_CID|length > 0 %}
|
||||
GRAPH #{{ GRAPH_ID }}
|
||||
{{ GRAPH_URL }}
|
||||
This graph will remain available for approx. the next 2 weeks only; use HTML reader after this period to view the graph.
|
||||
{% if GRAPH_CID1|length > 0 %}
|
||||
GRAPH #{{ GRAPH_ID1 }}
|
||||
{{ GRAPH_URL1 }}
|
||||
This graph will remain available for approx. the next 2 weeks only; use HTML reader after this period to view the graph that is embedded in the attached HTML version.
|
||||
{% endif %}
|
||||
|
||||
TRIGGER #{{ TRIGGER_ID }}
|
||||
@@ -18,12 +18,12 @@ Description: {{ TRIGGER_DESCRIPTION }}
|
||||
ITEM #{{ ITEM_ID }}
|
||||
|
||||
Name: {{ ITEM_NAME }}
|
||||
Key: {{ ITEM_KEY }}
|
||||
Value: {{ ITEM_LASTVALUE }}
|
||||
Previous: {{ ITEM_PREVIOUSVALUE }}
|
||||
|
||||
HOST
|
||||
|
||||
Name: {{ HOST_NAME }}
|
||||
|
||||
EVENT DETAILS
|
||||
{{ baseURL }}/tr_events.php?triggerid={TRIGGER_ID}&eventid={EVENT_ID}
|
||||
{{ EVENTDETAILS_URL }}
|
||||
|
||||
Reference in New Issue
Block a user