SF.net SVN: nagiosplug: [2019] nagiosplug/trunk

[email protected]
Newsgroups gmane.network.nagios.plugins.cvs
Message-ID <[email protected]>
Revision: 2019
          http://nagiosplug.svn.sourceforge.net/nagiosplug/?rev=2019&view=rev
Author:   tonvoon
Date:     2008-07-08 02:31:04 -0700 (Tue, 08 Jul 2008)

Log Message:
-----------
check_procs captures stderr and adds to plugin output. This is
from a merge of branch nagiosplug/branches/new_threshold_syntax 1979:1982

Modified Paths:
--------------
    nagiosplug/trunk/NEWS
    nagiosplug/trunk/lib/utils_cmd.c
    nagiosplug/trunk/lib/utils_cmd.h
    nagiosplug/trunk/plugins/Makefile.am
    nagiosplug/trunk/plugins/check_procs.c

Modified: nagiosplug/trunk/NEWS
===================================================================
--- nagiosplug/trunk/NEWS	2008-07-06 12:57:11 UTC (rev 2018)
+++ nagiosplug/trunk/NEWS	2008-07-08 09:31:04 UTC (rev 2019)
@@ -6,6 +6,7 @@
 	Updated Nagios::Plugin to 0.27
 	Fix Debian bug #479013: check_dig's -l is mandatory now (sf.net #1986306)
 	check_dig now returns CRITICAL instead of WARNING when no answer section is found
+	check_procs now captures stderr in external command and adds to plugin output
 
 1.4.12 27th May 2008
 	Added ./check_nt -v INSTANCES to count number of instances (Alessandro Ren)

Modified: nagiosplug/trunk/lib/utils_cmd.c
===================================================================
--- nagiosplug/trunk/lib/utils_cmd.c	2008-07-06 12:57:11 UTC (rev 2018)
+++ nagiosplug/trunk/lib/utils_cmd.c	2008-07-08 09:31:04 UTC (rev 2019)
@@ -45,6 +45,7 @@
 #include "common.h"
 #include "utils_cmd.h"
 #include "utils_base.h"
+#include <fcntl.h>
 
 #ifdef HAVE_SYS_WAIT_H
 # include <sys/wait.h>
@@ -377,3 +378,20 @@
 
 	return _cmd_close (fd);
 }
+
+int
+cmd_file_read ( char *filename, output *out, int flags)
+{
+	int fd;
+	if(out)
+		memset (out, 0, sizeof(output));
+
+	if ((fd = open(filename, O_RDONLY)) == -1) {
+		die( STATE_UNKNOWN, _("Error opening %s: %s"), filename, strerror(errno) );
+	}
+	
+	if(out)
+		out->lines = _cmd_fetch_output (fd, out, flags);
+
+	return 0;
+}

Modified: nagiosplug/trunk/lib/utils_cmd.h
===================================================================
--- nagiosplug/trunk/lib/utils_cmd.h	2008-07-06 12:57:11 UTC (rev 2018)
+++ nagiosplug/trunk/lib/utils_cmd.h	2008-07-08 09:31:04 UTC (rev 2019)
@@ -22,6 +22,7 @@
 /** prototypes **/
 int cmd_run (const char *, output *, output *, int);
 int cmd_run_array (char *const *, output *, output *, int);
+int cmd_file_read (char *, output *, int);
 
 /* only multi-threaded plugins need to bother with this */
 void cmd_init (void);

Modified: nagiosplug/trunk/plugins/Makefile.am
===================================================================
--- nagiosplug/trunk/plugins/Makefile.am	2008-07-06 12:57:11 UTC (rev 2018)
+++ nagiosplug/trunk/plugins/Makefile.am	2008-07-08 09:31:04 UTC (rev 2019)
@@ -79,7 +79,7 @@
 check_overcr_LDADD = $(NETLIBS)
 check_pgsql_LDADD = $(NETLIBS) $(PGLIBS)
 check_ping_LDADD = $(NETLIBS) popen.o
-check_procs_LDADD = $(BASEOBJS) popen.o
+check_procs_LDADD = $(BASEOBJS)
 check_radius_LDADD = $(NETLIBS) $(RADIUSLIBS)
 check_real_LDADD = $(NETLIBS)
 check_snmp_LDADD = $(BASEOBJS) popen.o

Modified: nagiosplug/trunk/plugins/check_procs.c
===================================================================
--- nagiosplug/trunk/plugins/check_procs.c	2008-07-06 12:57:11 UTC (rev 2018)
+++ nagiosplug/trunk/plugins/check_procs.c	2008-07-08 09:31:04 UTC (rev 2019)
@@ -41,8 +41,8 @@
 const char *email = "[email protected]";
 
 #include "common.h"
-#include "popen.h"
 #include "utils.h"
+#include "utils_cmd.h"
 #include "regex.h"
 
 #include <pwd.h>
@@ -129,8 +129,9 @@
 	int expected_cols = PS_COLS - 1;
 	int warn = 0; /* number of processes in warn state */
 	int crit = 0; /* number of processes in crit state */
-	int i = 0;
+	int i = 0, j = 0;
 	int result = STATE_UNKNOWN;
+	output chld_out, chld_err;
 
 	setlocale (LC_ALL, "");
 	bindtextdomain (PACKAGE, LOCALEDIR);
@@ -153,42 +154,28 @@
 	mypid = getpid();
 
 	/* Set signal handling and alarm timeout */
-	if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) {
-		usage4 (_("Cannot catch SIGALRM"));
+	if (signal (SIGALRM, timeout_alarm_handler) == SIG_ERR) {
+		die (STATE_UNKNOWN, _("Cannot catch SIGALRM"));
 	}
-	alarm (timeout_interval);
+	(void) alarm ((unsigned) timeout_interval);
 
 	if (verbose >= 2)
 		printf (_("CMD: %s\n"), PS_COMMAND);
 
 	if (input_filename == NULL) {
-		ps_input = spopen (PS_COMMAND);
-		if (ps_input == NULL) {
-			printf (_("Could not open pipe: %s\n"), PS_COMMAND);
-			return STATE_UNKNOWN;
+		result = cmd_run( PS_COMMAND, &chld_out, &chld_err, 0);
+		if (chld_err.lines > 0) {
+			printf ("%s: %s", _("System call sent warnings to stderr"), chld_err.line[0]);
+			exit(STATE_WARNING);
 		}
-		child_stderr = fdopen (child_stderr_array[fileno (ps_input)], "r");
-		if (child_stderr == NULL)
-			printf (_("Could not open stderr for %s\n"), PS_COMMAND);
 	} else {
-		ps_input = fopen(input_filename, "r");
-		if (ps_input == NULL) {
-			die( STATE_UNKNOWN, _("Error opening %s\n"), input_filename );
-		}
+		result = cmd_file_read( input_filename, &chld_out, 0);
 	}
 
-	/* flush first line */
-	fgets (input_buffer, MAX_INPUT_BUFFER - 1, ps_input);
-	while ( input_buffer[strlen(input_buffer)-1] != '\n' )
-		fgets (input_buffer, MAX_INPUT_BUFFER - 1, ps_input);
+	/* flush first line: j starts at 1 */
+	for (j = 1; j < chld_out.lines; j++) {
+		input_line = chld_out.line[j];
 
-	while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, ps_input)) {
-		asprintf (&input_line, "%s", input_buffer);
-		while ( input_buffer[strlen(input_buffer)-1] != '\n' ) {
-			fgets (input_buffer, MAX_INPUT_BUFFER - 1, ps_input);
-			asprintf (&input_line, "%s%s", input_line, input_buffer);
-		}
-
 		if (verbose >= 3)
 			printf ("%s", input_line);
 
@@ -283,27 +270,9 @@
 		}
 	}
 
-	/* If we get anything on STDERR, at least set warning */
-	if (input_filename == NULL) {
-		while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) {
-			if (verbose)
-				printf ("STDERR: %s", input_buffer);
-			result = max_state (result, STATE_WARNING);
-			printf (_("System call sent warnings to stderr\n"));
-		}
-	
-		(void) fclose (child_stderr);
-
-		/* close the pipe */
-		if (spclose (ps_input)) {
-			printf (_("System call returned nonzero status\n"));
-			result = max_state (result, STATE_WARNING);
-		}
-	}
-
 	if (found == 0) {							/* no process lines parsed so return STATE_UNKNOWN */
 		printf (_("Unable to read output\n"));
-		return result;
+		return STATE_UNKNOWN;
 	}
 
 	if ( result == STATE_UNKNOWN ) 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.

-------------------------------------------------------------------------
Sponsored by: SourceForge.net Community Choice Awards: VOTE NOW!
Studies have shown that voting for your favorite open source project,
along with a healthy diet, reduces your potential for chronic lameness
and boredom. Vote Now at http://www.sourceforge.net/community/cca08
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.