X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fcheck_nagios.c;h=24ddadd71ef87c3d25ea47c9435bfd558e814c80;hb=25d1ee331dbe4977a4a1a756c67f32bd51d9b070;hp=089ff669702a96bb0d0a2b297f3ba7a9e9fb3a2b;hpb=4e19425ce697ce17257b0db904a656e3c8557911;p=nagiosplug.git diff --git a/plugins/check_nagios.c b/plugins/check_nagios.c index 089ff66..24ddadd 100644 --- a/plugins/check_nagios.c +++ b/plugins/check_nagios.c @@ -1,30 +1,43 @@ -/****************************************************************************** - - 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$ - -******************************************************************************/ +/***************************************************************************** +* +* Nagios check_nagios plugin +* +* License: GPL +* Copyright (c) 1999-2007 Nagios Plugins Development Team +* +* Description: +* +* This file contains the check_nagios plugin +* +* This plugin checks the status of the Nagios process on the local machine. +* The plugin will check to make sure the Nagios status log is no older than +* the number of minutes specified by the expires option. +* It also checks the process table for a process matching the command +* argument. +* +* +* 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 3 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, see . +* +* +*****************************************************************************/ const char *progname = "check_nagios"; -const char *revision = "$Revision$"; -const char *copyright = "1999-2004"; +const char *copyright = "1999-2007"; 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,24 +68,31 @@ main (int argc, char **argv) int procrss = 0; float procpcpu = 0; char procstat[8]; +#ifdef PS_USES_PROCETIME char procetime[MAX_INPUT_BUFFER]; +#endif /* PS_USES_PROCETIME */ char procprog[MAX_INPUT_BUFFER]; char *procargs; int pos, cols; 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); + /* Parse extra opts if any */ + argv=np_extra_opts (&argc, argv, progname); + 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... */ @@ -81,58 +101,51 @@ main (int argc, char **argv) /* open the status log */ fp = fopen (status_log, "r"); if (fp == NULL) { - printf (_("CRITICAL - Cannot open status log for reading!\n")); - return STATE_CRITICAL; + die (STATE_CRITICAL, "NAGIOS %s: %s\n", _("CRITICAL"), _("Cannot open status log for reading!")); } /* get the date/time of the last item updated in the log */ while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, fp)) { - temp_ptr = strtok (input_buffer, "]"); - temp_entry_time = - (temp_ptr == NULL) ? 0L : strtoul (temp_ptr + 1, NULL, 10); - if (temp_entry_time > latest_entry_time) + if ((temp_ptr = strstr (input_buffer, "created=")) != NULL) { + temp_entry_time = strtoul (temp_ptr + 8, NULL, 10); latest_entry_time = temp_entry_time; + break; + } else if ((temp_ptr = strtok (input_buffer, "]")) != NULL) { + temp_entry_time = strtoul (temp_ptr + 1, NULL, 10); + if (temp_entry_time > latest_entry_time) + latest_entry_time = temp_entry_time; + } } fclose (fp); if (verbose >= 2) - printf(_("command: %s\n"), PS_COMMAND); + 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,36 +158,36 @@ 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 */ alarm (0); if (proc_entries == 0) { - printf (_("Could not locate a running Nagios process!\n")); - return STATE_CRITICAL; + die (STATE_CRITICAL, "NAGIOS %s: %s\n", _("CRITICAL"), _("Could not locate a running Nagios process!")); } - result = STATE_OK; + if (latest_entry_time == 0L) { + die (STATE_CRITICAL, "NAGIOS %s: %s\n", _("CRITICAL"), _("Cannot parse Nagios log file for valid time")); + } time (¤t_time); - if ((int)(current_time - latest_entry_time) > (expire_minutes * 60)) + if ((int)(current_time - latest_entry_time) > (expire_minutes * 60)) { result = STATE_WARNING; + } else { + result = STATE_OK; + } - printf - (_("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), - ((int) (current_time - latest_entry_time) == 1) ? "" : "s"); + printf ("NAGIOS %s: ", (result == STATE_OK) ? _("OK") : _("WARNING")); + printf (ngettext ("%d process", "%d processes", proc_entries), proc_entries); + printf (", "); + printf ( + ngettext ("status log updated %d second ago", + "status log updated %d seconds ago", + (int) (current_time - latest_entry_time) ), + (int) (current_time - latest_entry_time) ); + printf ("\n"); return result; } @@ -219,13 +232,11 @@ 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); case 'V': /* version */ - print_revision (progname, revision); + print_revision (progname, NP_VERSION); exit (STATE_OK); case 'F': /* status log */ status_log = optarg; @@ -243,16 +254,17 @@ process_arguments (int argc, char **argv) case 'v': verbose++; break; + default: /* print short usage_va statement if args not parsable */ + usage5(); } } 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; } @@ -262,31 +274,41 @@ process_arguments (int argc, char **argv) void print_help (void) { - print_revision (progname, revision); + print_revision (progname, NP_VERSION); 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")); + printf ("%s\n", _("This plugin checks the status of the Nagios process on the local machine")); + printf ("%s\n", _("The plugin will check to make sure the Nagios status log is no older than")); + printf ("%s\n", _("the number of minutes specified by the expires option.")); + printf ("%s\n", _("It also checks the process table for a process matching the command argument.")); + + printf ("\n\n"); print_usage (); - printf (_(UT_HELP_VRSN)); + printf (UT_HELP_VRSN); + printf (UT_EXTRA_OPTS); + + printf (" %s\n", "-F, --filename=FILE"); + printf (" %s\n", _("Name of the log file to check")); + printf (" %s\n", "-e, --expires=INTEGER"); + printf (" %s\n", _("Minutes aging after which logfile is considered stale")); + printf (" %s\n", "-C, --command=STRING"); + printf (" %s\n", _("Substring to search for in process arguments")); + printf (UT_VERBOSE); + +#ifdef NP_EXTRA_OPTS + printf ("\n"); + printf ("%s\n", _("Notes:")); + printf (UT_EXTRA_OPTS_NOTES); +#endif - 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 ("\n"); + printf ("%s\n", _("Examples:")); + printf (" %s\n", "check_nagios -e 5 -F /usr/local/nagios/var/status.log -C /usr/local/nagios/bin/nagios"); - printf (_("\ -Example:\n\ - ./check_nagios -e 5 -F /usr/local/nagios/var/status.log -C /usr/local/nagios/bin/nagios\n")); + printf (UT_SUPPORT); } @@ -294,6 +316,6 @@ Example:\n\ void print_usage (void) { - printf ("\ -Usage: %s -F -e -C \n", progname); + printf (_("Usage:")); + printf ("%s -F -e -C \n", progname); }