Back to index

nagios-plugins  1.4.16
Defines | Enumerations | Functions | Variables
check_ping.c File Reference
#include "common.h"
#include "netutils.h"
#include "popen.h"
#include "utils.h"

Go to the source code of this file.

Defines

#define WARN_DUPLICATES   "DUPLICATES FOUND! "
#define UNKNOWN_TRIP_TIME   -1.0 /* -1 seconds */

Enumerations

enum  { UNKNOWN_PACKET_LOSS = 200, DEFAULT_MAX_PACKETS = 5 }

Functions

int process_arguments (int, char **)
int get_threshold (char *, float *, int *)
int validate_arguments (void)
int run_ping (const char *cmd, const char *addr)
int error_scan (char buf[MAX_INPUT_BUFFER], const char *addr)
void print_usage (void)
void print_help (void)
int main (int argc, char **argv)

Variables

const char * progname = "check_ping"
const char * copyright = "2000-2007"
const char * email = "nagiosplug-devel@lists.sourceforge.net"
int display_html = FALSE
int wpl = UNKNOWN_PACKET_LOSS
int cpl = UNKNOWN_PACKET_LOSS
float wrta = UNKNOWN_TRIP_TIME
float crta = UNKNOWN_TRIP_TIME
char ** addresses = NULL
int n_addresses = 0
int max_addr = 1
int max_packets = -1
int verbose = 0
float rta = UNKNOWN_TRIP_TIME
int pl = UNKNOWN_PACKET_LOSS
char * warn_text

Define Documentation

#define UNKNOWN_TRIP_TIME   -1.0 /* -1 seconds */

Definition at line 41 of file check_ping.c.

#define WARN_DUPLICATES   "DUPLICATES FOUND! "

Definition at line 40 of file check_ping.c.


Enumeration Type Documentation

anonymous enum
Enumerator:
UNKNOWN_PACKET_LOSS 
DEFAULT_MAX_PACKETS 

Definition at line 43 of file check_ping.c.

     {
       UNKNOWN_PACKET_LOSS = 200,    /* 200% */
       DEFAULT_MAX_PACKETS = 5       /* default no. of ICMP ECHO packets */
};

Function Documentation

int error_scan ( char  buf[MAX_INPUT_BUFFER],
const char *  addr 
)

Definition at line 514 of file check_ping.c.

{
       if (strstr (buf, "Network is unreachable") ||
              strstr (buf, "Destination Net Unreachable")
              )
              die (STATE_CRITICAL, _("CRITICAL - Network Unreachable (%s)\n"), addr);
       else if (strstr (buf, "Destination Host Unreachable"))
              die (STATE_CRITICAL, _("CRITICAL - Host Unreachable (%s)\n"), addr);
       else if (strstr (buf, "Destination Port Unreachable"))
              die (STATE_CRITICAL, _("CRITICAL - Bogus ICMP: Port Unreachable (%s)\n"), addr);
       else if (strstr (buf, "Destination Protocol Unreachable"))
              die (STATE_CRITICAL, _("CRITICAL - Bogus ICMP: Protocol Unreachable (%s)\n"), addr);
       else if (strstr (buf, "Destination Net Prohibited"))
              die (STATE_CRITICAL, _("CRITICAL - Network Prohibited (%s)\n"), addr);
       else if (strstr (buf, "Destination Host Prohibited"))
              die (STATE_CRITICAL, _("CRITICAL - Host Prohibited (%s)\n"), addr);
       else if (strstr (buf, "Packet filtered"))
              die (STATE_CRITICAL, _("CRITICAL - Packet Filtered (%s)\n"), addr);
       else if (strstr (buf, "unknown host" ))
              die (STATE_CRITICAL, _("CRITICAL - Host not found (%s)\n"), addr);
       else if (strstr (buf, "Time to live exceeded"))
              die (STATE_CRITICAL, _("CRITICAL - Time to live exceeded (%s)\n"), addr);
       else if (strstr (buf, "Destination unreachable: "))
              die (STATE_CRITICAL, _("CRITICAL - Destination Unreachable (%s)\n"), addr);

       if (strstr (buf, "(DUP!)") || strstr (buf, "DUPLICATES FOUND")) {
              if (warn_text == NULL)
                     warn_text = strdup (_(WARN_DUPLICATES));
              else if (! strstr (warn_text, _(WARN_DUPLICATES)) &&
                       asprintf (&warn_text, "%s %s", warn_text, _(WARN_DUPLICATES)) == -1)
                     die (STATE_UNKNOWN, _("Unable to realloc warn_text\n"));
              return (STATE_WARNING);
       }

       return (STATE_OK);
}

Here is the call graph for this function:

int get_threshold ( char *  arg,
float *  trta,
int *  tpl 
)

Definition at line 363 of file check_ping.c.

{
       if (is_intnonneg (arg) && sscanf (arg, "%f", trta) == 1)
              return OK;
       else if (strpbrk (arg, ",:") && strstr (arg, "%") && sscanf (arg, "%f%*[:,]%d%%", trta, tpl) == 2)
              return OK;
       else if (strstr (arg, "%") && sscanf (arg, "%d%%", tpl) == 1)
              return OK;

       usage2 (_("%s: Warning threshold must be integer or percentage!\n\n"), arg);
       return STATE_UNKNOWN;
}

Here is the call graph for this function:

int main ( int  argc,
char **  argv 
)

Definition at line 75 of file check_ping.c.

{
       char *cmd = NULL;
       char *rawcmd = NULL;
       int result = STATE_UNKNOWN;
       int this_result = STATE_UNKNOWN;
       int i;

       setlocale (LC_ALL, "");
       setlocale (LC_NUMERIC, "C");
       bindtextdomain (PACKAGE, LOCALEDIR);
       textdomain (PACKAGE);

       addresses = malloc (sizeof(char*) * max_addr);
       addresses[0] = NULL;

       /* Parse extra opts if any */
       argv=np_extra_opts (&argc, argv, progname);

       if (process_arguments (argc, argv) == ERROR)
              usage4 (_("Could not parse arguments"));

       /* Set signal handling and alarm */
       if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) {
              usage4 (_("Cannot catch SIGALRM"));
       }

       /* If ./configure finds ping has timeout values, set plugin alarm slightly
        * higher so that we can use response from command line ping */
#if defined(PING_PACKETS_FIRST) && defined(PING_HAS_TIMEOUT)
       alarm (timeout_interval + 1);
#else
       alarm (timeout_interval);
#endif

       for (i = 0 ; i < n_addresses ; i++) {

#ifdef PING6_COMMAND
              if (address_family != AF_INET && is_inet6_addr(addresses[i]))
                     rawcmd = strdup(PING6_COMMAND);
              else
                     rawcmd = strdup(PING_COMMAND);
#else
              rawcmd = strdup(PING_COMMAND);
#endif

              /* does the host address of number of packets argument come first? */
#ifdef PING_PACKETS_FIRST
# ifdef PING_HAS_TIMEOUT
              asprintf (&cmd, rawcmd, timeout_interval, max_packets, addresses[i]);
# else
              asprintf (&cmd, rawcmd, max_packets, addresses[i]);
# endif
#else
              asprintf (&cmd, rawcmd, addresses[i], max_packets);
#endif

              if (verbose >= 2)
                     printf ("CMD: %s\n", cmd);

              /* run the command */
              this_result = run_ping (cmd, addresses[i]);

              if (pl == UNKNOWN_PACKET_LOSS || rta < 0.0) {
                     printf ("%s\n", cmd);
                     die (STATE_UNKNOWN,
                                _("CRITICAL - Could not interpret output from ping command\n"));
              }

              if (pl >= cpl || rta >= crta || rta < 0)
                     this_result = STATE_CRITICAL;
              else if (pl >= wpl || rta >= wrta)
                     this_result = STATE_WARNING;
              else if (pl >= 0 && rta >= 0)
                     this_result = max_state (STATE_OK, this_result);

              if (n_addresses > 1 && this_result != STATE_UNKNOWN)
                     die (STATE_OK, "%s is alive\n", addresses[i]);

              if (display_html == TRUE)
                     printf ("<A HREF='%s/traceroute.cgi?%s'>", CGIURL, addresses[i]);
              if (pl == 100)
                     printf (_("PING %s - %sPacket loss = %d%%"), state_text (this_result), warn_text,
                                                 pl);
              else
                     printf (_("PING %s - %sPacket loss = %d%%, RTA = %2.2f ms"),
                                                 state_text (this_result), warn_text, pl, rta);
              if (display_html == TRUE)
                     printf ("</A>");

              /* Print performance data */
              printf("|%s", fperfdata ("rta", (double) rta, "ms",
                                        wrta>0?TRUE:FALSE, wrta,
                                        crta>0?TRUE:FALSE, crta,
                                        TRUE, 0, FALSE, 0));
              printf(" %s\n", perfdata ("pl", (long) pl, "%",
                                        wpl>0?TRUE:FALSE, wpl,
                                        cpl>0?TRUE:FALSE, cpl,
                                        TRUE, 0, FALSE, 0));

              if (verbose >= 2)
                     printf ("%f:%d%% %f:%d%%\n", wrta, wpl, crta, cpl);

              result = max_state (result, this_result);
              free (rawcmd);
              free (cmd);
       }

       return result;
}

Here is the call graph for this function:

void print_help ( void  )
void print_usage ( void  )

Definition at line 389 of file check_cpqarray.c.

{
  printf("cpqarrayd [options]\n");
  printf("   -h         prints this text\n");
  printf("   -d         enables debugging\n");
}
int process_arguments ( int  argc,
char **  argv 
)
int run_ping ( const char *  cmd,
const char *  addr 
)

Definition at line 431 of file check_ping.c.

{
       char buf[MAX_INPUT_BUFFER];
       int result = STATE_UNKNOWN;
       int match;

       if ((child_process = spopen (cmd)) == NULL)
              die (STATE_UNKNOWN, _("Could not open pipe: %s\n"), cmd);

       child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r");
       if (child_stderr == NULL)
              printf (_("Cannot open stderr for %s\n"), cmd);

       while (fgets (buf, MAX_INPUT_BUFFER - 1, child_process)) {

              if (verbose >= 3)
                     printf("Output: %s", buf);

              result = max_state (result, error_scan (buf, addr));

              /* get the percent loss statistics */
              match = 0;
              if((sscanf(buf,"%*d packets transmitted, %*d packets received, +%*d errors, %d%% packet loss%n",&pl,&match) && match) ||
                      (sscanf(buf,"%*d packets transmitted, %*d packets received, +%*d duplicates, %d%% packet loss%n",&pl,&match) && match) ||
                      (sscanf(buf,"%*d packets transmitted, %*d received, +%*d duplicates, %d%% packet loss%n",&pl,&match) && match) ||
                      (sscanf(buf,"%*d packets transmitted, %*d packets received, %d%% packet loss%n",&pl,&match) && match) ||
                      (sscanf(buf,"%*d packets transmitted, %*d packets received, %d%% loss, time%n",&pl,&match) && match) ||
                      (sscanf(buf,"%*d packets transmitted, %*d received, %d%% loss, time%n",&pl,&match) && match) ||
                      (sscanf(buf,"%*d packets transmitted, %*d received, %d%% packet loss, time%n",&pl,&match) && match) ||
                      (sscanf(buf,"%*d packets transmitted, %*d received, +%*d errors, %d%% packet loss%n",&pl,&match) && match) ||
                      (sscanf(buf,"%*d packets transmitted %*d received, +%*d errors, %d%% packet loss%n",&pl,&match) && match)
                      )
                     continue;

              /* get the round trip average */
              else
                     if((sscanf(buf,"round-trip min/avg/max = %*f/%f/%*f%n",&rta,&match) && match) ||
                             (sscanf(buf,"round-trip min/avg/max/mdev = %*f/%f/%*f/%*f%n",&rta,&match) && match) ||
                             (sscanf(buf,"round-trip min/avg/max/sdev = %*f/%f/%*f/%*f%n",&rta,&match) && match) ||
                             (sscanf(buf,"round-trip min/avg/max/stddev = %*f/%f/%*f/%*f%n",&rta,&match) && match) ||
                             (sscanf(buf,"round-trip min/avg/max/std-dev = %*f/%f/%*f/%*f%n",&rta,&match) && match) ||
                             (sscanf(buf,"round-trip (ms) min/avg/max = %*f/%f/%*f%n",&rta,&match) && match) ||
                             (sscanf(buf,"round-trip (ms) min/avg/max/stddev = %*f/%f/%*f/%*f%n",&rta,&match) && match) ||
                             (sscanf(buf,"rtt min/avg/max/mdev = %*f/%f/%*f/%*f ms%n",&rta,&match) && match))
                     continue;
       }

       /* this is needed because there is no rta if all packets are lost */
       if (pl == 100)
              rta = crta;

       /* check stderr, setting at least WARNING if there is output here */
       /* Add warning into warn_text */
       while (fgets (buf, MAX_INPUT_BUFFER - 1, child_stderr)) {
              if (! strstr(buf,"WARNING - no SO_TIMESTAMP support, falling back to SIOCGSTAMP")) {
                     if (verbose >= 3) {
                            printf("Got stderr: %s", buf);
                     }
                     if ((result=error_scan(buf, addr)) == STATE_OK) {
                            result = STATE_WARNING;
                            if (warn_text == NULL) {
                                   warn_text = strdup(_("System call sent warnings to stderr "));
                            } else {
                                   asprintf(&warn_text, "%s %s", warn_text, _("System call sent warnings to stderr "));
                            }
                     }
              }
       }

       (void) fclose (child_stderr);


       spclose (child_process);

       if (warn_text == NULL)
              warn_text = strdup("");

       return result;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int validate_arguments ( void  )

Variable Documentation

char** addresses = NULL

Definition at line 61 of file check_ping.c.

const char* copyright = "2000-2007"

Definition at line 32 of file check_ping.c.

Definition at line 58 of file check_ping.c.

Definition at line 60 of file check_ping.c.

Definition at line 56 of file check_ping.c.

const char* email = "nagiosplug-devel@lists.sourceforge.net"

Definition at line 33 of file check_ping.c.

int max_addr = 1

Definition at line 63 of file check_ping.c.

int max_packets = -1

Definition at line 64 of file check_ping.c.

int n_addresses = 0

Definition at line 62 of file check_ping.c.

Definition at line 68 of file check_ping.c.

const char* progname = "check_ping"

Definition at line 31 of file check_ping.c.

Definition at line 67 of file check_ping.c.

int verbose = 0

Definition at line 65 of file check_ping.c.

char* warn_text

Definition at line 70 of file check_ping.c.

Definition at line 57 of file check_ping.c.

Definition at line 59 of file check_ping.c.