[nagiosplug] Fix performance data label containing spaces in ...

"Nagios Plugin Development" <[email protected]> Tue, 26 Jun 2012 19:10:14 +0000
Newsgroups gmane.network.nagios.plugins.cvs
Message-ID <[email protected]>
 Module: nagiosplug
 Branch: master
 Commit: 9c886d049d1dec9be0ac147c57d2094d2d4773da
 Author: Sven Nierlein <[email protected]>
   Date: Tue Jun 26 20:53:13 2012 +0200
    URL: http://nagiosplug.git.sf.net/git/gitweb.cgi?p=nagiosplug/nagiosplug;a=commit;h=9c886d0

Fix performance data label containing spaces in check_snmp (Jochen Bern)

Add --perf-oids option for check_snmp to retain optional 1.4.14 compatibility

---

 NEWS                       |    2 ++
 THANKS.in                  |    1 +
 plugins/check_snmp.c       |   26 +++++++++++++++++++++++---
 plugins/tests/check_snmp.t |   23 ++++++++++++++++++++++-
 4 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/NEWS b/NEWS
index 686fb82..aeca4f7 100644
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,7 @@ This file documents the major additions and syntax changes between releases.
 	Add perfdata to check_disk_smb (Debian #654259 - Charles-Henri Larose)
 	Updated Nagios::Plugin perl module
 	Add warning threshold to certificate expiration checks of check_tcp/http/smtp (William Leibzon)
+	Add --perf-oids option for check_snmp (Jochen Bern)
 
 	FIXES
 	Fix check_disk free space calculation if blocksizes differ within a disk group (Bekar - #2973603)
@@ -28,6 +29,7 @@ This file documents the major additions and syntax changes between releases.
 	Fix check_ping's parsing of ping6(1) output (#1894850, Debian #514588, Debian #662638 - Matej Vela)
 	Fix a check_dhcp bug which was triggered by checking Windows 2003 DHCP servers (#3503921)
 	Disable RFC4507 support, to work around SSL negotiation issues with (at least) some Tomcat versions
+	Fix performance data label containing spaces in check_snmp (Jochen Bern)
 
 1.4.15 27th July 2010
 	ENHANCEMENTS
diff --git a/THANKS.in b/THANKS.in
index f647a0c..018738e 100644
--- a/THANKS.in
+++ b/THANKS.in
@@ -273,3 +273,4 @@ Jason Ellison
 Charles-Henri Larose
 Tobias Brox
 William Leibzon
+Jochen Bern
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c
index 4cd3805..51ad6f4 100644
--- a/plugins/check_snmp.c
+++ b/plugins/check_snmp.c
@@ -141,6 +141,7 @@ int calculate_rate = 0;
 int rate_multiplier = 1;
 state_data *previous_state;
 double previous_value[MAX_OIDS];
+int perf_labels = 1;
 
 
 int
@@ -169,6 +170,7 @@ main (int argc, char **argv)
 	char *state_string=NULL;
 	size_t response_length, current_length, string_length;
 	char *temp_string=NULL;
+	char *quote_string=NULL;
 	time_t current_time;
 	double temp_double;
 	time_t duration;
@@ -485,11 +487,22 @@ main (int argc, char **argv)
 		ptr = NULL;
 		strtod(show, &ptr);
 		if (ptr > show) {
-			if (nlabels >= (size_t)1 && (size_t)i < nlabels && labels[i] != NULL)
+			if (perf_labels && nlabels >= (size_t)1 && (size_t)i < nlabels && labels[i] != NULL)
 				temp_string=labels[i];
 			else
 				temp_string=oidname;
-			strncat(perfstr, temp_string, sizeof(perfstr)-strlen(perfstr)-1);
+			if (strpbrk (temp_string, " ='\"") == NULL) {
+				strncat(perfstr, temp_string, sizeof(perfstr)-strlen(perfstr)-1);
+			} else {
+				if (strpbrk (temp_string, "\"") == NULL) {
+					quote_string="\"";
+				} else {
+					quote_string="'";
+				}
+				strncat(perfstr, quote_string, sizeof(perfstr)-strlen(perfstr)-1);
+				strncat(perfstr, temp_string, sizeof(perfstr)-strlen(perfstr)-1);
+				strncat(perfstr, quote_string, sizeof(perfstr)-strlen(perfstr)-1);
+			}
 			strncat(perfstr, "=", sizeof(perfstr)-strlen(perfstr)-1);
 			len = sizeof(perfstr)-strlen(perfstr)-1;
 			strncat(perfstr, show, len>ptr-show ? ptr-show : len);
@@ -583,6 +596,7 @@ process_arguments (int argc, char **argv)
 		{"rate", no_argument, 0, L_CALCULATE_RATE},
 		{"rate-multiplier", required_argument, 0, L_RATE_MULTIPLIER},
 		{"invert-search", no_argument, 0, L_INVERT_SEARCH},
+		{"perf-oids", no_argument, 0, 'O'},
 		{0, 0, 0, 0}
 	};
 
@@ -600,7 +614,7 @@ process_arguments (int argc, char **argv)
 	}
 
 	while (1) {
-		c = getopt_long (argc, argv, "nhvVt:c:w:H:C:o:e:E:d:D:s:t:R:r:l:u:p:m:P:L:U:a:x:A:X:",
+		c = getopt_long (argc, argv, "nhvVOt:c:w:H:C:o:e:E:d:D:s:t:R:r:l:u:p:m:P:L:U:a:x:A:X:",
 									 longopts, &option);
 
 		if (c == -1 || c == EOF)
@@ -798,6 +812,9 @@ process_arguments (int argc, char **argv)
 		case L_INVERT_SEARCH:
 			invert_search=1;
 			break;
+		case 'O':
+			perf_labels=0;
+			break;
 		}
 	}
 
@@ -1063,6 +1080,9 @@ print_help (void)
 	printf (" %s\n", "-e, --retries=INTEGER");
 	printf ("    %s\n", _("Number of retries to be used in the requests"));
 
+	printf (" %s\n", "-O, --perf-oids");
+	printf ("    %s\n", _("Label performance data with OIDs instead of --label's"));
+
 	printf (UT_VERBOSE);
 
 	printf ("\n");
diff --git a/plugins/tests/check_snmp.t b/plugins/tests/check_snmp.t
index 2645cc1..7a5a8b3 100755
--- a/plugins/tests/check_snmp.t
+++ b/plugins/tests/check_snmp.t
@@ -8,7 +8,7 @@ use Test::More;
 use NPTest;
 use FindBin qw($Bin);
 
-my $tests = 41;
+my $tests = 51;
 # Check that all dependent modules are available
 eval {
 	require NetSNMP::OID;
@@ -144,6 +144,27 @@ is($res->return_code, 0, "OK as no thresholds" );
 is($res->output, "SNMP RATE OK - inoctets 333 | inoctets=333 ", "Check rate decreases due to longer interval");
 
 
+# label performance data check
+$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 -l test" );
+is($res->return_code, 0, "OK as no thresholds" );
+is($res->output, "SNMP OK - test 67996 | test=67996c ", "Check label");
+
+$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 -l \"test'test\"" );
+is($res->return_code, 0, "OK as no thresholds" );
+is($res->output, "SNMP OK - test'test 68662 | \"test'test\"=68662c ", "Check label");
+
+$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 -l 'test\"test'" );
+is($res->return_code, 0, "OK as no thresholds" );
+is($res->output, "SNMP OK - test\"test 69328 | 'test\"test'=69328c ", "Check label");
+
+$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 -l test -O" );
+is($res->return_code, 0, "OK as no thresholds" );
+is($res->output, "SNMP OK - test 69994 | iso.3.6.1.4.1.8072.3.2.67.10=69994c ", "Check label");
+
+$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" );
+is($res->return_code, 0, "OK as no thresholds" );
+is($res->output, "SNMP OK - 70660 | iso.3.6.1.4.1.8072.3.2.67.10=70660c ", "Check label");
+
 
 $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 -l inoctets_per_minute --rate-multiplier=60" );
 is($res->return_code, 0, "OK for first call" );


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/