fix some regressions with check_snmp
This commit is contained in:
parent
b30adca432
commit
6c76d84654
10
debian/changelog
vendored
10
debian/changelog
vendored
|
@ -1,4 +1,4 @@
|
|||
nagios-plugins (1.4.15-3) UNRELEASED; urgency=low
|
||||
nagios-plugins (1.4.15-3) unstable; urgency=low
|
||||
|
||||
* Add 10_check_disk_smb_spaces.dpatch from upstream svn (Closes: #601699),
|
||||
thanks to Adam Buchbinder
|
||||
|
@ -6,8 +6,14 @@ nagios-plugins (1.4.15-3) UNRELEASED; urgency=low
|
|||
(Closes: #601696), thanks to Adam Buchbinder
|
||||
* Fix broken symlink of README.Debian.plugins (Closes: #603414), thanks
|
||||
Bernd Zeimetz
|
||||
* Add patches provided by upstream to fix regressions with check_snmp
|
||||
introduced in 1.4.15 (Closes: 607736)
|
||||
- 12_check_snmp_01_strings.dpatch
|
||||
- 12_check_snmp_02_numeric.dpatch
|
||||
- 12_check_snmp_03_state_based.dpatch
|
||||
- 12_check_snmp_04_strings.dpatch
|
||||
|
||||
-- Jan Wagner <waja@cyconet.org> Thu, 23 Sep 2010 11:24:55 +0200
|
||||
-- Jan Wagner <waja@cyconet.org> Wed, 22 Dec 2010 00:43:02 +0100
|
||||
|
||||
nagios-plugins (1.4.15-2) unstable; urgency=low
|
||||
|
||||
|
|
4
debian/patches/00list
vendored
4
debian/patches/00list
vendored
|
@ -4,3 +4,7 @@
|
|||
05_check_linux_raid_fix_striped.dpatch
|
||||
10_check_disk_smb_spaces.dpatch
|
||||
11_check_disk_smb_NT_STATUS_ACCESS_DENIED.dpatch
|
||||
12_check_snmp_01_strings.dpatch
|
||||
12_check_snmp_02_numeric.dpatch
|
||||
12_check_snmp_03_state_based.dpatch
|
||||
12_check_snmp_04_strings.dpatch
|
||||
|
|
100
debian/patches/12_check_snmp_01_strings.dpatch
vendored
Normal file
100
debian/patches/12_check_snmp_01_strings.dpatch
vendored
Normal file
|
@ -0,0 +1,100 @@
|
|||
#! /bin/sh /usr/share/dpatch/dpatch-run
|
||||
## 12_check_snmp_01_strings.dpatch by
|
||||
## Thomas Guyot-Sionnest <dermoth@aei.ca>
|
||||
##
|
||||
## From 4d1cd3a7dc2754f4fb69f2a80ce4e2a027f180a3 Mon Sep 17 00:00:00 2001
|
||||
## From: nagios <nagios@opsviewdev32.(none)>
|
||||
## Date: Mon, 15 Nov 2010 15:43:41 +0000
|
||||
## Subject: [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
|
||||
## (Debian Bug #607736)
|
||||
##
|
||||
## DP: Now considers strings returned by SNMP that contain just numbers
|
||||
|
||||
@DPATCH@
|
||||
|
||||
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
|
||||
|
113
debian/patches/12_check_snmp_02_numeric.dpatch
vendored
Normal file
113
debian/patches/12_check_snmp_02_numeric.dpatch
vendored
Normal file
|
@ -0,0 +1,113 @@
|
|||
#! /bin/sh /usr/share/dpatch/dpatch-run
|
||||
## 12_check_snmp_02_numeric.dpatch by
|
||||
## Thomas Guyot-Sionnest <dermoth@aei.ca>
|
||||
##
|
||||
## From c5b1568481420caaee4b898ebf0110e93e2d4be1 Mon Sep 17 00:00:00 2001
|
||||
## From: Thomas Guyot-Sionnest <dermoth@aei.ca>
|
||||
## Date: Tue, 30 Nov 2010 21:02:23 -0500
|
||||
## Subject: [PATCH 2/4] check_snmp: Remove that is_numeric madness
|
||||
## (Debian Bug #607736)
|
||||
##
|
||||
## Original patch to make Timeticks works as in check_snmp v1.4.14, it turns
|
||||
## out is_numeric isn't so useful and treating all types as numeric works
|
||||
## best for backwards-compatibility. This is how it used to work in 1.4.14.
|
||||
##
|
||||
## As a special case, I also make calculate_rate look up for numeric values
|
||||
## as it would otherwise return the last value instead.
|
||||
##
|
||||
## DP: Remove that is_numeric madness
|
||||
|
||||
@DPATCH@
|
||||
|
||||
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c
|
||||
index 9d91942..cb7fb7a 100644
|
||||
--- a/plugins/check_snmp.c
|
||||
+++ b/plugins/check_snmp.c
|
||||
@@ -170,7 +170,6 @@ main (int argc, char **argv)
|
||||
char *state_string=NULL;
|
||||
size_t response_length, current_length, string_length;
|
||||
char *temp_string=NULL;
|
||||
- int is_numeric=0;
|
||||
time_t current_time;
|
||||
double temp_double;
|
||||
time_t duration;
|
||||
@@ -336,29 +335,24 @@ main (int argc, char **argv)
|
||||
/* We strip out the datatype indicator for PHBs */
|
||||
if (strstr (response, "Gauge: ")) {
|
||||
show = strstr (response, "Gauge: ") + 7;
|
||||
- is_numeric++;
|
||||
}
|
||||
else if (strstr (response, "Gauge32: ")) {
|
||||
show = strstr (response, "Gauge32: ") + 9;
|
||||
- is_numeric++;
|
||||
}
|
||||
else if (strstr (response, "Counter32: ")) {
|
||||
show = strstr (response, "Counter32: ") + 11;
|
||||
- is_numeric++;
|
||||
is_counter=1;
|
||||
if(!calculate_rate)
|
||||
strcpy(type, "c");
|
||||
}
|
||||
else if (strstr (response, "Counter64: ")) {
|
||||
show = strstr (response, "Counter64: ") + 11;
|
||||
- is_numeric++;
|
||||
is_counter=1;
|
||||
if(!calculate_rate)
|
||||
strcpy(type, "c");
|
||||
}
|
||||
else if (strstr (response, "INTEGER: ")) {
|
||||
show = strstr (response, "INTEGER: ") + 9;
|
||||
- is_numeric++;
|
||||
}
|
||||
else if (strstr (response, "STRING: ")) {
|
||||
show = strstr (response, "STRING: ") + 8;
|
||||
@@ -410,15 +404,17 @@ main (int argc, char **argv)
|
||||
}
|
||||
|
||||
}
|
||||
- else if (strstr (response, "Timeticks: "))
|
||||
+ else if (strstr (response, "Timeticks: ")) {
|
||||
show = strstr (response, "Timeticks: ");
|
||||
+ }
|
||||
else
|
||||
show = response;
|
||||
|
||||
iresult = STATE_DEPENDENT;
|
||||
|
||||
/* Process this block for numeric comparisons */
|
||||
- if (is_numeric) {
|
||||
+ /* Make some special values,like Timeticks numeric only if a threshold is defined */
|
||||
+ if (thlds[i]->warning || thlds[i]->critical || calculate_rate) {
|
||||
ptr = strpbrk (show, "0123456789");
|
||||
if (ptr == NULL)
|
||||
die (STATE_UNKNOWN,_("No valid data returned"));
|
||||
diff --git a/plugins/t/check_snmp.t b/plugins/t/check_snmp.t
|
||||
index 004ba1a..25a2999 100644
|
||||
--- a/plugins/t/check_snmp.t
|
||||
+++ b/plugins/t/check_snmp.t
|
||||
@@ -8,7 +8,7 @@ use strict;
|
||||
use Test::More;
|
||||
use NPTest;
|
||||
|
||||
-my $tests = 8+38+2+2;
|
||||
+my $tests = 8+42+2+2;
|
||||
plan tests => $tests;
|
||||
my $res;
|
||||
|
||||
@@ -124,6 +124,13 @@ SKIP: {
|
||||
cmp_ok( $res->return_code, '==', 0, "Skipping all thresholds");
|
||||
like($res->output, '/^SNMP OK - \d+ \w+ \d+\s.*$/', "Skipping all thresholds, result printed rather than parsed");
|
||||
|
||||
+ $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 1000000000: -u '1/100 sec'");
|
||||
+ cmp_ok( $res->return_code, '==', 2, "Timetick used as a threshold");
|
||||
+ like($res->output, '/^SNMP CRITICAL - \*\d+\* 1\/100 sec.*$/', "Timetick used as a threshold, parsed as numeric");
|
||||
+
|
||||
+ $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0");
|
||||
+ cmp_ok( $res->return_code, '==', 0, "Timetick used as a string");
|
||||
+ like($res->output, '/^SNMP OK - Timeticks:\s\(\d+\)\s+(?:\d+ days?,\s+)?\d+:\d+:\d+\.\d+\s.*$/', "Timetick used as a string, result printed rather than parsed");
|
||||
}
|
||||
|
||||
# These checks need a complete command line. An invalid community is used so
|
||||
--
|
||||
1.7.3.2
|
||||
|
40
debian/patches/12_check_snmp_03_state_based.dpatch
vendored
Normal file
40
debian/patches/12_check_snmp_03_state_based.dpatch
vendored
Normal file
|
@ -0,0 +1,40 @@
|
|||
#! /bin/sh /usr/share/dpatch/dpatch-run
|
||||
## 12_check_snmp_03_state_based.dpatch by
|
||||
## Thomas Guyot-Sionnest <dermoth@aei.ca>
|
||||
##
|
||||
## From ffadb45f924aa2ba9792963bdc64d798841b9e7b Mon Sep 17 00:00:00 2001
|
||||
## From: Thomas Guyot-Sionnest <dermoth@aei.ca>
|
||||
## Date: Tue, 30 Nov 2010 22:28:19 -0500
|
||||
## Subject: [PATCH 3/4] State-based tests enhancements
|
||||
## (Debian Bug #607736)
|
||||
##
|
||||
## DP: State-based tests enhancements
|
||||
|
||||
@DPATCH@
|
||||
|
||||
diff --git a/plugins/tests/check_snmp.t b/plugins/tests/check_snmp.t
|
||||
index 08348d2..6966838 100755
|
||||
--- a/plugins/tests/check_snmp.t
|
||||
+++ b/plugins/tests/check_snmp.t
|
||||
@@ -51,6 +51,9 @@ if ($ARGV[0] && $ARGV[0] eq "-d") {
|
||||
}
|
||||
}
|
||||
|
||||
+# We should merge that with $ENV{'NPTEST_CACHE'}, use one dir for all test data
|
||||
+$ENV{'NAGIOS_PLUGIN_STATE_DIRECTORY'} ||= "/var/tmp";
|
||||
+
|
||||
my $tests = 41;
|
||||
if (-x "./check_snmp") {
|
||||
plan tests => $tests;
|
||||
@@ -106,7 +109,7 @@ like($res->output, '/'.quotemeta('SNMP OK - And now have fun with with this: \"C
|
||||
"And now have fun with with this: \"C:\\\\\"
|
||||
because we\'re not done yet!"').'/m', "Attempt to confuse parser No.3");
|
||||
|
||||
-system("rm /usr/local/nagios/var/check_snmp/*");
|
||||
+system("rm -f ".$ENV{'NAGIOS_PLUGIN_STATE_DIRECTORY'}."/check_snmp/*");
|
||||
$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.10 --rate -w 600" );
|
||||
is($res->return_code, 0, "Returns OK");
|
||||
is($res->output, "No previous data to calculate rate - assume okay");
|
||||
--
|
||||
1.7.3.2
|
||||
|
73
debian/patches/12_check_snmp_04_strings.dpatch
vendored
Normal file
73
debian/patches/12_check_snmp_04_strings.dpatch
vendored
Normal file
|
@ -0,0 +1,73 @@
|
|||
#! /bin/sh /usr/share/dpatch/dpatch-run
|
||||
## 12_check_snmp_04_strings.dpatch by
|
||||
## Thomas Guyot-Sionnest <dermoth@aei.ca>
|
||||
##
|
||||
## From 78b0f30ad6f562e5b4b10c50857143f959a6c754 Mon Sep 17 00:00:00 2001
|
||||
## From: Thomas Guyot-Sionnest <dermoth@aei.ca>
|
||||
## Date: Tue, 30 Nov 2010 22:48:43 -0500
|
||||
## Subject: [PATCH 4/4] Revert "check_snmp now considers strings returned by SNMP that contain just"
|
||||
## (Debian Bug #607736)
|
||||
##
|
||||
## DP: Revert "check_snmp now considers strings returned by SNMP that contain just"
|
||||
|
||||
@DPATCH@
|
||||
|
||||
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c
|
||||
index cb7fb7a..d79da8c 100644
|
||||
--- a/plugins/check_snmp.c
|
||||
+++ b/plugins/check_snmp.c
|
||||
@@ -160,7 +160,6 @@ 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] = "";
|
||||
@@ -390,19 +389,6 @@ 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 6966838..c960f7b 100755
|
||||
--- a/plugins/tests/check_snmp.t
|
||||
+++ b/plugins/tests/check_snmp.t
|
||||
@@ -54,7 +54,7 @@ if ($ARGV[0] && $ARGV[0] eq "-d") {
|
||||
# We should merge that with $ENV{'NPTEST_CACHE'}, use one dir for all test data
|
||||
$ENV{'NAGIOS_PLUGIN_STATE_DIRECTORY'} ||= "/var/tmp";
|
||||
|
||||
-my $tests = 41;
|
||||
+my $tests = 39;
|
||||
if (-x "./check_snmp") {
|
||||
plan tests => $tests;
|
||||
} else {
|
||||
@@ -173,10 +173,6 @@ $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" );
|
||||
--
|
||||
1.7.3.2
|
||||
|
Loading…
Reference in a new issue