Просмотр исходного кода

Ignore stderr messages unless return code is non-zero or there is no output

Ton Voon 17 лет назад
Родитель
Сommit
12c17fe8a2
1 измененных файлов с 20 добавлено и 12 удалено
  1. 20 12
      plugins/check_snmp.c

+ 20 - 12
plugins/check_snmp.c

@@ -143,6 +143,8 @@ main (int argc, char **argv)
 	int i = 0;
 	int iresult = STATE_UNKNOWN;
 	int result = STATE_UNKNOWN;
+	int return_code = 0;
+	int external_error = 0;
 	char **command_line = NULL;
 	char *cl_hidden_auth = NULL;
 	char *oidname = NULL;
@@ -220,22 +222,28 @@ main (int argc, char **argv)
 		printf ("%s\n", cl_hidden_auth);
 
 	/* Run the command */
-	result = cmd_run_array (command_line, &chld_out, &chld_err, 0);
-
-	if (chld_err.lines > 0) {
-		printf (_("External command error: %s\n"), chld_err.line[0]);
-		for (i = 1; i < chld_err.lines; i++) {
-			printf ("%s\n", chld_err.line[i]);
+	return_code = cmd_run_array (command_line, &chld_out, &chld_err, 0);
+
+	/* Due to net-snmp sometimes showing stderr messages with poorly formed MIBs, 
+	   only return state unknown if return code is non zero or there is no stdout.
+	   Do this way so that if there is stderr, will get added to output, which helps problem diagnosis
+	/*
+	if (return_code != 0)
+		external_error=1;
+	if (chld_out.lines == 0)
+		external_error=1;
+	if (external_error) {
+		if (chld_err.lines > 0) {
+			printf (_("External command error: %s\n"), chld_err.line[0]);
+			for (i = 1; i < chld_err.lines; i++) {
+				printf ("%s\n", chld_err.line[i]);
+			}
+		} else {
+			printf(_("External command error with no output (return code: %d)\n"), return_code);
 		}
 		exit (STATE_UNKNOWN);
 	}
 
-	/* Return UNKNOWN or worse if no output is returned */
-	if (chld_out.lines == 0)
-		die (max_state_alt (result, STATE_UNKNOWN), _("%s problem - No data received from host\nCMD: %s\n"),
-								label,
-								cl_hidden_auth);
-
 	if (verbose) {
 		for (i = 0; i < chld_out.lines; i++) {
 			printf ("%s\n", chld_out.line[i]);