Code

fix patch 998291
[nagiosplug.git] / plugins / check_nagios.c
index 5b21ba1d93ce269042cf066cc4fd272de54ca95f..b567fe10c8e83f91ae26c50ed9ae717754e55dc3 100644 (file)
  along with this program; if not, write to the Free Software
  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
+ $Id$
 ******************************************************************************/
 
 const char *progname = "check_nagios";
 const char *revision = "$Revision$";
-const char *copyright = "1999-2003";
+const char *copyright = "1999-2004";
 const char *email = "nagiosplug-devel@lists.sourceforge.net";
 
 #include "common.h"
@@ -52,17 +54,24 @@ main (int argc, char **argv)
        int procrss = 0;
        float procpcpu = 0;
        char procstat[8];
+       char procetime[MAX_INPUT_BUFFER];
        char procprog[MAX_INPUT_BUFFER];
        char *procargs;
        int pos, cols;
+       int expected_cols = PS_COLS - 1;
+       const char *zombie = "Z";
+       char *temp_string;
+
+       setlocale (LC_ALL, "");
+       bindtextdomain (PACKAGE, LOCALEDIR);
+       textdomain (PACKAGE);
 
        if (process_arguments (argc, argv) == ERROR)
-               usage (_("Could not parse arguments\n"));
+               usage4 (_("Could not parse arguments"));
 
-       /* Set signal handling and alarm */
+       /* Set signal handling and alarm timeout */
        if (signal (SIGALRM, timeout_alarm_handler) == SIG_ERR) {
-               printf (_("Cannot catch SIGALRM"));
-               return STATE_UNKNOWN;
+               usage4 (_("Cannot catch SIGALRM"));
        }
 
        /* handle timeouts gracefully... */
@@ -71,7 +80,7 @@ main (int argc, char **argv)
        /* open the status log */
        fp = fopen (status_log, "r");
        if (fp == NULL) {
-               printf (_("Error: Cannot open status log for reading!\n"));
+               printf (_("CRITICAL - Cannot open status log for reading!\n"));
                return STATE_CRITICAL;
        }
 
@@ -85,6 +94,9 @@ main (int argc, char **argv)
        }
        fclose (fp);
 
+       if (verbose >= 2)
+               printf("command: %s\n", PS_COMMAND);
+
        /* run the command to check for the Nagios process.. */
        child_process = spopen (PS_COMMAND);
        if (child_process == NULL) {
@@ -102,14 +114,31 @@ main (int argc, char **argv)
        /* 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);
-               if ( cols >= 6 ) {
+                /* 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;
+                }
+               if ( cols >= expected_cols ) {
                        asprintf (&procargs, "%s", input_buffer + pos);
                        strip (procargs);
                        
-                       if (!strstr(procargs, argv[0]) && strstr(procargs, process_string)) {
+                       /* 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, "/");
+                        }
+
+                       /* May get empty procargs */
+                       if (!strstr(procargs, argv[0]) && strstr(procprog, process_string) && strcmp(procargs,"")) {
                                proc_entries++;
-                               if (verbose)
-                                       printf (_("Found process: %s\n"), procargs);
+                               if (verbose >= 2) {
+                                       printf (_("Found process: %s %s\n"), procprog, procargs);
+                               }
                        }
                }
        }
@@ -151,8 +180,6 @@ main (int argc, char **argv)
 
 
 
-
-
 /* process command-line arguments */
 int
 process_arguments (int argc, char **argv)
@@ -200,7 +227,7 @@ process_arguments (int argc, char **argv)
                        print_help ();
                        exit (STATE_OK);
                case 'V':                                                                       /* version */
-                       print_revision (progname, "$Revision$");
+                       print_revision (progname, revision);
                        exit (STATE_OK);
                case 'F':                                                                       /* status log */
                        status_log = optarg;
@@ -237,9 +264,6 @@ process_arguments (int argc, char **argv)
 
 
 
-
-
-\f
 void
 print_help (void)
 {
@@ -252,7 +276,7 @@ This plugin attempts to check the status of the Nagios process on the local\n\
 machine. The plugin will check to make sure the Nagios status log is no older\n\
 than the number of minutes specified by the <expire_minutes> option.  It also\n\
 uses the /bin/ps command to check for a process matching whatever you specify\n\
-by the <process_string> argument.\n"));
+by the <process_string> argument.\n\n"));
 
        print_usage ();
 
@@ -275,11 +299,9 @@ Example:\n\
 
 
 
-
 void
 print_usage (void)
 {
-       printf (_("\
-Usage: %s -F <status log file> -e <expire_minutes> -C <process_string>\n"),
-               progname);
+       printf ("\
+Usage: %s -F <status log file> -e <expire_minutes> -C <process_string>\n", progname);
 }