X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fping.c;h=91e0dbcc01072fd7601695349f08684adcd53523;hb=b1aae570f75a93f475814aa0753ecdb15f967767;hp=661aa65f07fd39d20104c9d1bc00e6697b12b2cc;hpb=d3b918437ab91f7ad9c12f9157c6a19f973a64c4;p=collectd.git diff --git a/src/ping.c b/src/ping.c index 661aa65f..91e0dbcc 100644 --- a/src/ping.c +++ b/src/ping.c @@ -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 @@ -24,25 +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 - -static char *hosts[MAX_PINGHOSTS]; -static int hosts_flags[MAX_PINGHOSTS]; -static int hosts_disable[MAX_PINGHOSTS]; -static int hosts_backoff[MAX_PINGHOSTS]; -static int num_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; @@ -50,44 +45,52 @@ static int ds_num = 1; static char *config_keys[] = { "Host", + "TTL", NULL }; -static int config_keys_num = 1; +static int config_keys_num = 2; static void ping_init (void) { - int i; - - for (i = 0; i < MAX_PINGHOSTS; i++) - { - hosts_flags[i] = 0; - hosts_disable[i] = 0; - hosts_backoff[i] = 1; - } - return; } 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: %s", + ping_get_error (pingobj)); + 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: %s", + ping_get_error (pingobj)); + return (1); + } } - else if ((hosts[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 { - hosts_flags[num_pinghosts] = 0; - num_pinghosts++; - return (0); + return (-1); } + + return (0); } static void ping_write (char *host, char *inst, char *val) @@ -105,11 +108,11 @@ static void ping_write (char *host, char *inst, char *val) } #define BUFSIZE 256 -static 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); @@ -118,56 +121,37 @@ static void ping_submit (int ping_time, char *host) static void ping_read (void) { - int ping; - int i; + pingobj_iter_t *iter; - for (i = 0; i < num_pinghosts; i++) + char *host; + double latency; + + if (pingobj == NULL) + return; + + if (ping_send (pingobj) < 0) { - if (hosts_disable[i] > 0) - { - hosts_disable[i]--; + syslog (LOG_ERR, "ping: `ping_send' failed: %s", + ping_get_error (pingobj)); + return; + } + + for (iter = ping_iterator_get (pingobj); iter != NULL; iter = ping_iterator_next (iter)) + { + const char *tmp; + + if ((tmp = ping_iterator_get_host (iter)) == NULL) + continue; + if ((host = strdup (tmp)) == NULL) continue; - } - - ping = tpinghost (hosts[i]); - switch (ping) - { - case 0: - if (!(hosts_flags[i] & 0x01)) - syslog (LOG_WARNING, "ping %s: Connection timed out.", hosts[i]); - hosts_flags[i] |= 0x01; - break; - - case -1: - if (!(hosts_flags[i] & 0x02)) - syslog (LOG_WARNING, "ping %s: Host or service is not reachable.", hosts[i]); - hosts_flags[i] |= 0x02; - break; - - case -2: - syslog (LOG_ERR, "ping %s: Socket error. Ping will be disabled for %i iteration(s).", - hosts[i], hosts_backoff[i]); - hosts_disable[i] = hosts_backoff[i]; - if (hosts_backoff[i] < 8192) /* 22 3/4 hours */ - hosts_backoff[i] *= 2; - hosts_flags[i] |= 0x10; - break; - - case -3: - if (!(hosts_flags[i] & 0x04)) - syslog (LOG_WARNING, "ping %s: Connection refused.", hosts[i]); - hosts_flags[i] |= 0x04; - break; - - default: - if (hosts_flags[i] != 0x00) - syslog (LOG_NOTICE, "ping %s: Back to normal: %ims.", hosts[i], ping); - hosts_flags[i] = 0x00; - hosts_backoff[i] = 1; - ping_submit (ping, hosts[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)