X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fiptables.c;h=35975e6d8adff4979a18c841fabe57035eec416f;hb=7535ee83bf0b12a168cee3c70e5fb97ed6dfc96c;hp=e035a88818f7069c9575beb6beae42d4e64e561a;hpb=1bdfcf9791729310f75857d0e002c40ef659a89b;p=collectd.git diff --git a/src/iptables.c b/src/iptables.c index e035a888..35975e6d 100644 --- a/src/iptables.c +++ b/src/iptables.c @@ -28,11 +28,14 @@ #include "common.h" #include "plugin.h" -#include "configfile.h" #include #include +#ifdef HAVE_SYS_CAPABILITY_H +# include +#endif + /* * iptc_handle_t was available before libiptc was officially available as a * shared library. Note, that when the shared lib was introduced, the API and @@ -239,7 +242,6 @@ static int submit6_match (const struct ip6t_entry_match *match, int rule_num) { int status; - value_t values[1]; value_list_t vl = VALUE_LIST_INIT; /* Select the rules to collect */ @@ -257,8 +259,6 @@ static int submit6_match (const struct ip6t_entry_match *match, return (0); } - vl.values = values; - vl.values_len = 1; sstrncpy (vl.host, hostname_g, sizeof (vl.host)); sstrncpy (vl.plugin, "ip6tables", sizeof (vl.plugin)); @@ -282,16 +282,16 @@ static int submit6_match (const struct ip6t_entry_match *match, } sstrncpy (vl.type, "ipt_bytes", sizeof (vl.type)); - values[0].derive = (derive_t) entry->counters.bcnt; + vl.values = &(value_t) { .derive = (derive_t) entry->counters.bcnt }; + vl.values_len = 1; plugin_dispatch_values (&vl); sstrncpy (vl.type, "ipt_packets", sizeof (vl.type)); - values[0].derive = (derive_t) entry->counters.pcnt; + vl.values = &(value_t) { .derive = (derive_t) entry->counters.pcnt }; plugin_dispatch_values (&vl); return (0); -} /* int submit_match */ - +} /* int submit6_match */ /* This needs to return `int' for IPT_MATCH_ITERATE to work. */ static int submit_match (const struct ipt_entry_match *match, @@ -300,7 +300,6 @@ static int submit_match (const struct ipt_entry_match *match, int rule_num) { int status; - value_t values[1]; value_list_t vl = VALUE_LIST_INIT; /* Select the rules to collect */ @@ -318,8 +317,6 @@ static int submit_match (const struct ipt_entry_match *match, return (0); } - vl.values = values; - vl.values_len = 1; sstrncpy (vl.host, hostname_g, sizeof (vl.host)); sstrncpy (vl.plugin, "iptables", sizeof (vl.plugin)); @@ -343,11 +340,12 @@ static int submit_match (const struct ipt_entry_match *match, } sstrncpy (vl.type, "ipt_bytes", sizeof (vl.type)); - values[0].derive = (derive_t) entry->counters.bcnt; + vl.values = &(value_t) { .derive = (derive_t) entry->counters.bcnt }; + vl.values_len = 1; plugin_dispatch_values (&vl); sstrncpy (vl.type, "ipt_packets", sizeof (vl.type)); - values[0].derive = (derive_t) entry->counters.pcnt; + vl.values = &(value_t) { .derive = (derive_t) entry->counters.pcnt }; plugin_dispatch_values (&vl); return (0); @@ -499,10 +497,30 @@ static int iptables_shutdown (void) return (0); } /* int iptables_shutdown */ +static int iptables_init (void) +{ +#if defined(HAVE_SYS_CAPABILITY_H) && defined(CAP_NET_ADMIN) + if (check_capability (CAP_NET_ADMIN) != 0) + { + if (getuid () == 0) + WARNING ("iptables plugin: Running collectd as root, but the " + "CAP_NET_ADMIN capability is missing. The plugin's read " + "function will probably fail. Is your init system dropping " + "capabilities?"); + else + WARNING ("iptables plugin: collectd doesn't have the CAP_NET_ADMIN " + "capability. If you don't want to run collectd as root, try " + "running \"setcap cap_net_admin=ep\" on the collectd binary."); + } +#endif + return (0); +} /* int iptables_init */ + void module_register (void) { plugin_register_config ("iptables", iptables_config, config_keys, config_keys_num); + plugin_register_init ("iptables", iptables_init); plugin_register_read ("iptables", iptables_read); plugin_register_shutdown ("iptables", iptables_shutdown); } /* void module_register */