summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornagios <nagios@opsviewdev32.(none)>2010-11-15 15:43:41 (GMT)
committernagios <nagios@opsviewdev32.(none)>2010-11-15 15:43:41 (GMT)
commit896962a1ad1b7d7c75d42c565b06cc799feb0a7c (patch)
tree12723ac6ebc1f99109a03a938602a4719a0622e5
parente7ac2e68c9524ffed4046559fef0b545785e64a0 (diff)
downloadmonitoring-plugins-896962a1ad1b7d7c75d42c565b06cc799feb0a7c.tar.gz
check_snmp now considers strings returned by SNMP that contain just
numbers (according to strtod) to be a numeric value for threshold and performance data
-rw-r--r--NEWS4
-rw-r--r--plugins/check_snmp.c14
-rwxr-xr-xplugins/tests/check_snmp.t17
-rw-r--r--plugins/tests/check_snmp_agent.pl6
4 files changed, 37 insertions, 4 deletions
diff --git a/NEWS b/NEWS
index c0396c1..0d6d3b0 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,10 @@ This file documents the major additions and syntax changes between releases.
3... 3...
4 ENHANCEMENTS 4 ENHANCEMENTS
5 check_nt UPTIME accepts warning/critical thresholds (Ryan Kelly) 5 check_nt UPTIME accepts warning/critical thresholds (Ryan Kelly)
6 FIXES
7 check_snmp now attempts to convert string responses into a double value. If the full string is a value,
8 check_snmp will consider it a numeric value and thus apply threshold checks and return performance data.
9 This reverts back to 1.4.14 behaviour with strings
6 10
71.4.15 27th July 2010 111.4.15 27th July 2010
8 ENHANCEMENTS 12 ENHANCEMENTS
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c
index f32a26e..9d91942 100644
--- a/plugins/check_snmp.c
+++ b/plugins/check_snmp.c
@@ -160,6 +160,7 @@ main (int argc, char **argv)
160 char *outbuff; 160 char *outbuff;
161 char *ptr = NULL; 161 char *ptr = NULL;
162 char *show = NULL; 162 char *show = NULL;
163 char *endptr = NULL;
163 char *th_warn=NULL; 164 char *th_warn=NULL;
164 char *th_crit=NULL; 165 char *th_crit=NULL;
165 char type[8] = ""; 166 char type[8] = "";
@@ -395,6 +396,19 @@ main (int argc, char **argv)
395 } 396 }
396 } 397 }
397 398
399 /* Allow numeric conversion if whole string is a number. Make concession for strings with " at beginning or end */
400 /* This duplicates the conversion a bit later, but is cleaner to separate out the checking against the conversion */
401 ptr = show;
402 if (*ptr == '"')
403 ptr++;
404 if (*ptr != '\0' ) {
405 strtod( ptr, &endptr );
406 if (*endptr == '"')
407 endptr++;
408 if (*endptr == '\0')
409 is_numeric=1;
410 }
411
398 } 412 }
399 else if (strstr (response, "Timeticks: ")) 413 else if (strstr (response, "Timeticks: "))
400 show = strstr (response, "Timeticks: "); 414 show = strstr (response, "Timeticks: ");
diff --git a/plugins/tests/check_snmp.t b/plugins/tests/check_snmp.t
index e7ad192..08348d2 100755
--- a/plugins/tests/check_snmp.t
+++ b/plugins/tests/check_snmp.t
@@ -51,7 +51,7 @@ if ($ARGV[0] && $ARGV[0] eq "-d") {
51 } 51 }
52} 52}
53 53
54my $tests = 33; 54my $tests = 41;
55if (-x "./check_snmp") { 55if (-x "./check_snmp") {
56 plan tests => $tests; 56 plan tests => $tests;
57} else { 57} else {
@@ -170,5 +170,20 @@ $res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1
170is($res->return_code, 0, "OK as string doesn't match but inverted" ); 170is($res->return_code, 0, "OK as string doesn't match but inverted" );
171is($res->output, 'SNMP OK - "stringtests" | ', "OK as inverted string no match" ); 171is($res->output, 'SNMP OK - "stringtests" | ', "OK as inverted string no match" );
172 172
173$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.12" );
174is($res->return_code, 0, "Numeric in string test" );
175is($res->output, 'SNMP OK - 3.5 | iso.3.6.1.4.1.8072.3.2.67.12=3.5 ', "Check seen as numeric" );
176
177$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.12 -w 4:5" );
178is($res->return_code, 1, "Numeric in string test" );
179is($res->output, 'SNMP WARNING - *3.5* | iso.3.6.1.4.1.8072.3.2.67.12=3.5 ', "WARNING threshold checks for string masquerading as number" );
180
181$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.13" );
182is($res->return_code, 0, "Not really numeric test" );
183is($res->output, 'SNMP OK - "87.4startswithnumberbutshouldbestring" | ', "Check string with numeric start is still string" );
184
185$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.14" );
186is($res->return_code, 0, "Not really numeric test (trying best to fool it)" );
187is($res->output, 'SNMP OK - "555\"I said\"" | ', "Check string with a double quote following is still a string (looks like the perl routine will always escape though)" );
173 188
174 189
diff --git a/plugins/tests/check_snmp_agent.pl b/plugins/tests/check_snmp_agent.pl
index 8784ab1..2ad8516 100644
--- a/plugins/tests/check_snmp_agent.pl
+++ b/plugins/tests/check_snmp_agent.pl
@@ -33,9 +33,9 @@ ends with with this: C:\\';
33my $multilin5 = 'And now have fun with with this: "C:\\" 33my $multilin5 = 'And now have fun with with this: "C:\\"
34because we\'re not done yet!'; 34because we\'re not done yet!';
35 35
36my @fields = (ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_UNSIGNED, ASN_UNSIGNED, ASN_COUNTER, ASN_COUNTER64, ASN_UNSIGNED, ASN_COUNTER, ASN_OCTET_STR); 36my @fields = (ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_UNSIGNED, ASN_UNSIGNED, ASN_COUNTER, ASN_COUNTER64, ASN_UNSIGNED, ASN_COUNTER, ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR, ASN_OCTET_STR );
37my @values = ($multiline, $multilin2, $multilin3, $multilin4, $multilin5, 4294965296, 1000, 4294965296, uint64("18446744073709351616"), int(rand(2**32)), 64000, "stringtests"); 37my @values = ($multiline, $multilin2, $multilin3, $multilin4, $multilin5, 4294965296, 1000, 4294965296, uint64("18446744073709351616"), int(rand(2**32)), 64000, "stringtests", "3.5", "87.4startswithnumberbutshouldbestring", '555"I said"' );
38my @incrts = (undef, undef, undef, undef, undef, 1000, -500, 1000, 100000, undef, 666, undef); 38my @incrts = (undef, undef, undef, undef, undef, 1000, -500, 1000, 100000, undef, 666, undef, undef, undef, undef );
39 39
40# Number of elements in our OID 40# Number of elements in our OID
41my $oidelts; 41my $oidelts;