#endif
#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 "/var/run/pdns.controlsocket"
+#define SERVER_SOCKET LOCALSTATEDIR"/run/pdns.controlsocket"
#define SERVER_COMMAND "SHOW *"
-#define RECURSOR_SOCKET "/var/run/pdns_recursor.controlsocket"
-#define RECURSOR_COMMAND "get all-outqueries answers0-1 " /* {{{ */ \
- "answers100-1000 answers10-100 answers1-10 answers-slow cache-entries " \
- "cache-hits cache-misses chain-resends client-parse-errors " \
- "concurrent-queries dlg-only-drops ipv6-outqueries negcache-entries " \
- "noerror-answers nsset-invalidations nsspeeds-entries nxdomain-answers " \
- "outgoing-timeouts qa-latency questions resource-limits " \
- "server-parse-errors servfail-answers spoof-prevents sys-msec " \
- "tcp-client-overflow tcp-outqueries tcp-questions throttled-out " \
- "throttled-outqueries throttle-entries unauthorized-tcp unauthorized-udp " \
- "unexpected-packets unreachables user-msec" /* }}} */
+#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"
struct list_item_s;
typedef struct list_item_s list_item_t;
{
enum
{
- SRV_AUTHORATIVE,
+ SRV_AUTHORITATIVE,
SRV_RECURSOR
} server_type;
int (*func) (list_item_t *item);
{"cache-misses", "cache_result", "miss"},
/* Total number of questions.. */
- {"questions", "dns_qtype", "total"}
-
- /* TODO: Add all recursor metrics here */
+ {"questions", "dns_qtype", "total"},
+
+ /* All the other stuff.. */
+ {"all-outqueries", "dns_question", "outgoing"},
+ {"answers0-1", "dns_answer", "0_1"},
+ {"answers1-10", "dns_answer", "1_10"},
+ {"answers10-100", "dns_answer", "10_100"},
+ {"answers100-1000", "dns_answer", "100_1000"},
+ {"answers-slow", "dns_answer", "slow"},
+ {"chain-resends", "dns_question", "chained"},
+ {"client-parse-errors", "counter", "drops-client_parse_error"},
+ {"concurrent-queries", "dns_question", "concurrent"},
+ {"dlg-only-drops", "counter", "drops-delegation_only"},
+ {"negcache-entries", "cache_size", "negative"},
+ {"nsspeeds-entries", "gauge", "entries-ns_speeds"},
+ {"nsset-invalidations", "counter", "ns_set_invalidation"},
+ {"outgoing-timeouts", "counter", "drops-timeout_outgoing"},
+ {"resource-limits", "counter", "drops-resource_limit"},
+ {"server-parse-errors", "counter", "drops-server_parse_error"},
+ {"spoof-prevents", "counter", "drops-spoofed"},
+ {"tcp-client-overflow", "counter", "denied-client_overflow_tcp"},
+ {"tcp-outqueries", "dns_question", "outgoing-tcp"},
+ {"tcp-questions", "dns_question", "incoming-tcp"},
+ {"throttled-out", "dns_question", "outgoing-throttled"},
+ {"throttle-entries", "gauge", "entries-throttle"},
+ {"unauthorized-tcp", "counter", "denied-unauthorized_tcp"},
+ {"unauthorized-udp", "counter", "denied-unauthorized_udp"},
+ {"unexpected-packets", "dns_answer", "unexpected"}
+ /* {"uptime", "", ""} */
}; /* }}} */
int lookup_table_length = STATIC_ARRAY_SIZE (lookup_table);
if (i >= lookup_table_length)
{
- DEBUG ("powerdns plugin: submit: Not found in lookup table: %s = %s;",
+ INFO ("powerdns plugin: submit: Not found in lookup table: %s = %s;",
pdns_type, value);
return;
}
return;
}
- if (ds->ds[0].type == DS_TYPE_GAUGE)
- {
- char *endptr = NULL;
-
- values[0].gauge = strtod (value, &endptr);
-
- if (endptr == value)
- {
- ERROR ("powerdns plugin: Cannot convert `%s' "
- "to a floating point number.", value);
- return;
- }
- }
- else
+ if (0 != parse_value (value, &values[0], ds->ds[0].type))
{
- char *endptr = NULL;
-
- values[0].counter = strtoll (value, &endptr, 0);
- if (endptr == value)
- {
- ERROR ("powerdns plugin: Cannot convert `%s' "
- "to an integer number.", value);
- return;
- }
+ ERROR ("powerdns plugin: Cannot convert `%s' "
+ "to a number.", value);
+ return;
}
vl.values = values;
vl.values_len = 1;
- vl.time = time (NULL);
sstrncpy (vl.host, hostname_g, sizeof (vl.host));
sstrncpy (vl.plugin, "powerdns", sizeof (vl.plugin));
+ sstrncpy (vl.type, type, sizeof (vl.type));
if (type_instance != NULL)
sstrncpy (vl.type_instance, type_instance, sizeof (vl.type_instance));
sstrncpy (vl.plugin_instance, plugin_instance, sizeof (vl.plugin_instance));
- plugin_dispatch_values (type, &vl);
+ plugin_dispatch_values (&vl);
} /* }}} static void submit */
static int powerdns_get_data_dgram (list_item_t *item, /* {{{ */
memset (&sa_unix, 0, sizeof (sa_unix));
sa_unix.sun_family = AF_UNIX;
- strncpy (sa_unix.sun_path,
+ sstrncpy (sa_unix.sun_path,
(local_sockpath != NULL) ? local_sockpath : PDNS_LOCAL_SOCKPATH,
sizeof (sa_unix.sun_path));
- sa_unix.sun_path[sizeof (sa_unix.sun_path) - 1] = 0;
status = unlink (sa_unix.sun_path);
if ((status != 0) && (errno != ENOENT))
FUNC_ERROR ("recv");
break;
}
+ buffer_size = status + 1;
status = 0;
} while (0);
if (status != 0)
return (-1);
- buffer_size = status + 1;
+ assert (buffer_size > 0);
buffer = (char *) malloc (buffer_size);
if (buffer == NULL)
{
return (-1);
}
- memcpy (buffer, temp, status);
- buffer[status] = 0;
+ memcpy (buffer, temp, buffer_size - 1);
+ buffer[buffer_size - 1] = 0;
*ret_buffer = buffer;
*ret_buffer_size = buffer_size;
}
else
{
- strcpy (buffer, "get ");
+ sstrncpy (buffer, "get ", sizeof (buffer));
status = strjoin (&buffer[4], sizeof (buffer) - strlen ("get "),
li->fields, li->fields_num,
/* seperator = */ " ");
ERROR ("powerdns plugin: powerdns_update_recursor_command failed.");
return (-1);
}
+
+ DEBUG ("powerdns plugin: powerdns_read_recursor: item->command = %s;",
+ item->command);
}
assert (item->command != NULL);
status = powerdns_get_data (item, &buffer, &buffer_size);
if (status != 0)
+ {
+ ERROR ("powerdns plugin: powerdns_get_data failed.");
return (-1);
+ }
keys_list = strdup (item->command);
if (keys_list == NULL)
*/
if (strcasecmp ("Server", ci->key) == 0)
{
- item->server_type = SRV_AUTHORATIVE;
+ item->server_type = SRV_AUTHORITATIVE;
item->func = powerdns_read_server;
item->socktype = SOCK_STREAM;
socket_temp = strdup (SERVER_SOCKET);
break;
}
- if (item->command == NULL)
- {
- ERROR ("powerdns plugin: item->command == NULL.");
- status = -1;
- break;
- }
-
item->sockaddr.sun_family = AF_UNIX;
- sstrncpy (item->sockaddr.sun_path, socket_temp, UNIX_PATH_MAX);
+ sstrncpy (item->sockaddr.sun_path, socket_temp,
+ sizeof (item->sockaddr.sun_path));
e = llentry_create (item->instance, item);
if (e == NULL)
if ((strcasecmp ("Server", option->key) == 0)
|| (strcasecmp ("Recursor", option->key) == 0))
powerdns_config_add_server (option);
- if (strcasecmp ("LocalSocket", option->key) == 0)
+ else if (strcasecmp ("LocalSocket", option->key) == 0)
{
char *temp = strdup (option->key);
if (temp == NULL)