X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fping.c;h=69661708baeb1bd468f884643777b7c98ac3643f;hb=ed3b4a8fe6377817e1dadfbc713c4cc5c0bc4444;hp=6a2b9068c5201405ee8114ec160120c808d5724f;hpb=73681054cbff428d352d8ed707d24fab1bf67b24;p=collectd.git diff --git a/src/ping.c b/src/ping.c index 6a2b9068..69661708 100644 --- a/src/ping.c +++ b/src/ping.c @@ -24,23 +24,20 @@ #include "common.h" #include "plugin.h" #include "configfile.h" +#include "utils_debug.h" #define MODULE_NAME "ping" #include -#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)