Code

Fix to parsing of uptime (Ronald Tin - 1254656)
[nagiosplug.git] / plugins / check_fping.c
index 0753cf3d1ab8122be6091dd41104c1a8ef587ccb..5ffcd16e35ed3a02bcc9fafd61b7b0774720ba33 100644 (file)
@@ -1,35 +1,26 @@
 /******************************************************************************
-*
-* 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 (from 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.
+
+ $Id$
 ******************************************************************************/
 
 const char *progname = "check_fping";
 const char *revision = "$Revision$";
-const char *copyright = "1999-2003";
+const char *copyright = "2000-2004";
 const char *email = "nagiosplug-devel@lists.sourceforge.net";
 
 #include "common.h"
@@ -37,13 +28,12 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net";
 #include "netutils.h"
 #include "utils.h"
 
-#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 **);
@@ -52,17 +42,23 @@ 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)
 {
+/* normaly should be   int result = STATE_UNKNOWN; */
+
        int status = STATE_UNKNOWN;
        char *server = NULL;
        char *command_line = NULL;
@@ -74,7 +70,7 @@ main (int argc, char **argv)
        textdomain (PACKAGE);
 
        if (process_arguments (argc, argv) == ERROR)
-               usage (_("Could not parse arguments\n"));
+               usage4 (_("Could not parse arguments"));
 
        server = strscpy (server, server_name);
 
@@ -88,7 +84,7 @@ 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 (_("Could not open pipe: %s\n"), command_line);
                return STATE_UNKNOWN;
        }
 
@@ -124,7 +120,6 @@ main (int argc, char **argv)
 
 
 
-
 int
 textscan (char *buf)
 {
@@ -135,16 +130,16 @@ textscan (char *buf)
        int status = STATE_UNKNOWN;
 
        if (strstr (buf, "not found")) {
-               die (STATE_CRITICAL, _("FPING unknown - %s not found\n"), server_name);
+               die (STATE_CRITICAL, _("FPING UNKNOW - %s not found\n"), server_name);
 
        }
        else if (strstr (buf, "is unreachable") || strstr (buf, "Unreachable")) {
-               die (STATE_CRITICAL, _("FPING critical - %s is unreachable\n"),
+               die (STATE_CRITICAL, _("FPING CRITICAL - %s is unreachable\n"),
                                                         "host");
 
        }
        else if (strstr (buf, "is down")) {
-               die (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")) {
@@ -160,18 +155,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 <= 0 && 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 >= 0 && rta > wrta)
+               else if (wrta_p == TRUE && rta > wrta)
                        status = STATE_WARNING;
                else
                        status = STATE_OK;
-               die (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", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, TRUE, 0, TRUE, 100),
+                    fperfdata ("rta", rta/1.0e3, "s", wrta_p, wrta/1.0e3, crta_p, crta/1.0e3, TRUE, 0, FALSE, 0));
 
        }
        else if(strstr (buf, "xmt/rcv/%loss") ) {
@@ -182,15 +180,16 @@ textscan (char *buf)
                loss = strtod (losstr, NULL);
                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;
-               
-               die (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", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, TRUE, 0, TRUE, 100));
        
        }
        else {
@@ -199,7 +198,6 @@ textscan (char *buf)
 
        return status;
 }
-\f
 
 
 
@@ -244,9 +242,7 @@ process_arguments (int argc, char **argv)
 
                switch (c) {
                case '?':                                                                       /* print short usage statement if args not parsable */
-                       printf (_("%s: Unknown argument: %s\n\n"), progname, optarg);
-                       print_usage ();
-                       exit (STATE_UNKNOWN);
+                       usage2 (_("Unknown argument"), optarg);
                case 'h':                                                                       /* help */
                        print_help ();
                        exit (STATE_OK);
@@ -258,9 +254,7 @@ process_arguments (int argc, char **argv)
                        break;
                case 'H':                                                                       /* hostname */
                        if (is_host (optarg) == FALSE) {
-                               printf (_("Invalid host name/address\n\n"));
-                               print_usage ();
-                               exit (STATE_UNKNOWN);
+                               usage2 (_("Invalid hostname/address"), optarg);
                        }
                        server_name = strscpy (server_name, optarg);
                        break;
@@ -268,10 +262,12 @@ process_arguments (int argc, char **argv)
                        get_threshold (optarg, rv);
                        if (rv[RTA]) {
                                crta = strtod (rv[RTA], NULL);
+                               crta_p = TRUE;
                                rv[RTA] = NULL;
                        }
                        if (rv[PL]) {
                                cpl = atoi (rv[PL]);
+                               cpl_p = TRUE;
                                rv[PL] = NULL;
                        }
                        break;
@@ -279,10 +275,12 @@ process_arguments (int argc, char **argv)
                        get_threshold (optarg, rv);
                        if (rv[RTA]) {
                                wrta = strtod (rv[RTA], NULL);
+                               wrta_p = TRUE;
                                rv[RTA] = NULL;
                        }
                        if (rv[PL]) {
                                wpl = atoi (rv[PL]);
+                               wpl_p = TRUE;
                                rv[PL] = NULL;
                        }
                        break;
@@ -301,17 +299,13 @@ process_arguments (int argc, char **argv)
                }
        }
 
-
        if (server_name == NULL)
-               usage (_("Host name was not supplied\n\n"));
+               usage4 (_("Hostname was not supplied"));
 
        return OK;
 }
 
 
-
-
-
 int
 get_threshold (char *arg, char *rv[2])
 {
@@ -353,21 +347,19 @@ get_threshold (char *arg, char *rv[2])
 }
 
 
-
-
-
-\f
 void
 print_help (void)
 {
 
-       print_revision (progname, "$Revision$");
+       print_revision (progname, revision);
+
+       printf ("Copyright (c) 1999 Didi Rieder <adrieder@sbox.tu-graz.ac.at>\n");
+       printf (COPYRIGHT, copyright, email);
 
        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"));
+This plugin will use the /bin/fping command to ping the specified host\n\
+for a fast check if the host is alive.\n\
+Note that it is necessary to set the suid flag on fping.\n\n"));
 
        print_usage ();
 
@@ -398,11 +390,8 @@ percentage of packet loss to trigger an alarm state.\n"));
 }
 
 
-
-
 void
 print_usage (void)
 {
-       printf (_("Usage: %s <host_address>\n"), progname);
-       printf (_(UT_HLP_VRS), progname, progname);
+       printf ("Usage: %s <host_address>\n", progname);
 }