X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Ftraffic.c;h=14b7dc32b1c6ac9ca33caab29466f5b2a16fd3c2;hb=44d73d6556833bcfbc4678a01731aafee95c3caf;hp=d12f5e4faeaa6166d4a30327f34d6ce0923d851c;hpb=56f1b53ff9d854740201b1070d3cd2637be56b6e;p=collectd.git diff --git a/src/traffic.c b/src/traffic.c index d12f5e4f..14b7dc32 100644 --- a/src/traffic.c +++ b/src/traffic.c @@ -74,16 +74,17 @@ */ /* TODO: Move this to `interface-%s/.rrd' in version 4. */ static char *bytes_file = "traffic-%s.rrd"; -static char *packets_file = "if_packets-%s.rrd"; -static char *errors_file = "if_errors-%s.rrd"; +static char *packets_file = "interface-%s/if_packets.rrd"; +static char *errors_file = "interface-%s/if_errors.rrd"; /* TODO: Maybe implement multicast and broadcast counters */ static char *config_keys[] = { - "Ignore", + "Interface", + "IgnoreSelected", NULL }; -static int config_keys_num = 1; +static int config_keys_num = 2; static char *bytes_ds_def[] = { @@ -109,8 +110,14 @@ static char *errors_ds_def[] = }; static int errors_ds_num = 2; -static char **if_ignore_list = NULL; -static int if_ignore_list_num = 0; +static char **if_list = NULL; +static int if_list_num = 0; +/* + * if_list_action: + * 0 => default is to collect selected interface + * 1 => ignore selcted interfaces + */ +static int if_list_action = 0; #ifdef HAVE_LIBKSTAT #define MAX_NUMIF 256 @@ -123,25 +130,36 @@ static int traffic_config (char *key, char *value) { char **temp; - if (strcasecmp (key, "Ignore") != 0) - return (-1); + if (strcasecmp (key, "Interface") == 0) + { + temp = (char **) realloc (if_list, (if_list_num + 1) * sizeof (char *)); + if (temp == NULL) + { + syslog (LOG_EMERG, "Cannot allocate more memory."); + return (1); + } + if_list = temp; - temp = (char **) realloc (if_ignore_list, (if_ignore_list_num + 1) * sizeof (char *)); - if (temp == NULL) + if ((if_list[if_list_num] = strdup (value)) == NULL) + { + syslog (LOG_EMERG, "Cannot allocate memory."); + return (1); + } + if_list_num++; + } + else if (strcasecmp (key, "IgnoreSelected") == 0) { - syslog (LOG_EMERG, "Cannot allocate more memory."); - return (1); + if ((strcasecmp (value, "True") == 0) + || (strcasecmp (value, "Yes") == 0) + || (strcasecmp (value, "On") == 0)) + if_list_action = 1; + else + if_list_action = 0; } - if_ignore_list = temp; - - if ((if_ignore_list[if_ignore_list_num] = strdup (value)) == NULL) + else { - syslog (LOG_EMERG, "Cannot allocate memory."); - return (1); + return (-1); } - if_ignore_list_num++; - - syslog (LOG_NOTICE, "traffic: Ignoring interface `%s'", value); return (0); } @@ -190,17 +208,22 @@ static void traffic_init (void) /* * Check if this interface/instance should be ignored. This is called from - * both, `submit' and `write' to give client and server the ability to ignore - * certain stuff.. + * both, `submit' and `write' to give client and server the ability to + * ignore certain stuff.. */ static int check_ignore_if (const char *interface) { int i; - for (i = 0; i < if_ignore_list_num; i++) - if (strcasecmp (interface, if_ignore_list[i]) == 0) - return (1); - return (0); + /* If no interfaces are given collect all interfaces. Mostly to be + * backwards compatible, but also because this is much easier. */ + if (if_list_num < 1) + return (0); + + for (i = 0; i < if_list_num; i++) + if (strcasecmp (interface, if_list[i]) == 0) + return (if_list_action); + return (1 - if_list_action); } static void generic_write (char *host, char *inst, char *val,