diff options
Diffstat (limited to 'torrus/perllib/Torrus/DevDiscover/CompaqCIM.pm')
-rw-r--r-- | torrus/perllib/Torrus/DevDiscover/CompaqCIM.pm | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/torrus/perllib/Torrus/DevDiscover/CompaqCIM.pm b/torrus/perllib/Torrus/DevDiscover/CompaqCIM.pm new file mode 100644 index 000000000..f055a187a --- /dev/null +++ b/torrus/perllib/Torrus/DevDiscover/CompaqCIM.pm @@ -0,0 +1,212 @@ +# Copyright (C) 2003 Shawn Ferry +# +# 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 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + +# $Id: CompaqCIM.pm,v 1.1 2010-12-27 00:03:47 ivan Exp $ +# Shawn Ferry <sferry at sevenspace dot com> <lalartu at obscure dot org> + +# Compaq Insight Manager +# MIB files available at +# http://h18023.www1.hp.com/support/files/server/us/download/19885.html + +package Torrus::DevDiscover::CompaqCIM; + +use strict; +use Torrus::Log; + + +$Torrus::DevDiscover::registry{'CompaqCIM'} = { + 'sequence' => 500, + 'checkdevtype' => \&checkdevtype, + 'discover' => \&discover, + 'buildConfig' => \&buildConfig + }; + +our %oiddef = + ( + # Compaq Insite Manager + 'cpqcim' => '1.3.6.1.4.1.232', + + # CPQHLTH-MIB + 'cpqHeTemperatureTable' => '1.3.6.1.4.1.232.6.2.6.8', + 'cpqHeTemperatureChassis' => '1.3.6.1.4.1.232.6.2.6.8.1.1', + 'cpqHeTemperatureIndex' => '1.3.6.1.4.1.232.6.2.6.8.1.2', + 'cpqHeTemperatureLocale' => '1.3.6.1.4.1.232.6.2.6.8.1.3', + 'cpqHeTemperatureCelsius' => '1.3.6.1.4.1.232.6.2.6.8.1.4', + 'cpqHeTemperatureHwLocation' => '1.3.6.1.4.1.232.6.2.6.8.1.8', + + 'cpqHeCorrMemTotalErrs' => '1.3.6.1.4.1.232.6.2.3.3.0', + + # This is not a complete implementation of the HLTH MIB + + ); + +sub checkdevtype +{ + my $dd = shift; + my $devdetails = shift; + + return $dd->checkSnmpTable( 'cpqcim' ); +} + +my $enumLocale = { + 1 => 'other', + 2 => 'unknown', + 3 => 'system', + 4 => 'systemBoard', + 5 => 'ioBoard', + 6 => 'cpu', + 7 => 'memory', + 8 => 'storage', + 9 => 'removableMedia', + 10 => 'powerSupply', + 11 => 'ambient', + 12 => 'chassis', + 13 => 'bridgeCard', +}; + + +sub discover +{ + my $dd = shift; + my $devdetails = shift; + + my $session = $dd->session(); + my $data = $devdetails->data(); + + my @checkOids = ( 'cpqHeCorrMemTotalErrs' ); + + foreach my $oid ( @checkOids ) + { + if( $dd->checkSnmpOID($oid) ) + { + $devdetails->setCap( $oid ); + } + } + + my $TemperatureTable = + $session->get_table( -baseoid => + $dd->oiddef('cpqHeTemperatureTable') ); + + if( defined( $TemperatureTable ) ) + { + $devdetails->storeSnmpVars( $TemperatureTable ); + $devdetails->setCap( 'cpqHeTemperatureTable' ); + + my $ref = {}; + $ref->{'indices'} = []; + $data->{'TemperatureTable'} = $ref; + + # Index is Chassis . Index + foreach my $INDEX + ( $devdetails-> + getSnmpIndices( $dd->oiddef('cpqHeTemperatureIndex') ) ) + { + next if ( $devdetails->snmpVar + ( $dd->oiddef('cpqHeTemperatureCelsius') . + '.' . $INDEX ) < 0 ); + + push( @{$ref->{'indices'}}, $INDEX ); + + my $chassis = $devdetails->snmpVar + ( $dd->oiddef('cpqHeTemperatureChassis') . '.' . $INDEX ); + + my $sensorIdx = $devdetails->snmpVar + ( $dd->oiddef('cpqHeTemperatureIndex') . '.' . $INDEX ); + + my $locale = $devdetails->snmpVar + ( $dd->oiddef('cpqHeTemperatureLocale') . '.' . $INDEX ); + $locale = $enumLocale->{$locale} if $enumLocale->{$locale}; + + my $location = $devdetails->snmpVar + ( $dd->oiddef('cpqHeTemperatureHwLocation') . '.' . $INDEX ); + + my $nick = sprintf('Chassis%d_%s_%d', + $chassis, $locale, $sensorIdx); + + my $param = {}; + $ref->{$INDEX}->{'param'} = $param; + $param->{'cpq-cim-sensor-index'} = $INDEX; + $param->{'cpq-cim-sensor-nick'} = $nick; + $param->{'comment'} = + sprintf('Chassis: %s Location: %s Index: %s', + $chassis, $locale, $sensorIdx); + $param->{'precedence'} = 1000 - $sensorIdx; + } + } + + return 1; +} + + +sub buildConfig +{ + my $devdetails = shift; + my $cb = shift; + my $devNode = shift; + my $data = $devdetails->data(); + + my $cimParam = { + 'comment' => 'Compaq Insight Manager', + 'precedence' => '-500', + }; + + my $cimNode = $cb->addSubtree( $devNode, 'CompaqCIM', $cimParam ); + + my $healthParam = { + 'comment' => 'Compaq CIM Health', + 'precedence' => '-500' + }; + + my @healthTemplates; + if( $devdetails->hasCap('cpqHeCorrMemTotalErrs') ) + { + push( @healthTemplates, 'CompaqCIM::cpq-cim-corr-mem-errs' ); + } + + my $Health = $cb->addSubtree( $cimNode, 'Health', $healthParam, + \@healthTemplates); + + if( $devdetails->hasCap('cpqHeTemperatureTable') ) + { + my $tempParam = { + 'precedence' => '-100', + 'comment' => 'Compaq Temperature Sensors', + 'rrd-create-dstype' => 'GAUGE', + }; + + my $tempNode = + $cb->addSubtree( $Health, 'Temperature_Sensors', $tempParam ); + + my $ref = $data->{'TemperatureTable'}; + + foreach my $INDEX ( @{ $ref->{'indices'} } ) + { + my $param = $ref->{$INDEX}->{'param'}; + $cb->addLeaf( $tempNode, $param->{'cpq-cim-sensor-nick'}, $param, + [ 'CompaqCIM::cpq-cim-temperature-sensor' ] ); + } + } +} + + +1; + + +# Local Variables: +# mode: perl +# indent-tabs-mode: nil +# perl-indent-level: 4 +# End: |