diff options
Diffstat (limited to 'torrus/perllib/Torrus/DevDiscover/UcdSnmp.pm')
| -rw-r--r-- | torrus/perllib/Torrus/DevDiscover/UcdSnmp.pm | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/torrus/perllib/Torrus/DevDiscover/UcdSnmp.pm b/torrus/perllib/Torrus/DevDiscover/UcdSnmp.pm new file mode 100644 index 000000000..9c9ce733d --- /dev/null +++ b/torrus/perllib/Torrus/DevDiscover/UcdSnmp.pm @@ -0,0 +1,265 @@ +# 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: UcdSnmp.pm,v 1.1 2010-12-27 00:03:47 ivan Exp $ +# Shawn Ferry <sferry at sevenspace dot com> <lalartu at obscure dot org> + +# Ucd Snmp Discovery + +package Torrus::DevDiscover::UcdSnmp; + +use strict; +use Torrus::Log; + + +$Torrus::DevDiscover::registry{'UcdSnmp'} = { + 'sequence' => 500, + 'checkdevtype' => \&checkdevtype, + 'discover' => \&discover, + 'buildConfig' => \&buildConfig + }; + +our %oiddef = + ( + # ucd + 'ucd' => '1.3.6.1.4.1.2021', + 'net_snmp' => '1.3.6.1.4.1.8072', + + # We assume that if we have Avail we also have Total + 'ucd_memAvailSwap' => '1.3.6.1.4.1.2021.4.4.0', + 'ucd_memAvailReal' => '1.3.6.1.4.1.2021.4.6.0', + + # If we have in we assume out + 'ucd_ssSwapIn' => '1.3.6.1.4.1.2021.11.3.0', + + # If we have User we assume System and Idle + 'ucd_ssCpuRawUser' => '1.3.6.1.4.1.2021.11.50.0', + 'ucd_ssCpuRawNice' => '1.3.6.1.4.1.2021.11.51.0', + 'ucd_ssCpuRawWait' => '1.3.6.1.4.1.2021.11.54.0', + 'ucd_ssCpuRawKernel' => '1.3.6.1.4.1.2021.11.55.0', + 'ucd_ssCpuRawInterrupts' => '1.3.6.1.4.1.2021.11.56.0', + 'ucd_ssCpuRawSoftIRQ' => '1.3.6.1.4.1.2021.11.61.0', + + # if we have Sent we assume Received + 'ucd_ssIORawSent' => '1.3.6.1.4.1.2021.11.57.0', + + 'ucd_ssRawInterrupts' => '1.3.6.1.4.1.2021.11.59.0', + 'ucd_ssRawContexts' => '1.3.6.1.4.1.2021.11.60.0', + + 'ucd_laTable' => '1.3.6.1.4.1.2021.10' + ); + +sub checkdevtype +{ + my $dd = shift; + my $devdetails = shift; + + my $sysObjectID = $devdetails->snmpVar( $dd->oiddef('sysObjectID') ); + + if( not $dd->oidBaseMatch( 'ucd', $sysObjectID ) + and + not $dd->oidBaseMatch( 'net_snmp', $sysObjectID ) ) + { + return 0; + } + + return 1; +} + + +sub discover +{ + my $dd = shift; + my $devdetails = shift; + + my $session = $dd->session(); + my $data = $devdetails->data(); + + my @checkOids = ( + 'ucd_memAvailSwap', + 'ucd_memAvailReal', + 'ucd_ssSwapIn', + 'ucd_ssCpuRawUser', + 'ucd_ssCpuRawWait', + 'ucd_ssCpuRawKernel', + 'ucd_ssCpuRawInterrupts', + 'ucd_ssCpuRawNice', + 'ucd_ssCpuRawSoftIRQ', + 'ucd_ssIORawSent', + 'ucd_ssRawInterrupts', + ); + + + my $result = $dd->retrieveSnmpOIDs( @checkOids ); + if( defined( $result ) ) + { + foreach my $oid ( @checkOids ) + { + if( defined($result->{$oid}) and length($result->{$oid}) > 0 ) + { + $devdetails->setCap($oid); + } + } + } + + if( $dd->checkSnmpTable('ucd_laTable') ) + { + $devdetails->setCap('ucd_laTable'); + } + + return 1; +} + + +sub buildConfig +{ + my $devdetails = shift; + my $cb = shift; + my $devNode = shift; + + my $data = $devdetails->data(); + + # Hostresources MIB is optional in net-snmp. We try and use the same + # subtree name for UCD and Hostresources statistics. + + my $subtreeName = + $devdetails->param('RFC2790_HOST_RESOURCES::sysperf-subtree-name'); + if( not defined( $subtreeName ) ) + { + $subtreeName = 'System_Performance'; + $devdetails->setParam + ('RFC2790_HOST_RESOURCES::sysperf-subtree-name', $subtreeName); + } + + my @templates; + if( $devdetails->hasCap('ucd_ssIORawSent') ) + { + push( @templates, 'UcdSnmp::ucdsnmp-blockio' ); + } + + if( $devdetails->hasCap('ucd_ssRawInterrupts') ) + { + push( @templates, 'UcdSnmp::ucdsnmp-raw-interrupts' ); + } + + if( $devdetails->hasCap('ucd_laTable') ) + { + push( @templates, 'UcdSnmp::ucdsnmp-load-average' ); + } + + if( $devdetails->hasCap('ucd_memAvailSwap') ) + { + push( @templates, 'UcdSnmp::ucdsnmp-memory-swap' ); + } + + if( $devdetails->hasCap('ucd_memAvailReal') ) + { + push( @templates, 'UcdSnmp::ucdsnmp-memory-real' ); + } + + my $cpuMultiParam; + my @cpuMultiTemplates; + + if( $devdetails->hasCap('ucd_ssCpuRawUser') ) + { + $cpuMultiParam = { + 'graph-lower-limit' => '0', + 'rrd-hwpredict' => 'disabled', + 'vertical-label' => 'Cpu Usage', + 'comment' => 'Cpu Idle, Sys, User', + 'ds-names' => 'idle,sys,user', + 'ds-type' => 'rrd-multigraph' + }; + + push( @templates, + 'UcdSnmp::ucdsnmp-cpu-user', + 'UcdSnmp::ucdsnmp-cpu-system', + 'UcdSnmp::ucdsnmp-cpu-idle' ); + + push( @cpuMultiTemplates, + 'UcdSnmp::ucdsnmp-cpu-user-multi', + 'UcdSnmp::ucdsnmp-cpu-system-multi', + 'UcdSnmp::ucdsnmp-cpu-idle-multi' ); + + if( $devdetails->hasCap('ucd_ssCpuRawWait') ) + { + push( @templates, 'UcdSnmp::ucdsnmp-cpu-wait' ); + push( @cpuMultiTemplates, 'UcdSnmp::ucdsnmp-cpu-wait-multi' ); + + $cpuMultiParam->{'comment'} .= ', Wait'; + $cpuMultiParam->{'ds-names'} .= ',wait'; + } + + if( $devdetails->hasCap('ucd_ssCpuRawKernel') ) + { + push( @templates, 'UcdSnmp::ucdsnmp-cpu-kernel' ); + push( @cpuMultiTemplates, 'UcdSnmp::ucdsnmp-cpu-kernel-multi' ); + + $cpuMultiParam->{'comment'} .= ', Kernel'; + $cpuMultiParam->{'ds-names'} .= ',kernel'; + } + + if( $devdetails->hasCap('ucd_ssCpuRawNice') ) + { + push( @templates, 'UcdSnmp::ucdsnmp-cpu-nice' ); + push( @cpuMultiTemplates, 'UcdSnmp::ucdsnmp-cpu-nice-multi' ); + + $cpuMultiParam->{'comment'} .= ', Nice'; + $cpuMultiParam->{'ds-names'} .= ',nice'; + } + + if( $devdetails->hasCap('ucd_ssCpuRawInterrupts') ) + { + push( @templates, 'UcdSnmp::ucdsnmp-cpu-interrupts' ); + push( @cpuMultiTemplates, + 'UcdSnmp::ucdsnmp-cpu-interrupts-multi' ); + + $cpuMultiParam->{'comment'} .= ', Interrupts'; + $cpuMultiParam->{'ds-names'} .= ',int'; + } + + if( $devdetails->hasCap('ucd_ssCpuRawSoftIRQ') ) + { + push( @templates, 'UcdSnmp::ucdsnmp-cpu-softirq' ); + push( @cpuMultiTemplates, + 'UcdSnmp::ucdsnmp-cpu-softirq-multi' ); + + $cpuMultiParam->{'comment'} .= ', SoftIRQs'; + $cpuMultiParam->{'ds-names'} .= ',softirq'; + } + + $cpuMultiParam->{'comment'} =~ s/\,\s+(\w+)$/ and $1/; + } + + my $perfNode = $cb->addSubtree( $devNode, $subtreeName, + undef, \@templates); + + if( $cpuMultiParam ) + { + $cb->addLeaf( $perfNode, 'Cpu_Stats', + $cpuMultiParam, \@cpuMultiTemplates ); + } +} + + +1; + + +# Local Variables: +# mode: perl +# indent-tabs-mode: nil +# perl-indent-level: 4 +# End: |
