mirror of
https://github.com/librenms/librenms.git
synced 2024-10-07 16:52:45 +00:00
Merge pull request #3519 from Peter2121/master
Improved support for Equallogic storage arrays and DELL servers
This commit is contained in:
@@ -102,6 +102,7 @@ LibreNMS contributors:
|
||||
- Jussi Sorjonen <mieleton@mieleton.net> (mieleton)
|
||||
- Jens Langhammer <jens@beryju.org> (BeryJu)
|
||||
- Robert Verspuy <robert@exa.nl> (exarv)
|
||||
- Peter Tkatchenko <peter@flytrace.com> (Peter2121)
|
||||
|
||||
[1]: http://observium.org/ "Observium web site"
|
||||
Observium was written by:
|
||||
|
@@ -922,6 +922,8 @@ $config['os'][$os]['text'] = 'Dell EqualLogic';
|
||||
$config['os'][$os]['icon'] = 'dell';
|
||||
$config['os'][$os]['over'][0]['graph'] = 'device_bits';
|
||||
$config['os'][$os]['over'][0]['text'] = 'Device Traffic';
|
||||
$config['os'][$os]['over'][1]['graph'] = 'device_storage';
|
||||
$config['os'][$os]['over'][1]['text'] = 'Storage Usage';
|
||||
|
||||
$os = 'drac';
|
||||
$config['os'][$os]['text'] = 'Dell DRAC';
|
||||
|
@@ -4,6 +4,7 @@
|
||||
* LibreNMS
|
||||
*
|
||||
* Copyright (c) 2014 Neil Lathwood <https://github.com/laf/ http://www.lathwood.co.uk/fa>
|
||||
* Modyfied by Peter TKATCHENKO https://github.com/Peter2121/ 2016
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
@@ -12,19 +13,85 @@
|
||||
* the source code distribution for details.
|
||||
*/
|
||||
|
||||
if ($device['os'] == 'linux') {
|
||||
$oids = snmp_walk($device, 'virtualDiskNumber', '-Oesqn', 'StorageManagement-MIB');
|
||||
$main_oid = '.1.3.6.1.4.1.674.10893.1.20.140.1.1.';
|
||||
$oids = snmp_walk($device, 'virtualDiskDeviceName', '-Oesqn', 'StorageManagement-MIB');
|
||||
$name_oid = '.1.3.6.1.4.1.674.10893.1.20.140.1.1.3';
|
||||
$main_oid = '.1.3.6.1.4.1.674.10893.1.20.140.1.1.4.';
|
||||
d_echo($oids."\n");
|
||||
|
||||
$oids = trim($oids);
|
||||
if ($oids) {
|
||||
echo 'Dell ';
|
||||
|
||||
$state_name = 'dellVirtualDiskState';
|
||||
$state_index_id = create_state_index($state_name);
|
||||
/*
|
||||
-- 1.3.6.1.4.1.674.10893.1.20.140.1.1.4
|
||||
virtualDiskState
|
||||
INTEGER
|
||||
{
|
||||
unknown(0),
|
||||
ready(1),
|
||||
failed(2),
|
||||
online(3),
|
||||
offline(4),
|
||||
degraded(6),
|
||||
verifying(7),
|
||||
resynching(15),
|
||||
regenerating(16),
|
||||
failedRedundancy(18),
|
||||
rebuilding(24),
|
||||
formatting(26),
|
||||
reconstructing(32),
|
||||
initializing(35),
|
||||
backgroundInit(36),
|
||||
permanentlyDegraded(52)
|
||||
}
|
||||
*/
|
||||
if ($state_index_id) {
|
||||
$states = array(
|
||||
array($state_index_id,'unknown',0,0,3) ,
|
||||
array($state_index_id,'ready',1,1,0) ,
|
||||
array($state_index_id,'failed',1,2,2) ,
|
||||
array($state_index_id,'online',1,3,1) ,
|
||||
array($state_index_id,'offline',1,4,2) ,
|
||||
array($state_index_id,'degraded',1,6,2) ,
|
||||
array($state_index_id,'verifying',1,7,1) ,
|
||||
array($state_index_id,'resynching',1,15,1) ,
|
||||
array($state_index_id,'regenerating',1,16,1) ,
|
||||
array($state_index_id,'failedRedundancy',1,18,2) ,
|
||||
array($state_index_id,'rebuilding',1,24,1) ,
|
||||
array($state_index_id,'formatting',1,26,1) ,
|
||||
array($state_index_id,'reconstructing',1,32,1) ,
|
||||
array($state_index_id,'initializing',1,35,1) ,
|
||||
array($state_index_id,'backgroundInit',1,36,1) ,
|
||||
array($state_index_id,'permanentlyDegraded',1,52,2)
|
||||
);
|
||||
|
||||
foreach($states as $value){
|
||||
$insert = array(
|
||||
'state_index_id' => $value[0],
|
||||
'state_descr' => $value[1],
|
||||
'state_draw_graph' => $value[2],
|
||||
'state_value' => $value[3],
|
||||
'state_generic_value' => $value[4]
|
||||
);
|
||||
dbInsert($insert, 'state_translations');
|
||||
}
|
||||
}
|
||||
|
||||
foreach (explode("\n", $oids) as $data) {
|
||||
list($oid,) = explode(' ', $data, 2);
|
||||
$state_oid = '4.1';
|
||||
$state_current = snmp_get($device, $main_oid.$state_oid, '-Oevq');
|
||||
discover_sensor($valid['sensor'], 'state', $device, $main_oid.$state_oid, "virtualDiskState.$state_oid", 'dell', 'Raid State', '1', '1', null, null, null, null, $state_current);
|
||||
list($oid,$name) = explode(' ', $data, 2);
|
||||
$name = trim($name,"\"");
|
||||
if($oid==$name_oid) continue; // Something goes wrong, we should have $name_oid.$num_index in $oid
|
||||
$split_oid = explode('.', $oid);
|
||||
$num_index = $split_oid[(count($split_oid) - 1)];
|
||||
$index = (int)$num_index+0;
|
||||
$oid = $main_oid.$num_index;
|
||||
$low_limit = 0.5;
|
||||
$high_limit = 1.5;
|
||||
|
||||
$state_current = snmp_get($device, $oid, '-Oevq');
|
||||
discover_sensor($valid['sensor'], 'state', $device, $oid, $index, $state_name, $name, '1', '1', $low_limit, $low_limit, $high_limit, $high_limit, $state_current,'snmp',$index);
|
||||
create_sensor_to_state_index($device, $state_name, $index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,40 +1,146 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* LibreNMS
|
||||
*
|
||||
* Copyright (c) 2016 Peter TKATCHENKO https://github.com/Peter2121/
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation, either version 3 of the License, or (at your
|
||||
* option) any later version. Please see LICENSE.txt at the top level of
|
||||
* the source code distribution for details.
|
||||
*/
|
||||
|
||||
if ($device['os'] == 'equallogic') {
|
||||
$oids = snmp_walk($device, 'eqlMemberHealthDetailsPowerSupplyName', '-OQn', 'EQLMEMBER-MIB', $config['install_dir'].'/mibs/equallogic');
|
||||
$oids = snmp_walk($device, 'eqlMemberHealthStatus', '-OQne', 'EQLMEMBER-MIB', $config['install_dir'].'/mibs/equallogic');
|
||||
|
||||
d_echo('Health oids:');
|
||||
d_echo($oids."\n");
|
||||
|
||||
/*
|
||||
eqlMemberHealthStatus
|
||||
INTEGER {
|
||||
unknown (0),
|
||||
normal (1),
|
||||
warning (2),
|
||||
critical (3)
|
||||
}
|
||||
DESCRIPTION The value of this object is determinted by the severity of the
|
||||
health condition state variables. The most severe state will
|
||||
be reflected.
|
||||
|
||||
The LibreNMS generic states is derived from Nagios:
|
||||
0 = OK
|
||||
1 = Warning
|
||||
2 = Critical
|
||||
3 = Unknown
|
||||
|
||||
*/
|
||||
|
||||
if (!empty($oids)) {
|
||||
$descr='Health';
|
||||
|
||||
$state_name = 'eqlMemberHealthStatus';
|
||||
$state_index_id = create_state_index($state_name);
|
||||
|
||||
if ($state_index_id) {
|
||||
$states = array(
|
||||
array($state_index_id,'unknown',0,0,3) ,
|
||||
array($state_index_id,'normal',1,1,0) ,
|
||||
array($state_index_id,'warning',1,2,1) ,
|
||||
array($state_index_id,'critical',1,3,2)
|
||||
);
|
||||
foreach($states as $value){
|
||||
$insert = array(
|
||||
'state_index_id' => $value[0],
|
||||
'state_descr' => $value[1],
|
||||
'state_draw_graph' => $value[2],
|
||||
'state_value' => $value[3],
|
||||
'state_generic_value' => $value[4]
|
||||
);
|
||||
dbInsert($insert, 'state_translations');
|
||||
}
|
||||
}
|
||||
|
||||
foreach (explode("\n", $oids) as $data) {
|
||||
$data = trim($data);
|
||||
if (!empty($data)) {
|
||||
list($oid,$current) = explode(' = ', $data, 2);
|
||||
$split_oid = explode('.', $oid);
|
||||
$num_index = $split_oid[(count($split_oid) - 1)];
|
||||
$index = (int)$num_index+0;
|
||||
$low_limit = 0.5;
|
||||
$high_limit = 2.5;
|
||||
discover_sensor($valid['sensor'], 'state', $device, $oid, $index, $state_name, $descr, 1, 1, $low_limit, $low_limit, $high_limit, $high_limit, $current, 'snmp', $index);
|
||||
create_sensor_to_state_index($device, $state_name, $index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$oids1 = snmp_walk($device, 'eqlMemberHealthDetailsPowerSupplyName', '-OQn', 'EQLMEMBER-MIB', $config['install_dir'].'/mibs/equallogic');
|
||||
|
||||
d_echo('PowerSupplyName oids:');
|
||||
d_echo($oids1."\n");
|
||||
|
||||
/*
|
||||
.1.3.6.1.4.1.12740.2.1.8.1.2.1.329840783.1 = Power Cooling Module 0
|
||||
.1.3.6.1.4.1.12740.2.1.8.1.2.1.329840783.2 = Power Cooling Module 1
|
||||
**/
|
||||
|
||||
d_echo($oids."\n");
|
||||
if (!empty($oids)) {
|
||||
echo 'EQLCONTROLLER-MIB ';
|
||||
foreach (explode("\n", $oids) as $data) {
|
||||
$base_oid = '.1.3.6.1.4.1.12740.2.1.8.1.3.1.'; // eqlMemberHealthDetailsPowerSupplyCurrentState
|
||||
|
||||
if (!empty($oids1)) {
|
||||
/*
|
||||
eqlMemberHealthDetailsPowerSupplyCurrentState
|
||||
INTEGER {
|
||||
on-and-operating (1),
|
||||
no-ac-power (2),
|
||||
failed-or-no-data (3) -- has ac but no dc out or we have no data
|
||||
}
|
||||
*/
|
||||
$state_name1 = 'eqlMemberPowerSupplyCurrentState';
|
||||
$state_index_id1 = create_state_index($state_name1);
|
||||
|
||||
if ($state_index_id1) {
|
||||
$states1 = array(
|
||||
array($state_index_id1,'on-and-operating',1,1,0) ,
|
||||
array($state_index_id1,'no-ac-power',1,2,1) ,
|
||||
array($state_index_id1,'failed-or-no-data',1,3,2)
|
||||
);
|
||||
foreach($states1 as $value){
|
||||
$insert = array(
|
||||
'state_index_id' => $value[0],
|
||||
'state_descr' => $value[1],
|
||||
'state_draw_graph' => $value[2],
|
||||
'state_value' => $value[3],
|
||||
'state_generic_value' => $value[4]
|
||||
);
|
||||
dbInsert($insert, 'state_translations');
|
||||
}
|
||||
}
|
||||
|
||||
foreach (explode("\n", $oids1) as $data) {
|
||||
$data = trim($data);
|
||||
if (!empty($data)) {
|
||||
list($oid,$descr) = explode(' = ', $data, 2);
|
||||
$split_oid = explode('.', $oid);
|
||||
$num_index = $split_oid[(count($split_oid) - 1)];
|
||||
$index = $num_index;
|
||||
$part_oid = $split_oid[(count($split_oid) - 2)];
|
||||
$num_index = $part_oid.'.'.$num_index;
|
||||
$base_oid = '.1.3.6.1.4.1.12740.2.1.8.1.3.1.';
|
||||
$index = (int)$num_index+0;
|
||||
$member_id = $split_oid[(count($split_oid) - 2)];
|
||||
$num_index = $member_id.'.'.$num_index;
|
||||
$oid = $base_oid.$num_index;
|
||||
$extra = snmp_get_multi($device, "eqlMemberHealthDetailsPowerSupplyCurrentState.3.329840783.$index", '-OQUse', 'EQLMEMBER-MIB', $config['install_dir'].'/mibs/equallogic');
|
||||
$keys = array_keys($extra);
|
||||
$temperature = $extra[$keys[0]]['eqlMemberHealthDetailsPowerSupplyValue'];
|
||||
$low_limit = $extra[$keys[0]]['eqlMemberHealthDetailsPowerSupplyLowCriticalThreshold'];
|
||||
$low_warn = $extra[$keys[0]]['eqlMemberHealthDetailsPowerSupplyLowWarningThreshold'];
|
||||
$high_limit = $extra[$keys[0]]['eqlMemberHealthDetailsPowerSupplyHighCriticalThreshold'];
|
||||
$high_warn = $extra[$keys[0]]['eqlMemberHealthDetailsPowerSupplyHighWarningThreshold'];
|
||||
$index = (100 + $index);
|
||||
|
||||
if ($extra[$keys[0]]['eqlMemberHealthDetailsPowerSupplyCurrentState'] != 'unknown') {
|
||||
discover_sensor($valid['sensor'], 'state', $device, $oid, $index, 'snmp', $descr, 1, 1, $low_limit, $low_warn, $high_limit, $high_warn, $temperature);
|
||||
$extra = snmp_get_multi($device, $oid, '-OQne', 'EQLMEMBER-MIB', $config['install_dir'].'/mibs/equallogic');
|
||||
d_echo($extra);
|
||||
if(!empty($extra)) {
|
||||
list($foid,$pstatus) = explode(' = ',$extra,2);
|
||||
$index = (100 + $index);
|
||||
$low_limit = 0.5;
|
||||
$high_limit = 1.5;
|
||||
discover_sensor($valid['sensor'], 'state', $device, $oid, $index, $state_name1, $descr, 1, 1, $low_limit, $low_limit, $high_limit, $high_limit, $pstatus, 'snmp', $index);
|
||||
create_sensor_to_state_index($device, $state_name1, $index);
|
||||
}
|
||||
}//end if
|
||||
}//end foreach
|
||||
}//end if
|
||||
}//end if empty oids
|
||||
}//end if
|
||||
|
38
includes/discovery/storage/eql-storage.inc.php
Normal file
38
includes/discovery/storage/eql-storage.inc.php
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* LibreNMS
|
||||
*
|
||||
* Copyright (c) 2016 Peter TKATCHENKO https://github.com/Peter2121/
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation, either version 3 of the License, or (at your
|
||||
* option) any later version. Please see LICENSE.txt at the top level of
|
||||
* the source code distribution for details.
|
||||
*/
|
||||
|
||||
$eql_storage = snmpwalk_cache_oid($device, 'EqliscsiVolumeEntry', null, 'EQLVOLUME-MIB', $config['install_dir'].'/mibs/equallogic');
|
||||
|
||||
if (is_array($eql_storage)) {
|
||||
echo 'EqliscsiVolumeEntry ';
|
||||
foreach ($eql_storage as $index => $storage) {
|
||||
$fstype = $storage['eqliscsiVolumeAdminStatus'];
|
||||
$descr = $storage['eqliscsiVolumeName'];
|
||||
$units = 1;
|
||||
$size = $storage['eqliscsiVolumeSize'] * $units;
|
||||
$used = $storage['eqliscsiVolumeStatusAllocatedSpace'] * $units;
|
||||
if (is_int($index)) {
|
||||
discover_storage($valid_storage, $device, $index, $fstype, 'eql-storage', $descr, $size, $units, $used);
|
||||
}
|
||||
else {
|
||||
// Trying to search the last '.' and take something after it as index
|
||||
$arrindex = explode(".", $index);
|
||||
$newindex = (int)(end($arrindex))+0;
|
||||
if (is_int($newindex)) {
|
||||
discover_storage($valid_storage, $device, $newindex, $fstype, 'eql-storage', $descr, $size, $units, $used);
|
||||
}
|
||||
}
|
||||
unset($deny, $fstype, $descr, $size, $used, $units, $storage_rrd, $old_storage_rrd, $hrstorage_array);
|
||||
}
|
||||
}
|
59
includes/polling/storage/eql-storage.inc.php
Normal file
59
includes/polling/storage/eql-storage.inc.php
Normal file
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* LibreNMS
|
||||
*
|
||||
* Copyright (c) 2016 Peter TKATCHENKO https://github.com/Peter2121/
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation, either version 3 of the License, or (at your
|
||||
* option) any later version. Please see LICENSE.txt at the top level of
|
||||
* the source code distribution for details.
|
||||
*/
|
||||
|
||||
if (!is_array($storage_cache1['eql-storage'])) {
|
||||
$storage_cache1['eql-storage'] = snmpwalk_cache_oid($device, 'EqliscsiVolumeEntry', null, 'EQLVOLUME-MIB', $config['install_dir'].'/mibs/equallogic');
|
||||
d_echo($storage_cache1);
|
||||
}
|
||||
|
||||
if (!is_array($storage_cache2['eql-storage'])) {
|
||||
$storage_cache2['eql-storage'] = snmpwalk_cache_oid($device, 'EqliscsiVolumeStatusEntry', null, 'EQLVOLUME-MIB', $config['install_dir'].'/mibs/equallogic');
|
||||
d_echo($storage_cache2);
|
||||
}
|
||||
|
||||
$iind = 0;
|
||||
$storage_cache10 = array();
|
||||
$storage_cache20 = array();
|
||||
|
||||
d_echo($storage);
|
||||
|
||||
foreach ($storage_cache1['eql-storage'] as $index => $ventry) {
|
||||
if (!array_key_exists('eqliscsiVolumeName', $ventry)) continue;
|
||||
if (is_int($index)) $iind = $index;
|
||||
else {
|
||||
$arrindex = explode(".", $index);
|
||||
$iind = (int)(end($arrindex))+0;
|
||||
}
|
||||
if (is_int($iind)) $storage_cache10[$iind] = $ventry;
|
||||
}
|
||||
d_echo($storage_cache10);
|
||||
|
||||
foreach ($storage_cache2['eql-storage'] as $index => $vsentry) {
|
||||
if (!array_key_exists('eqliscsiVolumeStatusAvailable', $vsentry)) continue;
|
||||
if (is_int($index)) $iind = $index;
|
||||
else {
|
||||
$arrindex = explode(".", $index);
|
||||
$iind = (int)(end($arrindex))+0;
|
||||
}
|
||||
if (is_int($iind)) $storage_cache20[$iind] = $vsentry;
|
||||
}
|
||||
d_echo($storage_cache20);
|
||||
|
||||
$entry1 = $storage_cache10[$storage[storage_index]];
|
||||
$entry2 = $storage_cache20[$storage[storage_index]];
|
||||
|
||||
$storage['units'] = 1;
|
||||
$storage['size'] = ($entry1['eqliscsiVolumeSize'] * $storage['units']);
|
||||
$storage['used'] = ($entry2['eqliscsiVolumeStatusAllocatedSpace'] * $storage['units']);
|
||||
$storage['free'] = ($storage['size'] - $storage['used']);
|
Reference in New Issue
Block a user