aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/suricata/src/runmodes.c
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/suricata/src/runmodes.c')
-rw-r--r--framework/src/suricata/src/runmodes.c927
1 files changed, 0 insertions, 927 deletions
diff --git a/framework/src/suricata/src/runmodes.c b/framework/src/suricata/src/runmodes.c
deleted file mode 100644
index 5a9f9762..00000000
--- a/framework/src/suricata/src/runmodes.c
+++ /dev/null
@@ -1,927 +0,0 @@
-/* Copyright (C) 2007-2013 Open Information Security Foundation
- *
- * You can copy, redistribute or modify this Program under the terms of
- * the GNU General Public License version 2 as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
-/** \file
- *
- * \author Victor Julien <victor@inliniac.net>
- *
- * Pre-cooked threading runmodes.
- */
-
-#include "suricata-common.h"
-#include "detect.h"
-#include "detect-engine.h"
-#include "detect-engine-mpm.h"
-#include "tm-threads.h"
-#include "util-debug.h"
-#include "util-time.h"
-#include "util-cpu.h"
-#include "util-byte.h"
-#include "util-affinity.h"
-#include "conf.h"
-#include "queue.h"
-#include "runmodes.h"
-#include "util-unittest.h"
-#include "util-misc.h"
-
-#include "alert-fastlog.h"
-#include "alert-prelude.h"
-#include "alert-unified2-alert.h"
-#include "alert-debuglog.h"
-
-#include "log-httplog.h"
-
-#include "output.h"
-
-#include "source-pfring.h"
-
-int debuglog_enabled = 0;
-
-/**
- * \brief Holds description for a runmode.
- */
-typedef struct RunMode_ {
- /* the runmode type */
- int runmode;
- const char *name;
- const char *description;
- /* runmode function */
- int (*RunModeFunc)(void);
-} RunMode;
-
-typedef struct RunModes_ {
- int no_of_runmodes;
- RunMode *runmodes;
-} RunModes;
-
-/**
- * A list of output modules that will be active for the run mode.
- */
-typedef struct RunModeOutput_ {
- const char *name;
- TmModule *tm_module;
- OutputCtx *output_ctx;
-
- TAILQ_ENTRY(RunModeOutput_) entries;
-} RunModeOutput;
-TAILQ_HEAD(, RunModeOutput_) RunModeOutputs =
- TAILQ_HEAD_INITIALIZER(RunModeOutputs);
-
-static RunModes runmodes[RUNMODE_USER_MAX];
-
-static char *active_runmode;
-
-/* free list for our outputs */
-typedef struct OutputFreeList_ {
- TmModule *tm_module;
- OutputCtx *output_ctx;
-
- TAILQ_ENTRY(OutputFreeList_) entries;
-} OutputFreeList;
-TAILQ_HEAD(, OutputFreeList_) output_free_list =
- TAILQ_HEAD_INITIALIZER(output_free_list);
-
-/**
- * \internal
- * \brief Translate a runmode mode to a printale string.
- *
- * \param runmode Runmode to be converted into a printable string.
- *
- * \retval string Printable string.
- */
-static const char *RunModeTranslateModeToName(int runmode)
-{
- switch (runmode) {
- case RUNMODE_PCAP_DEV:
- return "PCAP_DEV";
- case RUNMODE_PCAP_FILE:
- return "PCAP_FILE";
- case RUNMODE_PFRING:
-#ifdef HAVE_PFRING
- return "PFRING";
-#else
- return "PFRING(DISABLED)";
-#endif
- case RUNMODE_NFQ:
- return "NFQ";
- case RUNMODE_NFLOG:
- return "NFLOG";
- case RUNMODE_IPFW:
- return "IPFW";
- case RUNMODE_ERF_FILE:
- return "ERF_FILE";
- case RUNMODE_DAG:
- return "ERF_DAG";
- case RUNMODE_NAPATECH:
- return "NAPATECH";
- case RUNMODE_UNITTEST:
- return "UNITTEST";
- case RUNMODE_TILERA_MPIPE:
- return "MPIPE";
- case RUNMODE_AFP_DEV:
- return "AF_PACKET_DEV";
- case RUNMODE_NETMAP:
-#ifdef HAVE_NETMAP
- return "NETMAP";
-#else
- return "NETMAP(DISABLED)";
-#endif
- case RUNMODE_UNIX_SOCKET:
- return "UNIX_SOCKET";
- default:
- SCLogError(SC_ERR_UNKNOWN_RUN_MODE, "Unknown runtime mode. Aborting");
- exit(EXIT_FAILURE);
- }
-}
-
-/**
- * \internal
- * \brief Dispatcher function for runmodes. Calls the required runmode function
- * based on runmode + runmode_custom_id.
- *
- * \param runmode The runmode type.
- * \param runmode_customd_id The runmode custom id.
- */
-static RunMode *RunModeGetCustomMode(int runmode, const char *custom_mode)
-{
- int i;
-
- for (i = 0; i < runmodes[runmode].no_of_runmodes; i++) {
- if (strcmp(runmodes[runmode].runmodes[i].name, custom_mode) == 0)
- return &runmodes[runmode].runmodes[i];
- }
-
- return NULL;
-}
-
-
-/**
- * Return the running mode
- *
- * The returned string must not be freed.
- *
- * \return a string containing the current running mode
- */
-char *RunmodeGetActive(void)
-{
- return active_runmode;
-}
-
-/**
- * Return the running mode
- *
- * The returned string must not be freed.
- *
- * \return a string containing the current running mode
- */
-const char *RunModeGetMainMode(void)
-{
- int mainmode = RunmodeGetCurrent();
-
- return RunModeTranslateModeToName(mainmode);
-}
-
-/**
- * \brief Register all runmodes in the engine.
- */
-void RunModeRegisterRunModes(void)
-{
- memset(runmodes, 0, sizeof(runmodes));
-
- RunModeIdsPcapRegister();
- RunModeFilePcapRegister();
- RunModeIdsPfringRegister();
- RunModeIpsNFQRegister();
- RunModeIpsIPFWRegister();
- RunModeErfFileRegister();
- RunModeErfDagRegister();
- RunModeNapatechRegister();
- RunModeIdsAFPRegister();
- RunModeIdsNetmapRegister();
- RunModeIdsNflogRegister();
- RunModeTileMpipeRegister();
- RunModeUnixSocketRegister();
-#ifdef UNITTESTS
- UtRunModeRegister();
-#endif
- return;
-}
-
-/**
- * \brief Lists all registered runmodes.
- */
-void RunModeListRunmodes(void)
-{
- printf("------------------------------------- Runmodes -------------------"
- "-----------------------\n");
-
- printf("| %-17s | %-17s | %-10s \n",
- "RunMode Type", "Custom Mode ", "Description");
- printf("|-----------------------------------------------------------------"
- "-----------------------\n");
- int i = RUNMODE_UNKNOWN + 1;
- int j = 0;
- for ( ; i < RUNMODE_USER_MAX; i++) {
- int mode_displayed = 0;
- for (j = 0; j < runmodes[i].no_of_runmodes; j++) {
- if (mode_displayed == 1) {
- printf("| ----------------------------------------------"
- "-----------------------\n");
- RunMode *runmode = &runmodes[i].runmodes[j];
- printf("| %-17s | %-17s | %-27s \n",
- "",
- runmode->name,
- runmode->description);
- } else {
- RunMode *runmode = &runmodes[i].runmodes[j];
- printf("| %-17s | %-17s | %-27s \n",
- RunModeTranslateModeToName(runmode->runmode),
- runmode->name,
- runmode->description);
- }
- if (mode_displayed == 0)
- mode_displayed = 1;
- }
- if (mode_displayed == 1) {
- printf("|-----------------------------------------------------------------"
- "-----------------------\n");
- }
- }
-
- return;
-}
-
-/**
- */
-void RunModeDispatch(int runmode, const char *custom_mode)
-{
- char *local_custom_mode = NULL;
-
- if (custom_mode == NULL) {
- char *val = NULL;
- if (ConfGet("runmode", &val) != 1) {
- custom_mode = NULL;
- } else {
- custom_mode = val;
- }
- }
-
- if (custom_mode == NULL || strcmp(custom_mode, "auto") == 0) {
- switch (runmode) {
- case RUNMODE_PCAP_DEV:
- custom_mode = RunModeIdsGetDefaultMode();
- break;
- case RUNMODE_PCAP_FILE:
- custom_mode = RunModeFilePcapGetDefaultMode();
- break;
-#ifdef HAVE_PFRING
- case RUNMODE_PFRING:
- custom_mode = RunModeIdsPfringGetDefaultMode();
- break;
-#endif
- case RUNMODE_NFQ:
- custom_mode = RunModeIpsNFQGetDefaultMode();
- break;
- case RUNMODE_IPFW:
- custom_mode = RunModeIpsIPFWGetDefaultMode();
- break;
- case RUNMODE_ERF_FILE:
- custom_mode = RunModeErfFileGetDefaultMode();
- break;
- case RUNMODE_DAG:
- custom_mode = RunModeErfDagGetDefaultMode();
- break;
- case RUNMODE_TILERA_MPIPE:
- custom_mode = RunModeTileMpipeGetDefaultMode();
- break;
- case RUNMODE_NAPATECH:
- custom_mode = RunModeNapatechGetDefaultMode();
- break;
- case RUNMODE_AFP_DEV:
- custom_mode = RunModeAFPGetDefaultMode();
- break;
- case RUNMODE_NETMAP:
- custom_mode = RunModeNetmapGetDefaultMode();
- break;
- case RUNMODE_UNIX_SOCKET:
- custom_mode = RunModeUnixSocketGetDefaultMode();
- break;
- case RUNMODE_NFLOG:
- custom_mode = RunModeIdsNflogGetDefaultMode();
- break;
- default:
- SCLogError(SC_ERR_UNKNOWN_RUN_MODE, "Unknown runtime mode. Aborting");
- exit(EXIT_FAILURE);
- }
- } else { /* if (custom_mode == NULL) */
- /* Add compability with old 'worker' name */
- if (!strcmp("worker", custom_mode)) {
- SCLogWarning(SC_ERR_RUNMODE, "'worker' mode have been renamed "
- "to 'workers', please modify your setup.");
- local_custom_mode = SCStrdup("workers");
- if (unlikely(local_custom_mode == NULL)) {
- SCLogError(SC_ERR_MEM_ALLOC, "Unable to dup custom mode");
- exit(EXIT_FAILURE);
- }
- custom_mode = local_custom_mode;
- }
- }
-
-#ifdef __SC_CUDA_SUPPORT__
- if (PatternMatchDefaultMatcher() == MPM_AC_CUDA &&
- strcasecmp(custom_mode, "autofp") != 0) {
- SCLogError(SC_ERR_RUNMODE, "When using a cuda mpm, the only runmode we "
- "support is autofp.");
- exit(EXIT_FAILURE);
- }
-#endif
-
- RunMode *mode = RunModeGetCustomMode(runmode, custom_mode);
- if (mode == NULL) {
- SCLogError(SC_ERR_RUNMODE, "The custom type \"%s\" doesn't exist "
- "for this runmode type \"%s\". Please use --list-runmodes to "
- "see available custom types for this runmode",
- custom_mode, RunModeTranslateModeToName(runmode));
- exit(EXIT_FAILURE);
- }
-
- /* Export the custom mode */
- active_runmode = SCStrdup(custom_mode);
- if (unlikely(active_runmode == NULL)) {
- SCLogError(SC_ERR_MEM_ALLOC, "Unable to dup active mode");
- exit(EXIT_FAILURE);
- }
-
- mode->RunModeFunc();
-
- if (local_custom_mode != NULL)
- SCFree(local_custom_mode);
- return;
-}
-
-/**
- * \brief Registers a new runmode.
- *
- * \param runmode Runmode type.
- * \param name Custom mode for this specific runmode type. Within each
- * runmode type, each custom name is a primary key.
- * \param description Description for this runmode.
- * \param RunModeFunc The function to be run for this runmode.
- */
-void RunModeRegisterNewRunMode(int runmode, const char *name,
- const char *description,
- int (*RunModeFunc)(void))
-{
- void *ptmp;
- if (RunModeGetCustomMode(runmode, name) != NULL) {
- SCLogError(SC_ERR_RUNMODE, "A runmode by this custom name has already "
- "been registered. Please use an unique name");
- return;
- }
-
- ptmp = SCRealloc(runmodes[runmode].runmodes,
- (runmodes[runmode].no_of_runmodes + 1) * sizeof(RunMode));
- if (ptmp == NULL) {
- SCFree(runmodes[runmode].runmodes);
- runmodes[runmode].runmodes = NULL;
- exit(EXIT_FAILURE);
- }
- runmodes[runmode].runmodes = ptmp;
-
- RunMode *mode = &runmodes[runmode].runmodes[runmodes[runmode].no_of_runmodes];
- runmodes[runmode].no_of_runmodes++;
-
- mode->runmode = runmode;
- mode->name = SCStrdup(name);
- if (unlikely(mode->name == NULL)) {
- SCLogError(SC_ERR_MEM_ALLOC, "Failed to allocate string");
- exit(EXIT_FAILURE);
- }
- mode->description = SCStrdup(description);
- if (unlikely(mode->description == NULL)) {
- SCLogError(SC_ERR_MEM_ALLOC, "Failed to allocate string");
- exit(EXIT_FAILURE);
- }
- mode->RunModeFunc = RunModeFunc;
-
- return;
-}
-
-/**
- * Setup the outputs for this run mode.
- *
- * \param tv The ThreadVars for the thread the outputs will be
- * appended to.
- */
-void RunOutputFreeList(void)
-{
- OutputFreeList *output;
- while ((output = TAILQ_FIRST(&output_free_list))) {
- SCLogDebug("output %s %p %p", output->tm_module->name, output, output->output_ctx);
-
- if (output->output_ctx != NULL && output->output_ctx->DeInit != NULL)
- output->output_ctx->DeInit(output->output_ctx);
-
- TAILQ_REMOVE(&output_free_list, output, entries);
- SCFree(output);
- }
-}
-
-static TmModule *pkt_logger_module = NULL;
-static TmModule *tx_logger_module = NULL;
-static TmModule *file_logger_module = NULL;
-static TmModule *filedata_logger_module = NULL;
-static TmModule *streaming_logger_module = NULL;
-
-int RunModeOutputFileEnabled(void)
-{
- return (file_logger_module != NULL);
-}
-
-int RunModeOutputFiledataEnabled(void)
-{
- return (filedata_logger_module != NULL);
-}
-
-/**
- * Cleanup the run mode.
- */
-void RunModeShutDown(void)
-{
- RunOutputFreeList();
-
- OutputPacketShutdown();
- OutputTxShutdown();
- OutputFileShutdown();
- OutputFiledataShutdown();
- OutputStreamingShutdown();
- OutputStatsShutdown();
- OutputFlowShutdown();
-
- /* Close any log files. */
- RunModeOutput *output;
- while ((output = TAILQ_FIRST(&RunModeOutputs))) {
- SCLogDebug("Shutting down output %s.", output->tm_module->name);
- TAILQ_REMOVE(&RunModeOutputs, output, entries);
- SCFree(output);
- }
-
- /* reset logger pointers */
- pkt_logger_module = NULL;
- tx_logger_module = NULL;
- file_logger_module = NULL;
- filedata_logger_module = NULL;
- streaming_logger_module = NULL;
-}
-
-/** \internal
- * \brief add Sub RunModeOutput to list for Submodule so we can free
- * the output ctx at shutdown and unix socket reload */
-static void AddOutputToFreeList(OutputModule *module, OutputCtx *output_ctx)
-{
- TmModule *tm_module = TmModuleGetByName(module->name);
- if (tm_module == NULL) {
- SCLogError(SC_ERR_INVALID_ARGUMENT,
- "TmModuleGetByName for %s failed", module->name);
- exit(EXIT_FAILURE);
- }
- OutputFreeList *fl_output = SCCalloc(1, sizeof(OutputFreeList));
- if (unlikely(fl_output == NULL))
- return;
- fl_output->tm_module = tm_module;
- fl_output->output_ctx = output_ctx;
- TAILQ_INSERT_TAIL(&output_free_list, fl_output, entries);
-}
-
-
-static int GetRunModeOutputPriority(RunModeOutput *module)
-{
- TmModule *tm = TmModuleGetByName(module->name);
- if (tm == NULL)
- return 0;
-
- return tm->priority;
-}
-
-static void InsertInRunModeOutputs(RunModeOutput *runmode_output)
-{
- RunModeOutput *r_output = NULL;
- int output_priority = GetRunModeOutputPriority(runmode_output);
-
- TAILQ_FOREACH(r_output, &RunModeOutputs, entries) {
- if (GetRunModeOutputPriority(r_output) < output_priority)
- break;
- }
- if (r_output) {
- TAILQ_INSERT_BEFORE(r_output, runmode_output, entries);
- } else {
- TAILQ_INSERT_TAIL(&RunModeOutputs, runmode_output, entries);
- }
-}
-
-/** \brief Turn output into thread module */
-static void SetupOutput(const char *name, OutputModule *module, OutputCtx *output_ctx)
-{
- /* flow logger doesn't run in the packet path */
- if (module->FlowLogFunc) {
- OutputRegisterFlowLogger(module->name, module->FlowLogFunc, output_ctx);
- return;
- }
- /* stats logger doesn't run in the packet path */
- if (module->StatsLogFunc) {
- OutputRegisterStatsLogger(module->name, module->StatsLogFunc, output_ctx);
- return;
- }
-
- TmModule *tm_module = TmModuleGetByName(module->name);
- if (tm_module == NULL) {
- SCLogError(SC_ERR_INVALID_ARGUMENT,
- "TmModuleGetByName for %s failed", module->name);
- exit(EXIT_FAILURE);
- }
- if (strcmp(tmm_modules[TMM_ALERTDEBUGLOG].name, tm_module->name) == 0)
- debuglog_enabled = 1;
-
- if (module->PacketLogFunc) {
- SCLogDebug("%s is a packet logger", module->name);
- OutputRegisterPacketLogger(module->name, module->PacketLogFunc,
- module->PacketConditionFunc, output_ctx);
-
- /* need one instance of the packet logger module */
- if (pkt_logger_module == NULL) {
- pkt_logger_module = TmModuleGetByName("__packet_logger__");
- if (pkt_logger_module == NULL) {
- SCLogError(SC_ERR_INVALID_ARGUMENT,
- "TmModuleGetByName for __packet_logger__ failed");
- exit(EXIT_FAILURE);
- }
-
- RunModeOutput *runmode_output = SCCalloc(1, sizeof(RunModeOutput));
- if (unlikely(runmode_output == NULL))
- return;
- runmode_output->name = module->name;
- runmode_output->tm_module = pkt_logger_module;
- runmode_output->output_ctx = NULL;
- InsertInRunModeOutputs(runmode_output);
- SCLogDebug("__packet_logger__ added");
- }
- } else if (module->TxLogFunc) {
- SCLogDebug("%s is a tx logger", module->name);
- OutputRegisterTxLogger(module->name, module->alproto,
- module->TxLogFunc, output_ctx);
-
- /* need one instance of the tx logger module */
- if (tx_logger_module == NULL) {
- tx_logger_module = TmModuleGetByName("__tx_logger__");
- if (tx_logger_module == NULL) {
- SCLogError(SC_ERR_INVALID_ARGUMENT,
- "TmModuleGetByName for __tx_logger__ failed");
- exit(EXIT_FAILURE);
- }
-
- RunModeOutput *runmode_output = SCCalloc(1, sizeof(RunModeOutput));
- if (unlikely(runmode_output == NULL))
- return;
- runmode_output->name = module->name;
- runmode_output->tm_module = tx_logger_module;
- runmode_output->output_ctx = NULL;
- InsertInRunModeOutputs(runmode_output);
- SCLogDebug("__tx_logger__ added");
- }
- } else if (module->FiledataLogFunc) {
- SCLogDebug("%s is a filedata logger", module->name);
- OutputRegisterFiledataLogger(module->name, module->FiledataLogFunc, output_ctx);
-
- /* need one instance of the tx logger module */
- if (filedata_logger_module == NULL) {
- filedata_logger_module = TmModuleGetByName("__filedata_logger__");
- if (filedata_logger_module == NULL) {
- SCLogError(SC_ERR_INVALID_ARGUMENT,
- "TmModuleGetByName for __filedata_logger__ failed");
- exit(EXIT_FAILURE);
- }
-
- RunModeOutput *runmode_output = SCCalloc(1, sizeof(RunModeOutput));
- if (unlikely(runmode_output == NULL))
- return;
- runmode_output->name = module->name;
- runmode_output->tm_module = filedata_logger_module;
- runmode_output->output_ctx = NULL;
- InsertInRunModeOutputs(runmode_output);
- SCLogDebug("__filedata_logger__ added");
- }
- } else if (module->FileLogFunc) {
- SCLogDebug("%s is a file logger", module->name);
- OutputRegisterFileLogger(module->name, module->FileLogFunc, output_ctx);
-
- /* need one instance of the tx logger module */
- if (file_logger_module == NULL) {
- file_logger_module = TmModuleGetByName("__file_logger__");
- if (file_logger_module == NULL) {
- SCLogError(SC_ERR_INVALID_ARGUMENT,
- "TmModuleGetByName for __file_logger__ failed");
- exit(EXIT_FAILURE);
- }
-
- RunModeOutput *runmode_output = SCCalloc(1, sizeof(RunModeOutput));
- if (unlikely(runmode_output == NULL))
- return;
- runmode_output->name = module->name;
- runmode_output->tm_module = file_logger_module;
- runmode_output->output_ctx = NULL;
- InsertInRunModeOutputs(runmode_output);
- SCLogDebug("__file_logger__ added");
- }
- } else if (module->StreamingLogFunc) {
- SCLogDebug("%s is a streaming logger", module->name);
- OutputRegisterStreamingLogger(module->name, module->StreamingLogFunc,
- output_ctx, module->stream_type);
-
- /* need one instance of the streaming logger module */
- if (streaming_logger_module == NULL) {
- streaming_logger_module = TmModuleGetByName("__streaming_logger__");
- if (streaming_logger_module == NULL) {
- SCLogError(SC_ERR_INVALID_ARGUMENT,
- "TmModuleGetByName for __streaming_logger__ failed");
- exit(EXIT_FAILURE);
- }
-
- RunModeOutput *runmode_output = SCCalloc(1, sizeof(RunModeOutput));
- if (unlikely(runmode_output == NULL))
- return;
- runmode_output->name = module->name;
- runmode_output->tm_module = streaming_logger_module;
- runmode_output->output_ctx = NULL;
- InsertInRunModeOutputs(runmode_output);
- SCLogDebug("__streaming_logger__ added");
- }
- } else {
- SCLogDebug("%s is a regular logger", module->name);
-
- RunModeOutput *runmode_output = SCCalloc(1, sizeof(RunModeOutput));
- if (unlikely(runmode_output == NULL))
- return;
- runmode_output->name = module->name;
- runmode_output->tm_module = tm_module;
- runmode_output->output_ctx = output_ctx;
- InsertInRunModeOutputs(runmode_output);
- }
-}
-
-/**
- * Initialize the output modules.
- */
-void RunModeInitializeOutputs(void)
-{
- ConfNode *outputs = ConfGetNode("outputs");
- if (outputs == NULL) {
- /* No "outputs" section in the configuration. */
- return;
- }
-
- ConfNode *output, *output_config;
- const char *enabled;
- char tls_log_enabled = 0;
- char tls_store_present = 0;
-
- TAILQ_FOREACH(output, &outputs->head, next) {
-
- output_config = ConfNodeLookupChild(output, output->val);
- if (output_config == NULL) {
- /* Shouldn't happen. */
- FatalError(SC_ERR_INVALID_ARGUMENT,
- "Failed to lookup configuration child node: %s", output->val);
- }
-
- if (strcmp(output->val, "tls-store") == 0) {
- tls_store_present = 1;
- }
-
- enabled = ConfNodeLookupChildValue(output_config, "enabled");
- if (enabled == NULL || !ConfValIsTrue(enabled)) {
- continue;
- }
-
- if (strncmp(output->val, "unified-", sizeof("unified-") - 1) == 0) {
- SCLogWarning(SC_ERR_NOT_SUPPORTED,
- "Unified1 is no longer supported,"
- " use Unified2 instead "
- "(see https://redmine.openinfosecfoundation.org/issues/353"
- " for an explanation)");
- continue;
- } else if (strcmp(output->val, "alert-prelude") == 0) {
-#ifndef PRELUDE
- SCLogWarning(SC_ERR_NOT_SUPPORTED,
- "Prelude support not compiled in. Reconfigure/"
- "recompile with --enable-prelude to add Prelude "
- "support.");
- continue;
-#endif
- } else if (strcmp(output->val, "eve-log") == 0) {
-#ifndef HAVE_LIBJANSSON
- SCLogWarning(SC_ERR_NOT_SUPPORTED,
- "Eve-log support not compiled in. Reconfigure/"
- "recompile with libjansson and its development "
- "files installed to add eve-log support.");
- continue;
-#endif
- } else if (strcmp(output->val, "lua") == 0) {
-#ifndef HAVE_LUA
- SCLogWarning(SC_ERR_NOT_SUPPORTED,
- "lua support not compiled in. Reconfigure/"
- "recompile with lua(jit) and its development "
- "files installed to add lua support.");
- continue;
-#endif
- } else if (strcmp(output->val, "tls-log") == 0) {
- tls_log_enabled = 1;
- }
-
- OutputModule *module = OutputGetModuleByConfName(output->val);
- if (module == NULL) {
- FatalErrorOnInit(SC_ERR_INVALID_ARGUMENT,
- "No output module named %s", output->val);
- continue;
- }
-
- OutputCtx *output_ctx = NULL;
- if (module->InitFunc != NULL) {
- output_ctx = module->InitFunc(output_config);
- if (output_ctx == NULL) {
- FatalErrorOnInit(SC_ERR_INVALID_ARGUMENT, "output module setup failed");
- continue;
- }
- } else if (module->InitSubFunc != NULL) {
- SCLogInfo("skipping submodule");
- continue;
- }
-
- // TODO if module == parent, find it's children
- if (strcmp(output->val, "eve-log") == 0) {
- ConfNode *types = ConfNodeLookupChild(output_config, "types");
- SCLogDebug("types %p", types);
- if (types != NULL) {
- ConfNode *type = NULL;
- TAILQ_FOREACH(type, &types->head, next) {
- SCLogInfo("enabling 'eve-log' module '%s'", type->val);
-
- char subname[256];
- snprintf(subname, sizeof(subname), "%s.%s", output->val, type->val);
-
- OutputModule *sub_module = OutputGetModuleByConfName(subname);
- if (sub_module == NULL) {
- FatalErrorOnInit(SC_ERR_INVALID_ARGUMENT,
- "No output module named %s", subname);
- continue;
- }
- if (sub_module->parent_name == NULL ||
- strcmp(sub_module->parent_name,output->val) != 0) {
- FatalError(SC_ERR_INVALID_ARGUMENT,
- "bad parent for %s", subname);
- }
- if (sub_module->InitSubFunc == NULL) {
- FatalError(SC_ERR_INVALID_ARGUMENT,
- "bad sub-module for %s", subname);
- }
- ConfNode *sub_output_config = ConfNodeLookupChild(type, type->val);
- // sub_output_config may be NULL if no config
-
- /* pass on parent output_ctx */
- OutputCtx *sub_output_ctx =
- sub_module->InitSubFunc(sub_output_config, output_ctx);
- if (sub_output_ctx == NULL) {
- continue;
- }
-
- AddOutputToFreeList(sub_module, sub_output_ctx);
- SetupOutput(sub_module->name, sub_module, sub_output_ctx);
- }
- }
- /* add 'eve-log' to free list as it's the owner of the
- * main output ctx from which the sub-modules share the
- * LogFileCtx */
- AddOutputToFreeList(module, output_ctx);
-
- } else if (strcmp(output->val, "lua") == 0) {
- SCLogDebug("handle lua");
-
- ConfNode *scripts = ConfNodeLookupChild(output_config, "scripts");
- BUG_ON(scripts == NULL); //TODO
-
- OutputModule *m;
- TAILQ_FOREACH(m, &output_ctx->submodules, entries) {
- SCLogDebug("m %p %s:%s", m, m->name, m->conf_name);
-
- ConfNode *script = NULL;
- TAILQ_FOREACH(script, &scripts->head, next) {
- SCLogDebug("script %s", script->val);
- if (strcmp(script->val, m->conf_name) == 0) {
- break;
- }
- }
- BUG_ON(script == NULL);
-
- /* pass on parent output_ctx */
- OutputCtx *sub_output_ctx =
- m->InitSubFunc(script, output_ctx);
- if (sub_output_ctx == NULL) {
- SCLogInfo("sub_output_ctx NULL, skipping");
- continue;
- }
-
- SetupOutput(m->name, m, sub_output_ctx);
- }
-
- } else {
- AddOutputToFreeList(module, output_ctx);
- SetupOutput(module->name, module, output_ctx);
- }
- }
-
- /* Backward compatibility code */
- if (!tls_store_present && tls_log_enabled) {
- /* old YAML with no "tls-store" in outputs. "tls-log" value needs
- * to be started using 'tls-log' config as own config */
- SCLogWarning(SC_ERR_CONF_YAML_ERROR,
- "Please use 'tls-store' in YAML to configure TLS storage");
-
- TAILQ_FOREACH(output, &outputs->head, next) {
- output_config = ConfNodeLookupChild(output, output->val);
-
- if (strcmp(output->val, "tls-log") == 0) {
-
- OutputModule *module = OutputGetModuleByConfName("tls-store");
- if (module == NULL) {
- SCLogWarning(SC_ERR_INVALID_ARGUMENT,
- "No output module named %s, ignoring", "tls-store");
- continue;
- }
-
- OutputCtx *output_ctx = NULL;
- if (module->InitFunc != NULL) {
- output_ctx = module->InitFunc(output_config);
- if (output_ctx == NULL) {
- continue;
- }
- }
-
- AddOutputToFreeList(module, output_ctx);
- SetupOutput(module->name, module, output_ctx);
- }
- }
- }
-
-}
-
-/**
- * Setup the outputs for this run mode.
- *
- * \param tv The ThreadVars for the thread the outputs will be
- * appended to.
- */
-void SetupOutputs(ThreadVars *tv)
-{
- RunModeOutput *output;
- TAILQ_FOREACH(output, &RunModeOutputs, entries) {
- tv->cap_flags |= output->tm_module->cap_flags;
- TmSlotSetFuncAppend(tv, output->tm_module, output->output_ctx);
- }
-}
-
-float threading_detect_ratio = 1;
-
-/**
- * Initialize multithreading settings.
- */
-void RunModeInitialize(void)
-{
- threading_set_cpu_affinity = FALSE;
- if ((ConfGetBool("threading.set-cpu-affinity", &threading_set_cpu_affinity)) == 0) {
- threading_set_cpu_affinity = FALSE;
- }
- /* try to get custom cpu mask value if needed */
- if (threading_set_cpu_affinity == TRUE) {
- AffinitySetupLoadFromConfig();
- }
- if ((ConfGetFloat("threading.detect-thread-ratio", &threading_detect_ratio)) != 1) {
- if (ConfGetNode("threading.detect-thread-ratio") != NULL)
- WarnInvalidConfEntry("threading.detect-thread-ratio", "%s", "1");
- threading_detect_ratio = 1;
- }
-
- SCLogDebug("threading.detect-thread-ratio %f", threading_detect_ratio);
-}