[nagiosplug] Attempt at fixing check_snmp multiline output:

"Thomas Guyot-Sionnest" <[email protected]>
Newsgroups gmane.network.nagios.plugins.cvs
Message-ID <[email protected]>
 Module: nagiosplug
 Branch: master
 Commit: 582034478b3ac7995f01a5f639c8d0604f3f432b
 Author: Thomas Guyot-Sionnest <[email protected]>
   Date: Thu Sep 17 00:49:56 2009 -0400
    URL: http://nagiosplug.git.sf.net/git/gitweb.cgi?p=nagiosplug/nagiosplug;a=commit;h=5820344

Attempt at fixing check_snmp multiline output:

This patch tries to detect and output nicely multi-line strings. This
method is broken by design; only a count of double-quotes and escapes
could work in every situation.

---

 plugins/check_snmp.c              |   20 +++++++++++++++++---
 plugins/tests/check_snmp_agent.pl |   21 +++++++++++++++------
 2 files changed, 32 insertions(+), 9 deletions(-)

diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c
index f04ca85..19f78d0 100644
--- a/plugins/check_snmp.c
+++ b/plugins/check_snmp.c
@@ -117,7 +117,7 @@ int needmibs = FALSE;
 int
 main (int argc, char **argv)
 {
-	int i, len;
+	int i, len, line;
 	int iresult = STATE_UNKNOWN;
 	int result = STATE_UNKNOWN;
 	int return_code = 0;
@@ -126,6 +126,7 @@ main (int argc, char **argv)
 	char *cl_hidden_auth = NULL;
 	char *oidname = NULL;
 	char *response = NULL;
+	char *mult_resp = NULL;
 	char *outbuff;
 	char *ptr = NULL;
 	char *show = NULL;
@@ -249,10 +250,10 @@ main (int argc, char **argv)
 		}
 	}
 
-	for (i = 0; i < chld_out.lines; i++) {
+	for (line=0, i=0; line < chld_out.lines; line++, i++) {
 		const char *conv = "%.0f";
 
-		ptr = chld_out.line[i];
+		ptr = chld_out.line[line];
 		oidname = strpcpy (oidname, ptr, delimiter);
 		response = strstr (ptr, delimiter);
 		if (response == NULL)
@@ -283,6 +284,18 @@ main (int argc, char **argv)
 		else if (strstr (response, "STRING: ")) {
 			show = strstr (response, "STRING: ") + 8;
 			conv = "%.10g";
+			/* Get the rest of the string on multi-line strings */
+			if (show[0] == '"' && (response[strlen(response)-1] != '\"' || response[strlen(response)-2] != '\\')) {
+				/* Strip out unmatched double-quote */
+				if (show[0] == '"') show++;
+				if (!mult_resp) mult_resp = strdup("");
+				asprintf (&mult_resp, "%s%s:\n%s\n", mult_resp, oids[i], strstr (response, "STRING: ") + 8);
+				for (line++; line < chld_out.lines; line++) {
+					asprintf (&mult_resp, "%s%s\n", mult_resp, chld_out.line[line]);
+					if (mult_resp[strlen(mult_resp)-2] == '"' && response[strlen(response)-2] != '\\') break;
+				}
+			}
+
 		}
 		else if (strstr (response, "Timeticks: "))
 			show = strstr (response, "Timeticks: ");
@@ -367,6 +380,7 @@ main (int argc, char **argv)
 	}
 
 	printf ("%s %s -%s %s \n", label, state_text (result), outbuff, perfstr);
+	if (mult_resp) printf ("%s", mult_resp);
 
 	return result;
 }
diff --git a/plugins/tests/check_snmp_agent.pl b/plugins/tests/check_snmp_agent.pl
index d1ff6d0..302ba6e 100644
--- a/plugins/tests/check_snmp_agent.pl
+++ b/plugins/tests/check_snmp_agent.pl
@@ -18,15 +18,24 @@ if (!$agent) {
 my $baseoid = '.1.3.6.1.4.1.8072.3.2.67';
 # Next are arrays of indexes (Type, initial value and increments)
 # Undef miltipliers are randomized
-my $multiline = "Cisco Internetwork Operating System Software
-IOS (tm) Catalyst 4000 L3 Switch Software (cat4000-I9K91S-M), Version
+my $multiline = 'Cisco Internetwork Operating System Software
+IOS (tm) Catalyst 4000 "L3" Switch Software (cat4000-I9K91S-M), Version
 12.2(20)EWA, RELEASE SOFTWARE (fc1)
 Technical Support: http://www.cisco.com/techsupport
 Copyright (c) 1986-2004 by cisco Systems, Inc.
-";
-my @fields = (ASN_OCTET_STR, ASN_UNSIGNED, ASN_UNSIGNED, ASN_COUNTER, ASN_COUNTER64, ASN_UNSIGNED);
-my @values = ($multiline, 4294965296, 1000, 4294965296, uint64("18446744073709351616"), int(rand(2**32)));
-my @incrts = (undef, 1000, -500, 1000, 100000, undef);
+';
+my $multilin2 = "Kisco Outernetwork Oserating Gystem Totware
+Copyleft (c) 2400-2689 by kisco Systrems, Inc.";
+my $multilin3 = 'This should not confuse check_snmp "parser"
+into thinking there is no 2nd line';
+my $multilin4 = 'It\'s getting even harder if the line
+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);
+my @values = ($multiline, $multilin2, $multilin3, $multilin4, $multilin5, 4294965296, 1000, 4294965296, uint64("18446744073709351616"), int(rand(2**32)));
+my @incrts = (undef, undef, undef, undef, undef, 1000, -500, 1000, 100000, undef);
 
 # Number of elements in our OID
 my $oidelts;


------------------------------------------------------------------------------
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.