Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re: What did I miss in my test condition?

by hbm (Hermit)
on Aug 10, 2012 at 23:15 UTC ( #986836=note: print w/ replies, xml ) Need Help??


in reply to What did I miss in my test condition?

I believe your if-else is flawed:

if ($score > $warnrate) { print "OK, rf is $score. \|Mbps=$score\n"; exit 0 # $score is necessarily <= $warnrate at this point #} elsif (($score <= $warnrate) && ($score > $critrate)) { } elsif ($score > $critrate) { print "WARNING, rf is $score. \|Mbps=$score\n"; exit 1 # $score is necessarily <= $critrate at this point #} elsif ($score <= $critrate) { } else { print "CRITICAL, rf is $score. \|Mbps=$score\n"; exit 2 # should never reach this point } else { print "UNKNOWN, rf is $score and something is wrong.\n"; exit 3 }

Also, your open DATA; while(<DATA>); close DATA seems odd. I haven't used snmpwalk before, and just tried without success; but I wonder if you can't just:

my $line = `/usr/bin/snmpwalk -v1 -c public $radio .1.3.6.1.4.1.5 +454.1.40.2.4.0`; my @values = split(' ', $line); my $score = $values[3]; if ...


Comment on Re: What did I miss in my test condition?
Select or Download Code
Re^2: What did I miss in my test condition?
by jimbass (Novice) on Aug 11, 2012 at 05:42 UTC
    My hope with the test conditions was that if $score was null/undefined (say from a timeout), it would fail the numeric tests, and trigger the undefined answer. Obviously that isn't the case. In the general sense $score should be a number and come up with an exit code of 0, 1, or 2, but I don't test to be certain the $score is numeric. Maybe that would be the preferred case, if $score is undefined, immeidately exit with exit code 3. Seems that is a good way to handle it, thanks for your insight! If you're ever in the NYC area, I owe you a beer! This code exits as I had hoped:
    #!/usr/bin/perl -w use strict; my $radio = $ARGV[0]; my $warnrate = $ARGV[1]; my $critrate = $ARGV[2]; my $line = `/usr/bin/snmpwalk -v1 -c PTsnmp $radio .1.3.6.1.4.1.5454.1 +.40.2.4.0`; if ($line eq '') { print "snmpwalk returned nothing, timeout likely occurred.\n"; exit 3 } if ($critrate > $warnrate) { print "Make sure your critical value is less than or equal to your war +ning value.\n"; exit 5 } if ($critrate <= $warnrate) { my @values = split(' ', $line); my $score = $values[3]; if ($score > $warnrate) { print "OK, rf is $score. \|Mbps=$score\n"; exit 0 } elsif (($score <= $warnrate) && ($score > $critrate)) { print "WARNING, rf is $score. \|Mbps=$score\n"; exit 1 } elsif ($score <= $critrate) { print "CRITICAL, rf is $score. \|Mbps=$score\n"; exit 2 } }

      I don't think $line will every be empty - you probably ought to chomp it, or test for non-whitespace.

      And you still have unnecessary tests in your if-elsif. For example, if $score is NOT greater-than $warnrate, it IS NECESSARILY less-than-or-equal-to $warnrate.

      Consider:

      use strict; my $radio = $ARGV[0]; my $warnrate = $ARGV[1]; my $critrate = $ARGV[2]; chomp(my $line = `/usr/bin/snmpwalk -v1 -c PTsnmp $radio .1.3.6.1.4.1. +5454.1.40.2.4.0`; if ($line !~ /\S/) { print "snmpwalk returned nothing, timeout likely occurred.\n"; exit 3; } elsif ($critrate > $warnrate) { print "Make sure your critical value is less than or equal to your +warning value.\n"; exit 5; } else { my $score = (split(' ', $line))[3]; my ($msg,$status) = $score > $warnrate ? ('OK',0) : ( $score > $critrate ? ('WARNING',1) : ('CRITICAL',2)); print "$msg, rf is $score. |Mbps=$score\n"; exit $status; }

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://986836]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (7)
As of 2014-12-21 01:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (100 votes), past polls