diff options
-rw-r--r-- | plugins/check_snmp.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c index 1b1eb2e8..03c2a174 100644 --- a/plugins/check_snmp.c +++ b/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]); |