From 76e1836aeddfb71333771364c495ee981eeaeb24 Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Sat, 28 Sep 2019 10:05:02 +0200 Subject: [PATCH] counters: improve handling missing global config Improve warnings when eve.stats can't work because of the global config missing or disabled. Issue warning if global config is missing but stats are still enabled due to the legacy stats.log. Issue clearer warning when stats are disabled and unix socket dump-counters command is issued. Warnings include links to docs. Bug #2465. --- src/counters.c | 26 +++++++++++++++++++------- src/output-json-stats.c | 16 ++++++++++++++++ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/counters.c b/src/counters.c index 0bc808dfd3..7f863b75ef 100644 --- a/src/counters.c +++ b/src/counters.c @@ -245,6 +245,14 @@ static void StatsInitCtxPreOutput(void) SCLogDebug("Stats module has been disabled"); SCReturn; } + /* warn if we are using legacy config to enable stats */ + ConfNode *gstats = ConfGetNode("stats"); + if (gstats == NULL) { + SCLogWarning(SC_ERR_STATS_LOG_GENERIC, "global stats config is missing. " + "Stats enabled through legacy stats.log. " + "See %s%s/configuration/suricata-yaml.html#stats", DOC_URL, DOC_VERSION); + } + const char *interval = ConfNodeLookupChildValue(stats, "interval"); if (interval != NULL) stats_tts = (uint32_t) atoi(interval); @@ -280,7 +288,7 @@ static void StatsInitCtxPostOutput(void) exit(EXIT_FAILURE); } - if (!OutputStatsLoggersRegistered()) { + if (stats_enabled && !OutputStatsLoggersRegistered()) { stats_loggers_active = 0; /* if the unix command socket is enabled we do the background @@ -809,15 +817,19 @@ TmEcode StatsOutputCounterSocket(json_t *cmd, json_t *message = NULL; TmEcode r = TM_ECODE_OK; - SCMutexLock(&stats_table_mutex); - if (stats_table.start_time == 0) { + if (!stats_enabled) { r = TM_ECODE_FAILED; - message = json_string("stats not yet synchronized"); + message = json_string("stats are disabled in the config"); } else { - message = StatsToJSON(&stats_table, JSON_STATS_TOTALS|JSON_STATS_THREADS); + SCMutexLock(&stats_table_mutex); + if (stats_table.start_time == 0) { + r = TM_ECODE_FAILED; + message = json_string("stats not yet synchronized"); + } else { + message = StatsToJSON(&stats_table, JSON_STATS_TOTALS|JSON_STATS_THREADS); + } + SCMutexUnlock(&stats_table_mutex); } - SCMutexUnlock(&stats_table_mutex); - json_object_set_new(answer, "message", message); return r; } diff --git a/src/output-json-stats.c b/src/output-json-stats.c index b22b8df7cf..f498839da9 100644 --- a/src/output-json-stats.c +++ b/src/output-json-stats.c @@ -383,6 +383,14 @@ static void OutputStatsLogDeinit(OutputCtx *output_ctx) static OutputInitResult OutputStatsLogInit(ConfNode *conf) { OutputInitResult result = { NULL, false }; + + if (!StatsEnabled()) { + SCLogError(SC_ERR_STATS_LOG_GENERIC, + "stats.json: stats are disabled globally: set stats.enabled to true. " + "See %s%s/configuration/suricata-yaml.html#stats", DOC_URL, DOC_VERSION); + return result; + } + LogFileCtx *file_ctx = LogFileNewCtx(); if(file_ctx == NULL) { SCLogError(SC_ERR_STATS_LOG_GENERIC, "couldn't create new file_ctx"); @@ -455,6 +463,14 @@ static OutputInitResult OutputStatsLogInitSub(ConfNode *conf, OutputCtx *parent_ { OutputInitResult result = { NULL, false }; OutputJsonCtx *ajt = parent_ctx->data; + + if (!StatsEnabled()) { + SCLogError(SC_ERR_STATS_LOG_GENERIC, + "eve.stats: stats are disabled globally: set stats.enabled to true. " + "See %s%s/configuration/suricata-yaml.html#stats", DOC_URL, DOC_VERSION); + return result; + } + OutputStatsCtx *stats_ctx = SCMalloc(sizeof(OutputStatsCtx)); if (unlikely(stats_ctx == NULL)) return result; -- 2.47.2