aboutsummaryrefslogtreecommitdiff
path: root/plugins/check_nagios.c
diff options
context:
space:
mode:
authorGravatar M. Sean Finney <seanius@users.sourceforge.net> 2005-10-24 11:10:29 +0000
committerGravatar M. Sean Finney <seanius@users.sourceforge.net> 2005-10-24 11:10:29 +0000
commitceebd58040b1688749d58dd76963af639cf8c803 (patch)
tree972deca448413addc597ce7ba3a1a4edefa8c5a5 /plugins/check_nagios.c
parent19100c883d72e6ebfd3f15b3171ade2a78345c73 (diff)
downloadmonitoring-plugins-ceebd58040b1688749d58dd76963af639cf8c803.tar.gz
initial merging of ae's np_runcmd code into selected plugins.
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1260 f882894a-f735-0410-b71e-b25c423dba1c
Diffstat (limited to 'plugins/check_nagios.c')
-rw-r--r--plugins/check_nagios.c80
1 files changed, 33 insertions, 47 deletions
diff --git a/plugins/check_nagios.c b/plugins/check_nagios.c
index 089ff669..0ae488ff 100644
--- a/plugins/check_nagios.c
+++ b/plugins/check_nagios.c
@@ -24,7 +24,7 @@ const char *copyright = "1999-2004";
const char *email = "nagiosplug-devel@lists.sourceforge.net";
#include "common.h"
-#include "popen.h"
+#include "runcmd.h"
#include "utils.h"
int process_arguments (int, char **);
@@ -55,6 +55,8 @@ main (int argc, char **argv)
int procrss = 0;
float procpcpu = 0;
char procstat[8];
+ /* procetime is unused in most configurations, but may be in PS_VAR_LIST
+ * so it must be here in spite of it producing compiler warnings */
char procetime[MAX_INPUT_BUFFER];
char procprog[MAX_INPUT_BUFFER];
char *procargs;
@@ -62,17 +64,19 @@ main (int argc, char **argv)
int expected_cols = PS_COLS - 1;
const char *zombie = "Z";
char *temp_string;
+ output chld_out, chld_err;
+ size_t i;
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
if (process_arguments (argc, argv) == ERROR)
- usage4 (_("Could not parse arguments"));
+ usage_va(_("Could not parse arguments"));
/* Set signal handling and alarm timeout */
if (signal (SIGALRM, timeout_alarm_handler) == SIG_ERR) {
- usage4 (_("Cannot catch SIGALRM"));
+ usage_va(_("Cannot catch SIGALRM"));
}
/* handle timeouts gracefully... */
@@ -99,40 +103,30 @@ main (int argc, char **argv)
printf(_("command: %s\n"), PS_COMMAND);
/* run the command to check for the Nagios process.. */
- child_process = spopen (PS_COMMAND);
- if (child_process == NULL) {
- printf (_("Could not open pipe: %s\n"), PS_COMMAND);
- return STATE_UNKNOWN;
- }
-
- child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r");
- if (child_stderr == NULL) {
- printf (_("Could not open stderr for %s\n"), PS_COMMAND);
- }
-
- fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process);
+ if((result = np_runcmd(PS_COMMAND, &chld_out, &chld_err, 0)) != 0)
+ result = STATE_WARNING;
/* count the number of matching Nagios processes... */
- while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) {
- cols = sscanf (input_buffer, PS_FORMAT, PS_VARLIST);
- /* Zombie processes do not give a procprog command */
- if ( cols == (expected_cols - 1) && strstr(procstat, zombie) ) {
- cols = expected_cols;
- /* Set some value for procargs for the strip command further below
- Seen to be a problem on some Solaris 7 and 8 systems */
- input_buffer[pos] = '\n';
- input_buffer[pos+1] = 0x0;
- }
+ for(i = 0; i < chld_out.lines; i++) {
+ cols = sscanf (chld_out.line[i], PS_FORMAT, PS_VARLIST);
+ /* Zombie processes do not give a procprog command */
+ if ( cols == (expected_cols - 1) && strstr(procstat, zombie) ) {
+ cols = expected_cols;
+ /* Set some value for procargs for the strip command further below
+ * Seen to be a problem on some Solaris 7 and 8 systems */
+ chld_out.line[i][pos] = '\n';
+ chld_out.line[i][pos+1] = 0x0;
+ }
if ( cols >= expected_cols ) {
- asprintf (&procargs, "%s", input_buffer + pos);
+ asprintf (&procargs, "%s", chld_out.line[i] + pos);
strip (procargs);
-
+
/* Some ps return full pathname for command. This removes path */
- temp_string = strtok ((char *)procprog, "/");
- while (temp_string) {
- strcpy(procprog, temp_string);
- temp_string = strtok (NULL, "/");
- }
+ temp_string = strtok ((char *)procprog, "/");
+ while (temp_string) {
+ strcpy(procprog, temp_string);
+ temp_string = strtok (NULL, "/");
+ }
/* May get empty procargs */
if (!strstr(procargs, argv[0]) && strstr(procargs, process_string) && strcmp(procargs,"")) {
@@ -145,14 +139,7 @@ main (int argc, char **argv)
}
/* If we get anything on stderr, at least set warning */
- while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr))
- result = max_state (result, STATE_WARNING);
-
- /* close stderr */
- (void) fclose (child_stderr);
-
- /* close the pipe */
- if (spclose (child_process))
+ if(chld_err.buflen)
result = max_state (result, STATE_WARNING);
/* reset the alarm handler */
@@ -219,8 +206,6 @@ process_arguments (int argc, char **argv)
break;
switch (c) {
- case '?': /* print short usage statement if args not parsable */
- usage2 (_("Unknown argument"), optarg);
case 'h': /* help */
print_help ();
exit (STATE_OK);
@@ -243,16 +228,17 @@ process_arguments (int argc, char **argv)
case 'v':
verbose++;
break;
+ default: /* print short usage_va statement if args not parsable */
+ usage_va(_("Unknown argument - %s"), optarg);
}
}
if (status_log == NULL)
- die (STATE_UNKNOWN,
- _("You must provide the status_log\n"));
- else if (process_string == NULL)
- die (STATE_UNKNOWN,
- _("You must provide a process string\n"));
+ die (STATE_UNKNOWN, _("You must provide the status_log\n"));
+
+ if (process_string == NULL)
+ die (STATE_UNKNOWN, _("You must provide a process string\n"));
return OK;
}