diff options
author | nagios <nagios@opsviewdev32.(none)> | 2010-11-15 15:43:41 (GMT) |
---|---|---|
committer | nagios <nagios@opsviewdev32.(none)> | 2010-11-15 15:43:41 (GMT) |
commit | 896962a1ad1b7d7c75d42c565b06cc799feb0a7c (patch) | |
tree | 12723ac6ebc1f99109a03a938602a4719a0622e5 | |
parent | e7ac2e68c9524ffed4046559fef0b545785e64a0 (diff) | |
download | monitoring-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-- | NEWS | 4 | ||||
-rw-r--r-- | plugins/check_snmp.c | 14 | ||||
-rwxr-xr-x | plugins/tests/check_snmp.t | 17 | ||||
-rw-r--r-- | plugins/tests/check_snmp_agent.pl | 6 |
4 files changed, 37 insertions, 4 deletions
@@ -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 | ||
7 | 1.4.15 27th July 2010 | 11 | 1.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 | ||
54 | my $tests = 33; | 54 | my $tests = 41; |
55 | if (-x "./check_snmp") { | 55 | if (-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 | |||
170 | is($res->return_code, 0, "OK as string doesn't match but inverted" ); | 170 | is($res->return_code, 0, "OK as string doesn't match but inverted" ); |
171 | is($res->output, 'SNMP OK - "stringtests" | ', "OK as inverted string no match" ); | 171 | is($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" ); | ||
174 | is($res->return_code, 0, "Numeric in string test" ); | ||
175 | is($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" ); | ||
178 | is($res->return_code, 1, "Numeric in string test" ); | ||
179 | is($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" ); | ||
182 | is($res->return_code, 0, "Not really numeric test" ); | ||
183 | is($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" ); | ||
186 | is($res->return_code, 0, "Not really numeric test (trying best to fool it)" ); | ||
187 | is($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:\\'; | |||
33 | my $multilin5 = 'And now have fun with with this: "C:\\" | 33 | my $multilin5 = 'And now have fun with with this: "C:\\" |
34 | because we\'re not done yet!'; | 34 | because we\'re not done yet!'; |
35 | 35 | ||
36 | my @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); | 36 | my @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 ); |
37 | my @values = ($multiline, $multilin2, $multilin3, $multilin4, $multilin5, 4294965296, 1000, 4294965296, uint64("18446744073709351616"), int(rand(2**32)), 64000, "stringtests"); | 37 | my @values = ($multiline, $multilin2, $multilin3, $multilin4, $multilin5, 4294965296, 1000, 4294965296, uint64("18446744073709351616"), int(rand(2**32)), 64000, "stringtests", "3.5", "87.4startswithnumberbutshouldbestring", '555"I said"' ); |
38 | my @incrts = (undef, undef, undef, undef, undef, 1000, -500, 1000, 100000, undef, 666, undef); | 38 | my @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 |
41 | my $oidelts; | 41 | my $oidelts; |