Code

Fix includes for gettext
[nagiosplug.git] / plugins / check_procs.c
index 402daa53161e6b12c8051f58771b94167f6ecc88..f2fc2e5b076287a6a919105efa084ea349dce822 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_procs";
 const char *revision = "$Revision$";
-const char *copyright = "2000-2003";
+const char *copyright = "2000-2004";
 const char *email = "nagiosplug-devel@lists.sourceforge.net";
 
 #include "common.h"
 #include "popen.h"
 #include "utils.h"
+
 #include <pwd.h>
 
 int process_arguments (int, char **);
 int validate_arguments (void);
 int check_thresholds (int);
+int convert_to_seconds (char *); 
 void print_help (void);
 void print_usage (void);
 
@@ -47,14 +51,15 @@ int options = 0; /* bitmask of filter criteria to test against */
 #define VSZ  64
 #define RSS  128
 #define PCPU 256
-
+#define ELAPSED 512
 /* Different metrics */
 char *metric_name;
 enum metric {
        METRIC_PROCS,
        METRIC_VSZ,
        METRIC_RSS,
-       METRIC_CPU
+       METRIC_CPU,
+       METRIC_ELAPSED
 };
 enum metric metric = METRIC_PROCS;
 
@@ -73,9 +78,6 @@ char tmp[MAX_INPUT_BUFFER];
 
 
 
-
-
-\f
 int
 main (int argc, char **argv)
 {
@@ -87,8 +89,10 @@ main (int argc, char **argv)
        int procppid = 0;
        int procvsz = 0;
        int procrss = 0;
+       int procseconds = 0;
        float procpcpu = 0;
        char procstat[8];
+       char procetime[MAX_INPUT_BUFFER];
        char *procargs;
        char *temp_string;
 
@@ -117,7 +121,13 @@ main (int argc, char **argv)
        metric = METRIC_PROCS;
 
        if (process_arguments (argc, argv) == ERROR)
-               usage (_("Unable to parse command line\n"));
+               usage4 (_("Could not parse arguments"));
+
+       /* Set signal handling and alarm timeout */
+       if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) {
+               usage4 (_("Cannot catch SIGALRM"));
+       }
+       alarm (timeout_interval);
 
        if (verbose >= 2)
                printf (_("CMD: %s\n"), PS_COMMAND);
@@ -168,10 +178,14 @@ main (int argc, char **argv)
                                temp_string = strtok (NULL, "/");
                        }
 
+                       /* we need to convert the elapsed time to seconds */
+                       procseconds = convert_to_seconds(procetime);
+
                        if (verbose >= 3)
-                               printf ("%d %d %d %d %d %.2f %s %s %s\n", 
+                               printf ("%d %d %d %d %d %.2f %s %s %s %s\n", 
                                        procs, procuid, procvsz, procrss,
-                                       procppid, procpcpu, procstat, procprog, procargs);
+                                       procppid, procpcpu, procstat, 
+                                       procetime, procprog, procargs);
 
                        /* Ignore self */
                        if (strcmp (procprog, progname) == 0) {
@@ -210,6 +224,8 @@ main (int argc, char **argv)
                        /* TODO? float thresholds for --metric=CPU */
                        else if (metric == METRIC_CPU)
                                i = check_thresholds ((int)procpcpu); 
+                       else if (metric == METRIC_ELAPSED)
+                               i = check_thresholds (procseconds);
 
                        if (metric != METRIC_PROCS) {
                                if (i == STATE_WARNING) {
@@ -272,7 +288,7 @@ main (int argc, char **argv)
                        printf (_("%d crit, %d warn out of "), crit, warn);
                }
        } 
-       printf (ngettext ("%d process", "%d processes", (unsigned long) procs), procs);
+       printf ("%d %s", procs, procs == 1 ? _("process") : _("processes"));
        
        if (strcmp(fmt,"") != 0) {
                printf (_(" with %s"), fmt);
@@ -287,9 +303,6 @@ main (int argc, char **argv)
 
 
 
-
-
-\f
 /* process command-line arguments */
 int
 process_arguments (int argc, char **argv)
@@ -309,6 +322,7 @@ process_arguments (int argc, char **argv)
                {"vsz", required_argument, 0, 'z'},
                {"rss", required_argument, 0, 'r'},
                {"pcpu", required_argument, 0, 'P'},
+               {"elapsed", required_argument, 0, 'e'},
                {"argument-array", required_argument, 0, 'a'},
                {"help", no_argument, 0, 'h'},
                {"version", no_argument, 0, 'V'},
@@ -329,6 +343,7 @@ process_arguments (int argc, char **argv)
 
                switch (c) {
                case '?':                                                                       /* help */
+                       printf (_("%s: Unknown argument: %s\n\n"), progname, optarg);
                        print_usage ();
                        exit (STATE_UNKNOWN);
                case 'h':                                                                       /* help */
@@ -339,7 +354,7 @@ process_arguments (int argc, char **argv)
                        exit (STATE_OK);
                case 't':                                                                       /* timeout period */
                        if (!is_integer (optarg))
-                               usage (_("Timeout Interval must be an integer!\n\n"));
+                               usage2 (_("Timeout interval must be a positive integer"), optarg);
                        else
                                timeout_interval = atoi (optarg);
                        break;
@@ -404,6 +419,7 @@ process_arguments (int argc, char **argv)
                        options |= USER;
                        break;
                case 'C':                                                                       /* command */
+                       /* TODO: allow this to be passed in with --metric */
                        if (prog)
                                break;
                        else
@@ -413,6 +429,7 @@ process_arguments (int argc, char **argv)
                        options |= PROG;
                        break;
                case 'a':                                                                       /* args (full path name with args) */
+                       /* TODO: allow this to be passed in with --metric */
                        if (args)
                                break;
                        else
@@ -460,7 +477,12 @@ process_arguments (int argc, char **argv)
                                metric = METRIC_CPU;
                                break;
                        }
-                       printf (_("%s: metric must be one of PROCS, VSZ, RSS, CPU!\n\n"),
+                       else if ( strcmp(optarg, "ELAPSED") == 0) {
+                               metric = METRIC_ELAPSED;
+                               break;
+                       }
+                               
+                       printf (_("%s: metric must be one of PROCS, VSZ, RSS, CPU, ELAPSED!\n\n"),
                                progname);
                        print_usage ();
                        exit (STATE_UNKNOWN);
@@ -486,7 +508,6 @@ process_arguments (int argc, char **argv)
 
 
 
-
 int
 validate_arguments ()
 {
@@ -534,9 +555,6 @@ validate_arguments ()
 
 
 
-
-
-\f
 /* Check thresholds against value */
 int
 check_thresholds (int value)
@@ -572,15 +590,77 @@ check_thresholds (int value)
 
 
 
+/* convert the elapsed time to seconds */
+int
+convert_to_seconds(char *etime) {
+
+       char *ptr;
+       int total;
+
+       int hyphcnt;
+       int coloncnt;
+       int days;
+       int hours;
+       int minutes;
+       int seconds;
+
+       hyphcnt = 0;
+       coloncnt = 0;
+       days = 0;
+       hours = 0;
+       minutes = 0;
+       seconds = 0;
+
+       for (ptr = etime; *ptr != '\0'; ptr++) {
+       
+               if (*ptr == '-') {
+                       hyphcnt++;
+                       continue;
+               }
+               if (*ptr == ':') {
+                       coloncnt++;
+                       continue;
+               }
+       }
+
+       if (hyphcnt > 0) {
+               sscanf(etime, "%d-%d:%d:%d",
+                               &days, &hours, &minutes, &seconds);
+               /* linux 2.6.5/2.6.6 reporting some processes with infinite
+                * elapsed times for some reason */
+               if (days == 49710) {
+                       return 0;
+               }
+       } else {
+               if (coloncnt == 2) {
+                       sscanf(etime, "%d:%d:%d",
+                               &hours, &minutes, &seconds);
+               } else if (coloncnt == 1) {
+                       sscanf(etime, "%d:%d",
+                               &minutes, &seconds);
+               }
+       }
+
+       total = (days * 86400) +
+               (hours * 3600) +
+               (minutes * 60) +
+               seconds;
+
+       if (verbose >= 3) {
+               printf("seconds: %d\n", total);
+       }
+       return total;
+}
+
+
 
-\f
 void
 print_help (void)
 {
        print_revision (progname, revision);
 
-       printf (_("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>"));
-       printf (_(COPYRIGHT), copyright, email);
+       printf ("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>");
+       printf (COPYRIGHT, copyright, email);
 
        printf(_("\
 Checks all processes and generates WARNING or CRITICAL states if the specified\n\
@@ -600,10 +680,18 @@ Required Arguments:\n\
 Optional Arguments:\n\
  -m, --metric=TYPE\n\
    Check thresholds against metric. Valid types:\n\
-   PROCS - number of processes (default)\n\
-   VSZ  - virtual memory size\n\
-   RSS  - resident set memory size\n\
-   CPU  - percentage cpu\n\
+   PROCS   - number of processes (default)\n\
+   VSZ     - virtual memory size\n\
+   RSS     - resident set memory size\n\
+   CPU     - percentage cpu\n"));
+/* only linux etime is support currently */
+#if defined( __linux__ )
+       printf(_("\
+   ELAPSED - time elapsed in seconds\n"));
+#endif /* defined(__linux__) */
+       printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT);
+
+       printf(_("\
  -v, --verbose\n\
    Extra information. Up to 3 verbosity levels\n"));
 
@@ -653,7 +741,7 @@ Examples:\n\
  check_procs -w 50000 -c 100000 --metric=VSZ\n\
    Alert if vsz of any processes over 50K or 100K\n\
  check_procs -w 10 -c 20 --metric=CPU\n\
-   Alert if cpu of any processes over 10% or 20%\n\n"));
+   Alert if cpu of any processes over 10%% or 20%%\n\n"));
 
        printf (_(UT_SUPPORT));
 }
@@ -663,8 +751,6 @@ print_usage (void)
 {
        printf ("\
 Usage: %s -w <range> -c <range> [-m metric] [-s state] [-p ppid]\n\
-  [-u user] [-r rss] [-z vsz] [-P %%cpu] [-a argument-array]\n\
-  [-C command] [-v]\n", progname);     
-       printf (_(UT_HLP_VRS), progname, progname);
+                  [-u user] [-r rss] [-z vsz] [-P %%cpu] [-a argument-array]\n\
+                  [-C command] [-t timeout] [-v]\n", progname);
 }
-