X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fcheck_fping.c;h=7b8e764fb0b490a50d997238d2ecb5d072586ad5;hb=a175e1b0ddafe74cdc425bab8cbd72617ddaacc4;hp=9a2dd5570ba2b3b73f41fc5ec6ac775c6b341c05;hpb=f4c6f7f09305c1c9916da6ac4f7aadcb31e319e0;p=nagiosplug.git diff --git a/plugins/check_fping.c b/plugins/check_fping.c index 9a2dd55..7b8e764 100644 --- a/plugins/check_fping.c +++ b/plugins/check_fping.c @@ -1,60 +1,56 @@ /****************************************************************************** -* -* CHECK_FPING.C -* -* Program: Fping plugin for Nagios -* License: GPL -* Copyright (c) 1999 Didi Rieder (adrieder@sbox.tu-graz.ac.at) -* $Id$ -* -* Modifications: -* -* 08-24-1999 Didi Rieder (adrieder@sbox.tu-graz.ac.at) -* Intial Coding -* 09-11-1999 Karl DeBisschop (kdebiss@alum.mit.edu) -* Change to spopen -* Fix so that state unknown is returned by default -* (formerly would give state ok if no fping specified) -* Add server_name to output -* Reformat to 80-character standard screen -* 11-18-1999 Karl DeBisschop (kdebiss@alum.mit.edu) -* set STATE_WARNING of stderr written or nonzero status returned -* -* Description: -* -* This plugin will use the /bin/fping command (form saint) to ping -* the specified host for a fast check if the host is alive. Note that -* it is necessary to set the suid flag on fping. + + 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. + ******************************************************************************/ -#include "config.h" +const char *progname = "check_fping"; +const char *revision = "$Revision$"; +const char *copyright = "2000-2003"; +const char *email = "nagiosplug-devel@lists.sourceforge.net"; + #include "common.h" #include "popen.h" +#include "netutils.h" #include "utils.h" -#define PROGNAME "check_fping" -#define PACKET_COUNT 1 -#define PACKET_SIZE 56 -#define UNKNOWN_PACKET_LOSS 200 /* 200% */ -#define UNKNOWN_TRIP_TIME -1.0 /* -1 seconds */ - -#define PL 0 -#define RTA 1 +enum { + PACKET_COUNT = 1, + PACKET_SIZE = 56, + PL = 0, + RTA = 1 +}; int textscan (char *buf); int process_arguments (int, char **); int get_threshold (char *arg, char *rv[2]); -void print_usage (void); void print_help (void); +void print_usage (void); char *server_name = NULL; -int cpl = UNKNOWN_PACKET_LOSS; -int wpl = UNKNOWN_PACKET_LOSS; -double crta = UNKNOWN_TRIP_TIME; -double wrta = UNKNOWN_TRIP_TIME; int packet_size = PACKET_SIZE; int packet_count = PACKET_COUNT; int verbose = FALSE; +int cpl; +int wpl; +double crta; +double wrta; +int cpl_p = FALSE; +int wpl_p = FALSE; +int crta_p = FALSE; +int wrta_p = FALSE; int main (int argc, char **argv) @@ -65,15 +61,18 @@ main (int argc, char **argv) char *input_buffer = NULL; input_buffer = malloc (MAX_INPUT_BUFFER); + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE, LOCALEDIR); + textdomain (PACKAGE); + if (process_arguments (argc, argv) == ERROR) - usage ("Could not parse arguments\n"); + usage (_("Could not parse arguments\n")); server = strscpy (server, server_name); /* compose the command */ - command_line = ssprintf - (command_line, "%s -b %d -c %d %s", - PATH_TO_FPING, packet_size, packet_count, server); + asprintf (&command_line, "%s -b %d -c %d %s", PATH_TO_FPING, + packet_size, packet_count, server); if (verbose) printf ("%s\n", command_line); @@ -81,13 +80,13 @@ main (int argc, char **argv) /* run the command */ child_process = spopen (command_line); if (child_process == NULL) { - printf ("Unable to open pipe: %s\n", command_line); + printf (_("Unable to open pipe: %s\n"), command_line); 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", command_line); + printf (_("Could not open stderr for %s\n"), command_line); } while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { @@ -128,16 +127,16 @@ textscan (char *buf) int status = STATE_UNKNOWN; if (strstr (buf, "not found")) { - terminate (STATE_CRITICAL, "FPING unknown - %s not found\n", server_name); + die (STATE_CRITICAL, _("FPING unknown - %s not found\n"), server_name); } else if (strstr (buf, "is unreachable") || strstr (buf, "Unreachable")) { - terminate (STATE_CRITICAL, "FPING critical - %s is unreachable\n", + die (STATE_CRITICAL, _("FPING critical - %s is unreachable\n"), "host"); } else if (strstr (buf, "is down")) { - terminate (STATE_CRITICAL, "FPING critical - %s is down\n", server_name); + die (STATE_CRITICAL, _("FPING critical - %s is down\n"), server_name); } else if (strstr (buf, "is alive")) { @@ -153,18 +152,21 @@ textscan (char *buf) rtastr = 1 + index (rtastr, '/'); loss = strtod (losstr, NULL); rta = strtod (rtastr, NULL); - if (cpl != UNKNOWN_PACKET_LOSS && loss > cpl) + if (cpl_p == TRUE && loss > cpl) status = STATE_CRITICAL; - else if (crta != UNKNOWN_TRIP_TIME && rta > crta) + else if (crta_p == TRUE && rta > crta) status = STATE_CRITICAL; - else if (wpl != UNKNOWN_PACKET_LOSS && loss > wpl) + else if (wpl_p == TRUE && loss > wpl) status = STATE_WARNING; - else if (wrta != UNKNOWN_TRIP_TIME && rta > wrta) + else if (wrta_p == TRUE && rta > wrta) status = STATE_WARNING; else status = STATE_OK; - terminate (status, "FPING %s - %s (loss=%f%%, rta=%f ms)\n", - state_text (status), server_name, loss, rta); + die (status, + _("FPING %s - %s (loss=%.0f%%, rta=%f ms)|%s %s\n"), + state_text (status), server_name, loss, rta, + perfdata ("loss", (int)loss, "%", wpl_p, wpl, cpl_p, cpl, TRUE, 0, TRUE, 100), + perfdata ("rta", (long int)(rta*1.0e3), "us", wrta_p, (long int)(wrta*1.0e3), crta_p, (long int)(crta*1.0e3), TRUE, 0, FALSE, 0)); } else if(strstr (buf, "xmt/rcv/%loss") ) { @@ -173,17 +175,18 @@ textscan (char *buf) losstr = 1 + strstr (losstr, "/"); losstr = 1 + strstr (losstr, "/"); loss = strtod (losstr, NULL); - if (loss == 100) + if (atoi(losstr) == 100) status = STATE_CRITICAL; - else if (cpl != UNKNOWN_PACKET_LOSS && loss > cpl) + else if (cpl_p == TRUE && loss > cpl) status = STATE_CRITICAL; - else if (wpl != UNKNOWN_PACKET_LOSS && loss > wpl) + else if (wpl_p == TRUE && loss > wpl) status = STATE_WARNING; else status = STATE_OK; - - terminate (status, "FPING %s - %s (loss=%f%% )\n", - state_text (status), server_name, loss ); + /* loss=%.0f%%;%d;%d;0;100 */ + die (status, _("FPING %s - %s (loss=%.0f%% )|%s\n"), + state_text (status), server_name, loss , + perfdata ("loss", (int)loss, "%", wpl_p, wpl, cpl_p, cpl, TRUE, 0, TRUE, 100)); } else { @@ -192,7 +195,7 @@ textscan (char *buf) return status; } - + @@ -203,9 +206,8 @@ process_arguments (int argc, char **argv) int c; char *rv[2]; -#ifdef HAVE_GETOPT_H - int option_index = 0; - static struct option long_options[] = { + int option = 0; + static struct option longopts[] = { {"hostname", required_argument, 0, 'H'}, {"critical", required_argument, 0, 'c'}, {"warning", required_argument, 0, 'w'}, @@ -216,7 +218,6 @@ process_arguments (int argc, char **argv) {"help", no_argument, 0, 'h'}, {0, 0, 0, 0} }; -#endif rv[PL] = NULL; rv[RTA] = NULL; @@ -232,33 +233,28 @@ process_arguments (int argc, char **argv) } while (1) { -#ifdef HAVE_GETOPT_H - c = - getopt_long (argc, argv, "+hVvH:c:w:b:n:", long_options, &option_index); -#else - c = getopt (argc, argv, "+hVvH:c:w:b:n:"); -#endif + c = getopt_long (argc, argv, "+hVvH:c:w:b:n:", 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: %s\n\n", my_basename (argv[0]), optarg); + printf (_("%s: Unknown argument: %s\n\n"), progname, optarg); print_usage (); exit (STATE_UNKNOWN); case 'h': /* help */ print_help (); exit (STATE_OK); case 'V': /* version */ - print_revision (my_basename (argv[0]), "$Revision$"); + print_revision (progname, revision); exit (STATE_OK); case 'v': /* verbose mode */ verbose = TRUE; break; case 'H': /* hostname */ if (is_host (optarg) == FALSE) { - printf ("Invalid host name/address\n\n"); + printf (_("Invalid host name/address\n\n")); print_usage (); exit (STATE_UNKNOWN); } @@ -267,22 +263,26 @@ process_arguments (int argc, char **argv) case 'c': get_threshold (optarg, rv); if (rv[RTA]) { - crta = strtod (rv[RTA], NULL); + crta = 1e3 * strtod (rv[RTA], NULL); + crta_p = TRUE; rv[RTA] = NULL; } if (rv[PL]) { cpl = atoi (rv[PL]); + cpl_p = TRUE; rv[PL] = NULL; } break; case 'w': get_threshold (optarg, rv); if (rv[RTA]) { - wrta = strtod (rv[RTA], NULL); + wrta = 1e3 * strtod (rv[RTA], NULL); + wrta_p = TRUE; rv[RTA] = NULL; } if (rv[PL]) { wpl = atoi (rv[PL]); + wpl_p = TRUE; rv[PL] = NULL; } break; @@ -290,20 +290,20 @@ process_arguments (int argc, char **argv) if (is_intpos (optarg)) packet_size = atoi (optarg); else - usage ("Packet size must be a positive integer"); + usage (_("Packet size must be a positive integer")); break; case 'n': /* number of packets */ if (is_intpos (optarg)) packet_count = atoi (optarg); else - usage ("Packet count must be a positive integer"); + usage (_("Packet count must be a positive integer")); break; } } if (server_name == NULL) - usage ("Host name was not supplied\n\n"); + usage (_("Host name was not supplied\n\n")); return OK; } @@ -325,13 +325,13 @@ get_threshold (char *arg, char *rv[2]) if (arg2) { arg1[strcspn (arg1, ",:")] = 0; if (strstr (arg1, "%") && strstr (arg2, "%")) - terminate (STATE_UNKNOWN, - "%s: Only one threshold may be packet loss (%s)\n", PROGNAME, + die (STATE_UNKNOWN, + _("%s: Only one threshold may be packet loss (%s)\n"), progname, arg); if (!strstr (arg1, "%") && !strstr (arg2, "%")) - terminate (STATE_UNKNOWN, - "%s: Only one threshold must be packet loss (%s)\n", - PROGNAME, arg); + die (STATE_UNKNOWN, + _("%s: Only one threshold must be packet loss (%s)\n"), + progname, arg); } if (arg2 && strstr (arg2, "%")) { @@ -355,52 +355,55 @@ get_threshold (char *arg, char *rv[2]) - + void -print_usage (void) +print_help (void) { - printf ("Usage: %s \n", PROGNAME); -} + print_revision (progname, "$Revision$"); + printf (_("Copyright (c) 1999 Didi Rieder \n")); + printf (_(COPYRIGHT), copyright, email); + printf (_("\ +This plugin will use the /bin/fping command (from saint) to ping the\n\ +specified host for a fast check if the host is alive. Note that it is\n\ +necessary to set the suid flag on fping.\n\n")); + print_usage (); -void -print_help (void) -{ + printf (_(UT_HELP_VRSN)); + + printf (_("\ + -H, --hostname=HOST\n\ + Name or IP Address of host to ping (IP Address bypasses name lookup,\n\ + reducing system load)\n\ + -w, --warning=THRESHOLD\n\ + warning threshold pair\n\ + -c, --critical=THRESHOLD\n\ + critical threshold pair\n\ + -b, --bytes=INTEGER\n\ + Size of ICMP packet (default: %d)\n\ + -n, --number=INTEGER\n\ + Number of ICMP packets to send (default: %d)\n"), + PACKET_SIZE, PACKET_COUNT); + + printf (_(UT_VERBOSE)); + + printf (_("\n\ +THRESHOLD is ,%% where is the round trip average travel\n\ +time (ms) which triggers a WARNING or CRITICAL state, and is the\n\ +percentage of packet loss to trigger an alarm state.\n")); + + printf (_(UT_SUPPORT)); +} - print_revision (PROGNAME, "$Revision$"); - printf - ("Copyright (c) 1999 Didi Rieder (adrieder@sbox.tu-graz.ac.at)\n\n" - "This plugin will use the /bin/fping command (from saint) to ping the\n" - "specified host for a fast check if the host is alive. Note that it is\n" - "necessary to set the suid flag on fping.\n\n"); - print_usage (); - printf - ("\nOptions:\n" - "-H, --hostname=HOST\n" - " Name or IP Address of host to ping (IP Address bypasses name lookup,\n" - " reducing system load)\n" - "-w, --warning=THRESHOLD\n" - " warning threshold pair\n" - "-c, --critical=THRESHOLD\n" - " critical threshold pair\n" - "-b, --bytes=INTEGER\n" - " Size of ICMP packet (default: %d)\n" - "-n, --number=INTEGER\n" - " Number of ICMP packets to send (default: %d)\n" - "-v, --verbose\n" - " Show details for command-line debugging (do not use with nagios server)\n" - "-h, --help\n" - " Print this help screen\n" - "-V, --version\n" - " Print version information\n" - "THRESHOLD is ,%% where is the round trip average travel\n" - "time (ms) which triggers a WARNING or CRITICAL state, and is the\n" - "percentage of packet loss to trigger an alarm state.\n", - PACKET_SIZE, PACKET_COUNT); +void +print_usage (void) +{ + printf (_("Usage: %s \n"), progname); + printf (_(UT_HLP_VRS), progname, progname); }