X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fpowerdns.c;h=a140a126a98380b5277ed352d1adee51c9e2bf49;hb=HEAD;hp=8799702792f27efa34cbed6e84aa354b0fe698f4;hpb=5137825deeb5d4a5b763185f45b3916ccc49340d;p=collectd.git diff --git a/src/powerdns.c b/src/powerdns.c index 87997027..a140a126 100644 --- a/src/powerdns.c +++ b/src/powerdns.c @@ -46,12 +46,12 @@ #define FUNC_ERROR(func) do { char errbuf[1024]; ERROR ("powerdns plugin: %s failed: %s", func, sstrerror (errno, errbuf, sizeof (errbuf))); } while (0) #define SERVER_SOCKET LOCALSTATEDIR"/run/pdns.controlsocket" -#define SERVER_COMMAND "SHOW *" +#define SERVER_COMMAND "SHOW * \n" #define RECURSOR_SOCKET LOCALSTATEDIR"/run/pdns_recursor.controlsocket" #define RECURSOR_COMMAND "get noerror-answers nxdomain-answers " \ "servfail-answers sys-msec user-msec qa-latency cache-entries cache-hits " \ - "cache-misses questions" + "cache-misses questions\n" struct list_item_s; typedef struct list_item_s list_item_t; @@ -164,13 +164,13 @@ statname_lookup_t lookup_table[] = /* {{{ */ {"latency", "latency", NULL}, /* Other stuff.. */ - {"corrupt-packets", "io_packets", "corrupt"}, + {"corrupt-packets", "ipt_packets", "corrupt"}, {"deferred-cache-inserts", "counter", "cache-deferred_insert"}, {"deferred-cache-lookup", "counter", "cache-deferred_lookup"}, {"qsize-a", "cache_size", "answers"}, {"qsize-q", "cache_size", "questions"}, - {"servfail-packets", "io_packets", "servfail"}, - {"timedout-packets", "io_packets", "timeout"}, + {"servfail-packets", "ipt_packets", "servfail"}, + {"timedout-packets", "ipt_packets", "timeout"}, {"udp4-answers", "dns_answer", "udp4"}, {"udp4-queries", "dns_question", "queries-udp4"}, {"udp6-answers", "dns_answer", "udp6"}, @@ -321,6 +321,9 @@ static int powerdns_get_data_dgram (list_item_t *item, /* {{{ */ struct sockaddr_un sa_unix; + struct timeval stv_timeout; + cdtime_t cdt_timeout; + sd = socket (PF_UNIX, item->socktype, 0); if (sd < 0) { @@ -361,6 +364,19 @@ static int powerdns_get_data_dgram (list_item_t *item, /* {{{ */ break; } + cdt_timeout = plugin_get_interval () * 3 / 4; + if (cdt_timeout < TIME_T_TO_CDTIME_T (2)) + cdt_timeout = TIME_T_TO_CDTIME_T (2); + + CDTIME_T_TO_TIMEVAL (cdt_timeout, &stv_timeout); + + status = setsockopt (sd, SOL_SOCKET, SO_RCVTIMEO, &stv_timeout, sizeof (stv_timeout)); + if (status != 0) + { + FUNC_ERROR ("setsockopt"); + break; + } + status = connect (sd, (struct sockaddr *) &item->sockaddr, sizeof (item->sockaddr)); if (status != 0) @@ -427,6 +443,11 @@ static int powerdns_get_data_stream (list_item_t *item, /* {{{ */ return (-1); } + struct timeval timeout; + timeout.tv_sec=5; + timeout.tv_usec=0; + status = setsockopt (sd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof (timeout)); + status = connect (sd, (struct sockaddr *) &item->sockaddr, sizeof (item->sockaddr)); if (status != 0) @@ -519,7 +540,7 @@ static int powerdns_read_server (list_item_t *item) /* {{{ */ int fields_num; if (item->command == NULL) - item->command = strdup ("SHOW *"); + item->command = strdup (SERVER_COMMAND); if (item->command == NULL) { ERROR ("powerdns plugin: strdup failed."); @@ -600,7 +621,7 @@ static int powerdns_update_recursor_command (list_item_t *li) /* {{{ */ else { sstrncpy (buffer, "get ", sizeof (buffer)); - status = strjoin (&buffer[4], sizeof (buffer) - strlen ("get "), + status = strjoin (&buffer[strlen("get ")], sizeof (buffer) - strlen ("get "), li->fields, li->fields_num, /* seperator = */ " "); if (status < 0) @@ -608,6 +629,14 @@ static int powerdns_update_recursor_command (list_item_t *li) /* {{{ */ ERROR ("powerdns plugin: strjoin failed."); return (-1); } + buffer[sizeof (buffer) - 1] = 0; + int i = strlen (buffer); + if (i < sizeof (buffer) - 2) + { + buffer[i++] = ' '; + buffer[i++] = '\n'; + buffer[i++] = '\0'; + } } buffer[sizeof (buffer) - 1] = 0; @@ -892,11 +921,18 @@ static int powerdns_config (oconfig_item_t *ci) /* {{{ */ powerdns_config_add_server (option); else if (strcasecmp ("LocalSocket", option->key) == 0) { - char *temp = strdup (option->key); - if (temp == NULL) - return (1); - sfree (local_sockpath); - local_sockpath = temp; + if ((option->values_num != 1) || (option->values[0].type != OCONFIG_TYPE_STRING)) + { + WARNING ("powerdns plugin: `%s' needs exactly one string argument.", option->key); + } + else + { + char *temp = strdup (option->values[0].value.string); + if (temp == NULL) + return (1); + sfree (local_sockpath); + local_sockpath = temp; + } } else {