X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fcheck_nagios.c;h=089ff669702a96bb0d0a2b297f3ba7a9e9fb3a2b;hb=45b373ebdad0c82296342f4ad774db2ff643e511;hp=5c4cd4a3a7d769126b7bea5df1d25f45a612c4e4;hpb=0c3386274ef5002dffc20337ef02407f24d7400c;p=nagiosplug.git diff --git a/plugins/check_nagios.c b/plugins/check_nagios.c index 5c4cd4a..089ff66 100644 --- a/plugins/check_nagios.c +++ b/plugins/check_nagios.c @@ -1,45 +1,42 @@ /****************************************************************************** - * - * CHECK_NAGIOS.C - * - * Program: Nagios process plugin for Nagios - * License: GPL - * Copyright (c) 1999 Ethan Galstad (nagios@nagios.org) - * - * $Id$ - * - * License Information: - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - *****************************************************************************/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + 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-2004"; +const char *email = "nagiosplug-devel@lists.sourceforge.net"; #include "common.h" #include "popen.h" #include "utils.h" -const char *progname = "check_nagios"; - int process_arguments (int, char **); -void print_usage (void); void print_help (void); +void print_usage (void); char *status_log = NULL; char *process_string = NULL; int expire_minutes = 0; +int verbose = 0; + int main (int argc, char **argv) { @@ -51,14 +48,31 @@ main (int argc, char **argv) time_t current_time; char *temp_ptr; FILE *fp; + int procuid = 0; + int procpid = 0; + int procppid = 0; + int procvsz = 0; + 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... */ @@ -67,7 +81,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; } @@ -81,22 +95,53 @@ 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_RAW_COMMAND); + child_process = spopen (PS_COMMAND); if (child_process == NULL) { - printf ("Could not open pipe: %s\n", PS_RAW_COMMAND); + 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_RAW_COMMAND); + printf (_("Could not open stderr for %s\n"), PS_COMMAND); } + fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process); + /* count the number of matching Nagios processes... */ while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { - if (!strstr(input_buffer, argv[0]) && strstr(input_buffer, process_string)) - proc_entries++; + 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; + } + if ( cols >= expected_cols ) { + asprintf (&procargs, "%s", input_buffer + 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, "/"); + } + + /* May get empty procargs */ + if (!strstr(procargs, argv[0]) && strstr(procargs, process_string) && strcmp(procargs,"")) { + proc_entries++; + if (verbose >= 2) { + printf (_("Found process: %s %s\n"), procprog, procargs); + } + } + } } /* If we get anything on stderr, at least set warning */ @@ -114,18 +159,18 @@ main (int argc, char **argv) alarm (0); if (proc_entries == 0) { - printf ("Could not locate a running Nagios process!\n"); + printf (_("Could not locate a running Nagios process!\n")); return STATE_CRITICAL; } result = STATE_OK; time (¤t_time); - if ((current_time - latest_entry_time) > (expire_minutes * 60)) + if ((int)(current_time - latest_entry_time) > (expire_minutes * 60)) result = STATE_WARNING; printf - ("Nagios %s: located %d process%s, status log updated %d second%s ago\n", + (_("Nagios %s: located %d process%s, status log updated %d second%s ago\n"), (result == STATE_OK) ? "ok" : "problem", proc_entries, (proc_entries == 1) ? "" : "es", (int) (current_time - latest_entry_time), @@ -136,25 +181,22 @@ main (int argc, char **argv) - - /* process command-line arguments */ int process_arguments (int argc, char **argv) { int c; -#ifdef HAVE_GETOPT_H - int option_index = 0; - static struct option long_options[] = { + int option = 0; + static struct option longopts[] = { {"filename", required_argument, 0, 'F'}, {"expires", required_argument, 0, 'e'}, {"command", required_argument, 0, 'C'}, {"version", no_argument, 0, 'V'}, {"help", no_argument, 0, 'h'}, + {"verbose", no_argument, 0, 'v'}, {0, 0, 0, 0} }; -#endif if (argc < 2) return ERROR; @@ -164,104 +206,94 @@ process_arguments (int argc, char **argv) if (is_intnonneg (argv[2])) expire_minutes = atoi (argv[2]); else - terminate (STATE_UNKNOWN, - "Expiration time must be an integer (seconds)\nType '%s -h' for additional help\n", - progname); + die (STATE_UNKNOWN, + _("Expiration time must be an integer (seconds)\n")); process_string = argv[3]; return OK; } while (1) { -#ifdef HAVE_GETOPT_H - c = getopt_long (argc, argv, "+hVF:C:e:", long_options, &option_index); -#else - c = getopt (argc, argv, "+hVF:C:e:"); -#endif + c = getopt_long (argc, argv, "+hVvF:C:e:", longopts, &option); if (c == -1 || c == EOF || c == 1) break; switch (c) { case '?': /* print short usage statement if args not parsable */ - printf ("%s: Unknown argument: %c\n\n", progname, optopt); - print_usage (); - exit (STATE_UNKNOWN); + usage2 (_("Unknown argument"), optarg); case 'h': /* help */ print_help (); exit (STATE_OK); case 'V': /* version */ - print_revision (progname, "$Revision$"); + print_revision (progname, revision); exit (STATE_OK); - case 'F': /* hostname */ + case 'F': /* status log */ status_log = optarg; break; - case 'C': /* hostname */ + case 'C': /* command */ process_string = optarg; break; - case 'e': /* hostname */ + case 'e': /* expiry time */ if (is_intnonneg (optarg)) expire_minutes = atoi (optarg); else - terminate (STATE_UNKNOWN, - "Expiration time must be an integer (seconds)\nType '%s -h' for additional help\n", - progname); + die (STATE_UNKNOWN, + _("Expiration time must be an integer (seconds)\n")); + break; + case 'v': + verbose++; break; } } if (status_log == NULL) - terminate (STATE_UNKNOWN, - "You must provide the status_log\nType '%s -h' for additional help\n", - progname); + die (STATE_UNKNOWN, + _("You must provide the status_log\n")); else if (process_string == NULL) - terminate (STATE_UNKNOWN, - "You must provide a process string\nType '%s -h' for additional help\n", - progname); + die (STATE_UNKNOWN, + _("You must provide a process string\n")); return OK; } - - void -print_usage (void) +print_help (void) { - printf - ("Usage: %s -F -e -C \n", - progname); -} + print_revision (progname, revision); + + printf (_(COPYRIGHT), copyright, email); + printf (_("\ +This plugin checks 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 expires option. It also\n\ +checks the process table for a process matching the command argument.\n\n")); + print_usage (); + + printf (_(UT_HELP_VRSN)); + + printf (_("\ + -F, --filename=FILE\n\ + Name of the log file to check\n\ + -e, --expires=INTEGER\n\ + Minutes aging after which logfile is considered stale\n\ + -C, --command=STRING\n\ + Substring to search for in process arguments\n")); + + printf (_("\ +Example:\n\ + ./check_nagios -e 5 -F /usr/local/nagios/var/status.log -C /usr/local/nagios/bin/nagios\n")); +} void -print_help (void) +print_usage (void) { - print_revision (progname, "$Revision$"); - printf - ("Copyright (c) 2000 Ethan Galstad/Karl DeBisschop\n\n" - "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 option. It also\n" - "uses the /bin/ps command to check for a process matching whatever you specify\n" - "by the argument.\n"); - print_usage (); - printf - ("\nOptions:\n" - "-F, --filename=FILE\n" - " Name of the log file to check\n" - "-e, --expires=INTEGER\n" - " Seconds aging afterwhich logfile is condsidered stale\n" - "-C, --command=STRING\n" - " Command to search for in process table\n" - "-h, --help\n" - " Print this help screen\n" - "-V, --version\n" - " Print version information\n\n" - "Example:\n" - " ./check_nagios -F /usr/local/nagios/var/status.log -e 5 -C /usr/local/nagios/bin/nagios\n"); + printf ("\ +Usage: %s -F -e -C \n", progname); }