[Date Prev] [Date Next] | [Thread Prev] [Thread Next] | [Date Index] [Thread Index] |
[snips-users] patch for div by 0 error in snmpmon-collector
|
Hi, Below is a patch for the snmpmon-collector. Most of the changes relate to documentation and debugging. However, there was a division by zero error in procdata_router(). Regards, Darin --- snmpmon-collector.orig Tue Jan 29 01:41:02 2002 +++ snmpmon-collector Tue Jan 29 01:02:36 2002 @@ -12,6 +12,18 @@ # # Copyright 1994-2001, Netplex Technologies, Inc. # +# +# Changes by Darin Davis (Jan 2002): +# +# - added numerous debug statements (debug level 3) and some code comments +# changed '@devicelist' to '@devices' in script header documentation +# - changed first debug statement in procdata_router from +# 'Running procdata_cisco_router' to 'Running procdata_router' +# - changed 'if' to 'elsif' on match for ifSpeed in procdata_router() +# - commented out 'print "VARIABLE $varalias VALUE\n" in procdata_router() +# (doesn't belong in /tmp/snmpmon/*.snmpmon files) +# - added test for non-positive ifSpeed in procdata_router(); without it, +# division by zero errors occur on tunl0 and ppp0 interfaces ###### # Program to poll SNMP variables from various devices. Needs configuration # data for the format: @@ -37,7 +49,7 @@ # monitor are preset for each 'type', and any custom data parsing is done # for each 'type'. # -# @devicelist list of devices to monitor +# @devices list of devices to monitor # %typevars{$type} list of SNMP variables for each TYPE # %devvars{$device} list of SNMP variables for each DEVICE # %nvarval{$var} current values for device being monitored @@ -64,7 +76,7 @@ ); BEGIN { - $snipsroot = "/usr/local/snips" unless $snipsroot; # SET_THIS + $snipsroot = "/usr/local/snips" unless $snipsroot; # SET_THIS push (@INC, "$snipsroot/etc"); push (@INC, "$snipsroot/bin"); require "snipsperl.conf" ; # local customizations } @@ -76,7 +88,7 @@ $etcdir = "$snipsroot/etc" unless $etcdir; # location of config file $bindir = "$snipsroot/bin" unless $bindir; -$ping = "ping" unless $ping; # SET_THIS to ping location +$ping = "/bin/ping" unless $ping; # SET_THIS to ping location $snmpget = "$bindir/snmpget" unless $snmpget ; # location of snmpget $snmpwalk = "$bindir/snmpwalk" unless $snmpwalk;# location of snmpwalk #$mibfile = "$etcdir/mibII.txt" ; # location of MIB file SET_THIS @@ -84,7 +96,7 @@ $ENV{"MIBFILE"}= $mibfile ; $ENV{"MIBFILE_v2"}= $mibfile ; -$debug = 0; # set to 1 for debugging output +$debug = 0; # set to 1, 2 or 3 for debugging output $prognm = $0; # save program name $sleeptime = 10 ; # in seconds @@ -311,57 +323,84 @@ my (@ifDescr, @ifSpeed) = (undef, undef); $debug && - print STDERR "(debug) Running procdata_cisco_router for device $dev\n"; + print STDERR "procdata_router: device: $dev\n"; + ($debug>2) && print STDERR "procdata_router: prevtime{$d}, testtime: $prevtime{$d}, $testtime\n"; + + # for each router MIB var foreach my $var ( @{$typevars{"router"}} ) { my $v = &toindex($var) ; + ($debug>2) && print STDERR "procdata_router: var: $var\n"; next if (! defined(@{$nvarval{$v}}) ); + ($debug>2) && print STDERR "procdata_router: v: $v\n"; # Print values for some variables, deltas for some... + + # don't write out ifDescr or ifSpeed if ($var =~ /ifDescr/) { at ifDescr = @{$nvarval{$v}} ;} - if ($var =~ /ifSpeed/) { at ifSpeed = @{$nvarval{$v}} ;} + elsif ($var =~ /ifSpeed/) { at ifSpeed = @{$nvarval{$v}} ;} + + # write ifOutQLen for each interface elsif ($var =~ /ifOutQLen/) # need value, not rate { + # behead everything up to '.ifOutQLen' my ($varalias) = ( $var =~ /^.*(\.[^.]+)$/ ) ; $varalias = $mibalias{router} . $varalias ; + # ASSERT: varalias = RTR.ifOutQLen + ($debug>2) && print STDERR "procdata_router: varalias: $varalias\n"; my $i = 0; foreach ( @{$nvarval{$v}} ) { print "$varalias $_ VALUE $ifDescr[$i++]\n" ; } } + elsif ($var =~ /Octets|Pkts|Errors/) # extract rates { if (! defined(@{$prev_varval{$d,$v}}) ) { # store prev val first @{$prev_varval{$d, $v}} = @{$nvarval{$v}} ; # store new values next; } + ($debug>2) && print STDERR "procdata_router: var: $var\n"; + # subtract old values from new values my @deltaval = &vector_calc( \ at {$nvarval{$v}} , "-" , \ at {$prev_varval{$d,$v}} ); if ($#deltaval >= 0) { + ($debug>2) && print STDERR "procdata_router: dtime: $dtime\n"; my @deltarate = &vector_calc(\ at deltaval, "/", \$dtime); # shorten the prefix my ($varalias) = ( $var =~ /^.*(\.[^.]+)$/ ) ; $varalias = $mibalias{router} . $varalias ; + ($debug>2) && print STDERR "procdata_router: varalias: $varalias\n"; my $i = 0; foreach (@deltarate) { - print "$varalias $_ RATE-sec $ifDescr[$i++]\n" ; + ($debug>2) && print STDERR "$varalias $_ RATE-sec $ifDescr[$i]\n"; + print "$varalias $_ RATE-sec $ifDescr[$i++]\n"; } if ($var =~ /Octets/) # extract bandwidth utilized { $i = 0; - $varalias =~ s/Octets/BW/ ; - print "VARIABLE $varalias VALUE\n" ; + $varalias =~ s/Octets/BW/; + #print "VARIABLE $varalias VALUE\n"; + ($debug>2) && print STDERR "VARIABLE $varalias VALUE\n"; foreach (@deltarate) { - printf "$varalias %d VALUE $ifDescr[$i]\n", - int(($_ * 8 * 100) / $ifSpeed[$i++]); # percentage + if ($ifSpeed[$i] > 0) { # calc percentage util + printf "$varalias %d VALUE $ifDescr[$i]\n", + int(($_ * 8 * 100) / $ifSpeed[$i++]); + } else { # can't div by 0; "util" = ifSpeed + printf "$varalias %d VALUE $ifDescr[$i]\n", $ifSpeed[$i++]; + } } } } # end if(size != 0) + else { ($debug>2) && + print STDERR "procdata_router: last element of deltaval: $#deltaval\n"} } + else { ($debug>2) && + print STDERR "procdata_router: unknown var: $var\n"} @{$prev_varval{$d, $v}} = @{$nvarval{$v}} ; # store new values @@ -579,6 +618,10 @@ else { @vecb = @$b; } if ($debug > 1) {print STDERR "vector_calc: To do operation $op\n" ; } + if ($debug > 2) { + print STDERR "vector_calc: veca = ", join (", ", @veca), "\n" ; + print STDERR "vector_calc: vecb = ", join (", ", @vecb), "\n" ; + } # Remember that perl array indexes start from 0 (none = -1) if ($#veca < 0 || $#vecb < 0) {return @result; } @@ -633,18 +676,19 @@ { $startdevices = 1; next ; } next if (! $startdevices); # skip all lines until STARTDEVICES + ($debug>2) && print STDERR "readconfig: device def: $_\n" ; if ( /^\s*(\S+)\s+(\S+)\s+(\S+.*$)/ ) - { + { push (@devices, "$1"); $d = &toindex("$1"); $cid{$d}= "$2"; # remaining are device types foreach $typ (split(/[ ,\t\n]+/, $3)) { - # $debug && print STDERR "Dev types $typ\n"; + ($debug>2) && print STDERR "readconfig: dev type: $typ\n"; if ($istype{$typ}) { $isdevtypes{$d, $typ} = 1; - foreach $v ( @{$typevars{$typ}} ) { - # $debug && print STDERR " $v\n"; + foreach $v ( @{$typevars{$typ}} ) { + ($debug>2) && print STDERR "readconfig: devvar: $v\n"; push (@{$devvars{$d}}, "$v"); } } @@ -701,7 +745,7 @@ } # end: while(CMD) close (CMD); - $debug && print STDERR "(dbg) doping return for $rhost =$value\n" ; + $debug && print STDERR "(debug) doping return for $rhost =$value\n" ; return ($value); } # end doping() @@ -717,17 +761,17 @@ my $cmd = "$snmpwalk $device $cid{$d} $var"; @{$nvarval{$v}} = () ; # init to empty array - if ($debug > 2) {print STDERR " (debug) running $cmd\n";} - open (CMD, "$cmd |") ; + if ($debug > 2) {print STDERR "get_snmpdata: running '$cmd'\n";} + open (CMD, "$cmd |"); while (<CMD>) { - # if ($debug > 1) {print STDERR "(debug) CMD output= $_";} + ($debug > 1) && print STDERR "get_snmpdata: CMD output= $_"; chomp; # if (/^\s*\S+:(\D*|\s*)(\d+)(\D*|\s*)$/) { # extract number # if (/^[A-Z]+\s*\D+:\s*(\S+.*)\s*$/) { # any non-space value if (/^Name:\s+(\S+)\s+\-\>\s+.+\S:\s+(.*)$/) { my $val = $2; push ( @{$nvarval{$v}}, "$val" ); - # if ($debug > 1) print STDERR "val is $val\n"; # + ($debug > 1) && print STDERR "get_snmpdata: val is $val\n"; } elsif (/^\s*End\s*.+requested\s*OID/i) { # normal exit last; @@ -742,7 +786,6 @@ print STDERR "Stored nvarval{$var} = ", join (" ", @{$nvarval{$v}}), "\n"; } # foreach $var - } ## Die on getting a terminate signal. Clean up data files. @@ -790,8 +833,12 @@ print "TIME $testtime ", scalar(localtime), "\n"; print "DEVICE $dev\n"; get_snmpdata($dev); + ($debug>2) && print STDERR "old prevtime{$d}, testtime: $prevtime{$d}, $testtime\n"; + + $prevtime{$d} = $testtime; # ASSERT: prevtime{d} contains time of + # last poll $testtime = int((time + $testtime) / 2); # take average - $prevtime{$d} = $testtime ; + ($debug>2) && print STDERR "new prevtime{$d}, testtime: $prevtime{$d}, $testtime\n"; # process each type of variable for the device foreach my $typ (@devicetypes) { @@ -806,4 +853,3 @@ $debug && print STDERR "Sleeping for $sleeptime...\n"; sleep $sleeptime ; } # end while(1) - -- Darin Davis Email: darin davis at callisma.com Sr. Consultant Pager: darin davis at page.callisma.com Callisma - Emeryville Vmail: 925-480-2319 x1404 EFax: 603-697-0062 |