[PATCH 1/4] 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

nagios (none) nagios at opsviewdev32.
Mon Nov 15 15:43:41 UTC 2010


---
 NEWS                              |    7 +++++++
 plugins/check_snmp.c              |   14 ++++++++++++++
 plugins/tests/check_snmp.t        |   17 ++++++++++++++++-
 plugins/tests/check_snmp_agent.pl |    6 +++---
 4 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/NEWS b/NEWS
index ff92401..659bd2d 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,12 @@
 This file documents the major additions and syntax changes between releases.
 
+ ...
+
+	FIXES
+	check_snmp now attempts to convert string responses into a double value. If the full string is a value,
+	  check_snmp will consider it a numeric value and thus apply threshold checks and return performance data.
+	  This reverts back to 1.4.14 behaviour with strings
+
 1.4.15 27th July 2010
 	ENHANCEMENTS
 	New check_ntp_peer -m and -n options to check the number of usable time sources ("truechimers")
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)
 	char *outbuff;
 	char *ptr = NULL;
 	char *show = NULL;
+	char *endptr = NULL;
 	char *th_warn=NULL;
 	char *th_crit=NULL;
 	char type[8] = "";
@@ -395,6 +396,19 @@ main (int argc, char **argv)
 				}
 			}
 
+			/* Allow numeric conversion if whole string is a number. Make concession for strings with " at beginning or end */
+			/* This duplicates the conversion a bit later, but is cleaner to separate out the checking against the conversion */
+			ptr = show;
+			if (*ptr == '"')
+				ptr++;
+			if (*ptr != '\0' ) {
+				strtod( ptr, &endptr );
+				if (*endptr == '"')
+					endptr++;
+				if (*endptr == '\0')
+					is_numeric=1;
+			}
+
 		}
 		else if (strstr (response, "Timeticks: "))
 			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") {
 	}
 }
 
-my $tests = 33;
+my $tests = 41;
 if (-x "./check_snmp") {
 	plan tests => $tests;
 } else {
@@ -170,5 +170,20 @@ $res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1
 is($res->return_code, 0, "OK as string doesn't match but inverted" );
 is($res->output, 'SNMP OK - "stringtests" | ', "OK as inverted string no match" );
 
+$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" );
+is($res->return_code, 0, "Numeric in string test" );
+is($res->output, 'SNMP OK - 3.5 | iso.3.6.1.4.1.8072.3.2.67.12=3.5 ', "Check seen as numeric" );
+
+$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" );
+is($res->return_code, 1, "Numeric in string test" );
+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" );
+
+$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" );
+is($res->return_code, 0, "Not really numeric test" );
+is($res->output, 'SNMP OK - "87.4startswithnumberbutshouldbestring" | ', "Check string with numeric start is still string" );
+
+$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" );
+is($res->return_code, 0, "Not really numeric test (trying best to fool it)" );
+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)" );
 
 
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:\\';
 my $multilin5 = 'And now have fun with with this: "C:\\"
 because we\'re not done yet!';
 
-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);
-my @values = ($multiline, $multilin2, $multilin3, $multilin4, $multilin5, 4294965296, 1000, 4294965296, uint64("18446744073709351616"), int(rand(2**32)), 64000, "stringtests");
-my @incrts = (undef, undef, undef, undef, undef, 1000, -500, 1000, 100000, undef, 666, undef);
+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 );
+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"' );
+my @incrts = (undef, undef, undef, undef, undef, 1000, -500, 1000, 100000, undef, 666, undef, undef, undef, undef );
 
 # Number of elements in our OID
 my $oidelts;
-- 
1.7.3.2


--------------090703020403040209050707
Content-Type: text/x-patch;
 name="0002-check_snmp-Remove-that-is_numeric-madness.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename*0="0002-check_snmp-Remove-that-is_numeric-madness.patch"



More information about the Pkg-nagios-devel mailing list