Added Zabbix Plugin for RackTables 29/head
authorKirill Skilsara <k.a.skilsara@protonmail.ch>
Mon, 17 Apr 2017 19:21:51 +0000 (23:21 +0400)
committerKirill Skilsara <k.a.skilsara@protonmail.ch>
Mon, 17 Apr 2017 19:21:51 +0000 (23:21 +0400)
Zabbix/README.md [new file with mode: 0644]
Zabbix/Zabbix.php [new file with mode: 0644]
Zabbix/zabbix.config.php [new file with mode: 0644]

diff --git a/Zabbix/README.md b/Zabbix/README.md
new file mode 100644 (file)
index 0000000..b72a4f5
--- /dev/null
@@ -0,0 +1,67 @@
+# Intro
+Zabbix plugin for RackTables offers a limited functional of Zabbix monitoring system for objects of RackTables environment.
+Plugin uses open-source PHP class [library](https://github.com/confirm/PhpZabbixApi) to communicate with the Zabbix™ JSON-RPC API.  
+Please feel free to observe demo screenshots in [Wiki](https://github.com/skilsara/zabbix-plugin-for-racktables/wiki) tab.
+
+Author: Kirill Skilsara k.a.skilsara@protonmail.ch
+
+# How to install plugin
+1) Download a files "Zabbix.php" and "zabbix.config.php" from this repository to your server which runs RackTables.
+
+2) Download a latest release of Zabbix PHP API [library](https://github.com/confirm/PhpZabbixApi/releases/latest) to the same server.
+
+3) Unpack all archives, there are four files which you will be needed summarily:
+- Zabbix.php
+- zabbix.config.php
+- ZabbixApiAbstract.class.php
+- ZabbixApi.class.php
+
+4) Place these files into "inc" directory inside root directory of RackTables.
+
+5) Inside "inc" directory edit file "init.php"; in the head of this one you will see a bunch of "require_once" php files, so after last of them add this:
+
+`require_once 'Zabbix.php';`
+
+save changes, close the file.
+
+6) Now we need specify parameters for accessing Zabbix API. Open file "zabbix.config.php" inside "inc" directory and find "Configuration section":
+
+`###########################################################################`                        
+`########################## Configuration section ##########################`                            
+`###########################################################################`                            
+
+`### Main Parameters ###`
+
+`$zabbix_user = 'admin'; // User for access to Zabbix frontend. User must have read permissions at least.`
+`$zabbix_password = 'password'; // Password for selected user.`                                                
+`$zabbix_url = 'http://example.org'; // You must specify only your domain name or IP address with http(s) prefix! Example: http://example.org`
+
+`### End of Main Parameters ###`
+
+`### Zabbix triggers and graphs parametres ###`
+
+`$general_info_enabled = 'yes'; // Display general info such as status of agent. Default value is 'yes'`
+`$triggers_enabled = 'yes'; // Display a list of triggers. Default value is 'yes'`                             
+`$graphs_enabled = 'no'; // Default value is 'no'. This is experimental feature.`                                    
+`$graphs_period = 86400; // Graph period in seconds, default value is 86400 = 1 day.`
+
+`### End of Zabbix triggers and graphs parametres ###`
+
+You must specify username, password and URL for your Zabbix server inside brackets. This user must have read permissions at least. I would recommend to create special user which will have only read permissions and only to host groups that you allow.
+
+Now if you will look at RackTables frontend - there is a new tab inside each object, called "Zabbix".
+
+# Plugin usage
+**WARNING!**
+
+- Names of objects in RackTables environment and names of objects in Zabbix environment must be the **SAME**. At this moment plugin doesn't include any mechanism of syncing data or something like that.
+- Tab with Zabbix info is a static page. If you need most recent data - refresh the page.
+
+**General info**                                                                                                                                                                                                                      
+Shows a global status of host (monitored\not monitored by zabbix) and statuses of agents (Zabbix Agent, JMX Agent, etc). Enabled by default.       
+
+**Triggers**                                                                                                                      
+Shows a total number of triggers linked to host, numbers of triggers in "OK" and "PROBLEM" statuses and detailed description of each trigger. Enabled by default.        
+
+**Graphs**                                                                                                                      
+Experimental feature. Gets **ALL** graphs linked to host (you must be authorized in Zabbix frontend to see them in RackTables). It's a quite heavy request, so make sure do you really need it. Disabled by default. Default time range for graphs - 1 day (you can change it).
diff --git a/Zabbix/Zabbix.php b/Zabbix/Zabbix.php
new file mode 100644 (file)
index 0000000..fb8f4dc
--- /dev/null
@@ -0,0 +1,187 @@
+<?php
+// load ZabbixApi
+require_once 'ZabbixApi.class.php';
+require_once 'zabbix.config.php';
+use ZabbixApi\ZabbixApi;
+$tab['object']['Zabbix'] = 'Zabbix';
+$tabhandler['object']['Zabbix'] = 'ZabbixTabHandler';
+
+function ApplyCSSforZabbixPage() {
+        echo '
+                <style type="text/css">
+                .table-triggers {width: 100%;}
+                .header-description, .header-severity, .header-change, .header-status {background-color: #999797; margin: 10px 1px 1px 1px; width: 75%; padding: 10px 0; text-align: center;}
+                .header-severity {width: 7%;}
+                .header-change {width: 10%;}
+                .information, .warning, .average, .high, .critical, .disaster {padding: 10px 0; margin: 1px; width: 7%; text-align: center;}
+                .information {background-color: #d6f6ff;}
+                .warning {background-color: #fff6a5;}
+                .average {background-color: #ffb689;}
+                .high {background-color: #ff9999;}
+                .disaster {background-color: #ff3838;}
+                .na {background-color: #ff3838;}
+                .trigger_description, .last_change, .status_ok, .status_problem {padding: 10px 0; margin: 1px; text-align: center;}
+                .trigger_description {background-color: #dbdbdb; width: 75%;}
+                .last_change {background-color: #c4c2c2; width: 10%}
+                .status_problem {background-color: #f83838; width: 7%;}
+                .status_ok {background-color: #33ff00; width: 7%;}
+                .portlet .ok {color: green;}
+                .portlet .problem {color: red;}
+                .portlet .unknown {color: orange;}
+                </style>
+             ';
+}
+function ZabbixTabHandler()
+{
+
+global $zabbix_url;
+global $zabbix_user;
+global $zabbix_password;
+global $general_info_enabled;
+global $triggers_enabled;
+global $graphs_enabled;
+global $graphs_period;
+
+### API Settings ###
+try
+{
+// connect to Zabbix API
+    $api = new ZabbixApi(''.$zabbix_url.'/zabbix/api_jsonrpc.php', $zabbix_user, $zabbix_password);
+}
+catch(Exception $e)
+{
+// Exception in ZabbixApi catched
+    echo $e->getMessage();
+}
+### End of API Settings ###
+###########################################################################
+########################## End of config section ##########################
+###########################################################################
+$attributes = spotEntity ('object', $_REQUEST['object_id']);
+// Checking if host with selected name really exist
+$hosts = $api->hostGet(array('search' => array('name' => $attributes['name'])));
+if (empty($hosts)) {
+        echo '<div style="margin: 10px;">Seems host doesn\'t exist in Zabbix or possibly there is object name mismatch between Zabbix and RackTables, check it.</div>';
+}
+// if host exist go to next section
+else {
+ApplyCSSforZabbixPage();
+
+if ($general_info_enabled == 'yes') {
+        $general_info = $api->hostGet(array('search' => array('name' => $attributes['name']),'output' => 'extend'));
+        echo '<div class="portlet">';
+        echo '<h2>General Info</h2>';
+        if ($general_info[0]->status == 0) {
+                echo '<h4>Host is <span class="ok">MONITORED</span> by Zabbix</h4>';
+        }
+        else {
+                echo '<h4>Host is <span class="problem">NOT MONITORED</span> by Zabbix</h4>';
+        }
+        if ($general_info[0]->available == 1) {
+        echo '<h4>Host is <span class="ok">MONITORED</span> by Zabbix Agent</h4>';
+        }
+        elseif ($general_info[0]->available == 2) {
+                echo '<h4>Host is <span class="problem">NOT MONITORED</span> by Zabbix Agent</h4>';
+        }
+        else {
+                echo '<h4>Zabbix Agent status on host is <span class="unknown">UNKNOWN</span></h4>';
+        }
+        if ($general_info[0]->ipmi_available == 1) {
+        echo '<h4>Host is <span class="ok">MONITORED</span> by IPMI Agent</h4>';
+        }
+        elseif ($general_info[0]->ipmi_available == 2) {
+                echo '<h4>Host is <span class="problem">NOT MONITORED</span> by IPMI Agent</h4>';
+        }
+        else {
+                echo '<h4>IPMI Agent status on host is <span class="unknown">UNKNOWN</span></h4>';
+        }
+        if ($general_info[0]->jmx_available == 1) {
+        echo '<h4>Host is <span class="ok">MONITORED</span> by JMX Agent</h4>';
+        }
+        elseif ($general_info[0]->jmx_available == 2) {
+                echo '<h4>Host is <span class="problem">NOT MONITORED</span> by JMX Agent</h4>';
+        }
+        else {
+                echo '<h4>JMX Agent status on host is <span class="unknown">UNKNOWN</span></h4>';
+        }
+        if ($general_info[0]->snmp_available == 1) {
+                echo '<h4>Host is <span class="ok">AVAILABLE</span> by SNMP</h4>';
+        }
+        elseif ($general_info[0]->snmp_available == 2) {
+                echo '<h4>Host is <span class="problem">NOT AVAILABLE</span> by SNMP</h4>';
+        }
+        else {
+                echo '<h4>SNMP status on host is <span class="unknown">UNKNOWN</span></h4>';
+        }
+        echo '</div>';
+}
+if ($triggers_enabled == 'yes') {
+$triggers = $api->hostGet(array(
+        'search' => array('name' => $attributes['name']),
+        'selectTriggers' => array('priority','description','value','lastchange')
+));
+echo '<div class="portlet">';
+echo '<h2>Triggers</h2>';
+echo '<h4>Triggers total: '.count($triggers[0]->triggers).'</h4>';
+$i = 0; $j = 0;
+foreach ($triggers[0]->triggers as $element) {
+        if ($element->value == 1) {$i++;} else {$j++;}
+}
+echo '<h4>Triggers in <span class="problem">PROBLEM</span> status: '.$i.'</h4>';
+echo '<h4>Triggers in <span class="ok">OK</span> status: '.$j.'</h4>';
+echo '<table class="table-triggers">';
+echo '<tr>';
+echo '<th class="header-severity">Severity</th>';
+echo '<th class="header-description">Description</th>';
+echo '<th class="header-change">Last Change</th>';
+echo '<th class="header-status">Status</th>';
+echo '</tr>';
+foreach ($triggers[0]->triggers as $element) {
+                echo '<tr>';
+                if ($element->priority == 1) {
+                        echo '<td class="information">Information</td>';
+                }
+                elseif ($element->priority == 2) {
+                        echo '<td class="warning">Warning</td>';
+                }
+                elseif ($element->priority == 3) {
+                        echo '<td class="average">Average</td>';
+                }
+                elseif ($element->priority == 4) {
+                        echo '<td class="high">High</td>';
+                }
+                elseif ($element->priority == 5) {
+                        echo '<td class="disaster">Disaster</td>';
+                }
+                else {
+                        echo '<td class="na">N/A</td>';
+                }
+                echo '<td class="trigger_description">'.$element->description.'</td>';
+                echo '<td class="last_change">'.date('d/m/Y h:i',$element->lastchange).'</td>';
+                if ($element->value == 1) {
+                echo '<td class="status_problem">PROBLEM</td>';
+                }
+                else {
+                        echo '<td class="status_ok">OK</td>';
+                }
+                echo '</tr>';
+        }
+echo '</table>';
+echo '</div>';
+}
+if ($graphs_enabled == 'yes') {
+$graphs = $api->hostGet(array(
+        'search' => array('name' => $attributes['name']),
+        'selectGraphs' => array('graphids')
+));
+echo '<div class="portlet">';
+echo '<h2>Graphs</h2>';
+foreach ($graphs[0]->graphs as $graph) {
+        echo '<img src="'.$zabbix_url.'/zabbix/chart2.php?graphid='.$graph->graphid.'&period='.$graphs_period.'">';
+        echo '<br><br>';
+}
+echo '</div>';
+                }
+        }
+}
+?>
diff --git a/Zabbix/zabbix.config.php b/Zabbix/zabbix.config.php
new file mode 100644 (file)
index 0000000..60a0caf
--- /dev/null
@@ -0,0 +1,24 @@
+<?php
+
+###########################################################################
+########################## Configuration section ##########################
+###########################################################################
+
+### Main Parameters ###
+
+$zabbix_user = 'admin'; // User for access to Zabbix frontend. User must have read permissions at least.
+$zabbix_password = 'password'; // Password for selected user.
+$zabbix_url = 'http://example.org'; // You must specify only your domain name or IP address with http(s) prefix! Example: http://example.org
+
+### End of Main Parameters ###
+
+### Zabbix triggers and graphs parametres ###
+
+$general_info_enabled = 'yes'; // Display general info such as status of agent. Default value is 'yes'
+$triggers_enabled = 'yes'; // Display a list of triggers. Default value is 'yes'
+$graphs_enabled = 'no'; // Default value is 'no'. This is experimental feature.
+$graphs_period = 86400; // Graph period in seconds, default value is 86400 = 1 day.
+
+### End of Zabbix triggers and graphs parametres ###
+
+?>