Updated all copyright-entries in header files.
[collectd.git] / src / ping.c
index 6a2b906..d82ce06 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * collectd - src/ping.c
- * Copyright (C) 2005  Florian octo Forster
+ * Copyright (C) 2005,2006  Florian octo Forster
  *
  * 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
 #include "common.h"
 #include "plugin.h"
 #include "configfile.h"
+#include "utils_debug.h"
 
 #define MODULE_NAME "ping"
 
 #include <netinet/in.h>
-#include "libping/ping.h"
+#include "liboping/liboping.h"
 
-#define MAX_PINGHOSTS 32
-
-extern char *pinghosts[MAX_PINGHOSTS];
-extern int   num_pinghosts;
-static int   pingerrors[MAX_PINGHOSTS];
+static pingobj_t *pingobj = NULL;
 
 static char *file_template = "ping-%s.rrd";
 
 static char *ds_def[] = 
 {
-       "DS:ping:GAUGE:25:0:65535",
+       "DS:ping:GAUGE:"COLLECTD_HEARTBEAT":0:65535",
        NULL
 };
 static int ds_num = 1;
@@ -48,43 +45,53 @@ static int ds_num = 1;
 static char *config_keys[] =
 {
        "Host",
+       "TTL",
        NULL
 };
-static int config_keys_num = 1;
+static int config_keys_num = 2;
 
-void ping_init (void)
+static void ping_init (void)
 {
-       int i;
-
-       for (i = 0; i < num_pinghosts; i++)
-               pingerrors[i] = 0;
-
        return;
 }
 
-int ping_config (char *key, char *value)
+static int ping_config (char *key, char *value)
 {
-       if (strcasecmp (key, "host"))
+       if (pingobj == NULL)
        {
-               return (-1);
+               if ((pingobj = ping_construct ()) == NULL)
+               {
+                       syslog (LOG_ERR, "ping: `ping_construct' failed.\n");
+                       return (1);
+               }
        }
-       else if (num_pinghosts >= MAX_PINGHOSTS)
+
+       if (strcasecmp (key, "host") == 0)
        {
-               return (1);
+               if (ping_host_add (pingobj, value) < 0)
+               {
+                       syslog (LOG_WARNING, "ping: `ping_host_add' failed.");
+                       return (1);
+               }
        }
-       else if ((pinghosts[num_pinghosts] = strdup (value)) == NULL)
+       else if (strcasecmp (key, "ttl") == 0)
        {
-               return (2);
+               int ttl = atoi (value);
+               if (ping_setopt (pingobj, PING_DEF_TIMEOUT, (void *) &ttl))
+               {
+                       syslog (LOG_WARNING, "ping: liboping did not accept the TTL value %i", ttl);
+                       return (1);
+               }
        }
        else
        {
-               pingerrors[num_pinghosts] = 0;
-               num_pinghosts++;
-               return (0);
+               return (-1);
        }
+
+       return (0);
 }
 
-void ping_write (char *host, char *inst, char *val)
+static void ping_write (char *host, char *inst, char *val)
 {
        char file[512];
        int status;
@@ -99,61 +106,49 @@ void ping_write (char *host, char *inst, char *val)
 }
 
 #define BUFSIZE 256
-void ping_submit (int ping_time, char *host)
+static void ping_submit (char *host, double latency)
 {
        char buf[BUFSIZE];
 
-       if (snprintf (buf, BUFSIZE, "%u:%u", (unsigned int) curtime, ping_time) >= BUFSIZE)
+       if (snprintf (buf, BUFSIZE, "%u:%f", (unsigned int) curtime, latency) >= BUFSIZE)
                return;
 
        plugin_submit (MODULE_NAME, host, buf);
 }
 #undef BUFSIZE
 
-void ping_read (void)
+static void ping_read (void)
 {
-       int ping;
-       int i;
+       pingobj_iter_t *iter;
+
+       char   *host;
+       double  latency;
 
-       for (i = 0; i < num_pinghosts; i++)
+       if (pingobj == NULL)
+               return;
+
+       if (ping_send (pingobj) < 0)
+       {
+               syslog (LOG_ERR, "ping: `ping_send' failed.");
+               return;
+       }
+
+       for (iter = ping_iterator_get (pingobj); iter != NULL; iter = ping_iterator_next (iter))
        {
-               if (pingerrors[i] & 0x30)
+               const char *tmp;
+
+               if ((tmp = ping_iterator_get_host (iter)) == NULL)
+                       continue;
+               if ((host = strdup (tmp)) == NULL)
                        continue;
-               
-               ping = tpinghost (pinghosts[i]);
 
-               switch (ping)
-               {
-                       case 0:
-                               if (!(pingerrors[i] & 0x01))
-                                       syslog (LOG_WARNING, "ping %s: Connection timed out.", pinghosts[i]);
-                               pingerrors[i] |= 0x01;
-                               break;
-
-                       case -1:
-                               if (!(pingerrors[i] & 0x02))
-                                       syslog (LOG_WARNING, "ping %s: Host or service is not reachable.", pinghosts[i]);
-                               pingerrors[i] |= 0x02;
-                               break;
-
-                       case -2:
-                               syslog (LOG_ERR, "ping %s: Socket error. Ping will be disabled.", pinghosts[i]);
-                               pingerrors[i] |= 0x10;
-                               break;
-
-                       case -3:
-                               if (!(pingerrors[i] & 0x04))
-                                       syslog (LOG_WARNING, "ping %s: Connection refused.", pinghosts[i]);
-                               pingerrors[i] |= 0x04;
-                               break;
-
-                       default:
-                               if (pingerrors[i] != 0x00)
-                                       syslog (LOG_NOTICE, "ping %s: Back to normal: %ims.", pinghosts[i], ping);
-                               pingerrors[i] = 0x00;
-                               ping_submit (ping, pinghosts[i]);
-               } /* switch (ping) */
-       } /* for (i = 0; i < num_pinghosts; i++) */
+               latency = ping_iterator_get_latency (iter);
+
+               DBG ("host = %s, latency = %f", host, latency);
+               ping_submit (host, latency);
+
+               free (host); host = NULL;
+       }
 }
 
 void module_register (void)