From 5d5612f98e8db1571830e87a1efb6acdb700a340 Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Thu, 25 Apr 2019 15:42:46 +0200 Subject: [PATCH] suricata: --data-dir option --- configure.ac | 4 +++- src/conf.h | 2 ++ src/suricata.c | 27 ++++++++++++++++++++++++++- src/suricata.h | 1 + src/util-conf.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- src/util-conf.h | 4 ++++ 6 files changed, 84 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 482ad3f27c..691d4c28b2 100644 --- a/configure.ac +++ b/configure.ac @@ -2532,6 +2532,7 @@ else EXPAND_VARIABLE(sysconfdir, e_sysconfrulesdir, "/suricata/rules") EXPAND_VARIABLE(localstatedir, e_localstatedir, "/run/suricata") EXPAND_VARIABLE(datadir, e_datarulesdir, "/suricata/rules") + EXPAND_VARIABLE(localstatedir, e_datadir, "/lib/suricata/data") EXPAND_VARIABLE(ruledirprefix, e_defaultruledir, "/suricata/rules") e_abs_srcdir=$(cd $srcdir && pwd) @@ -2542,9 +2543,10 @@ AC_SUBST(e_rundir) AC_SUBST(e_logfilesdir) AC_SUBST(e_logcertsdir) AC_SUBST(e_sysconfdir) +AC_DEFINE_UNQUOTED([CONFIG_DIR],["$e_sysconfdir"],[Our CONFIG_DIR]) AC_SUBST(e_sysconfrulesdir) AC_SUBST(e_localstatedir) -AC_DEFINE_UNQUOTED([CONFIG_DIR],["$e_sysconfdir"],[Our CONFIG_DIR]) +AC_DEFINE_UNQUOTED([DATA_DIR],["$e_datadir"],[Our DATA_DIR]) AC_SUBST(e_magic_file) AC_SUBST(e_magic_file_comment) AC_SUBST(e_enable_evelog) diff --git a/src/conf.h b/src/conf.h index daedbf9248..c71dded8ca 100644 --- a/src/conf.h +++ b/src/conf.h @@ -49,8 +49,10 @@ typedef struct ConfNode_ { */ #ifdef OS_WIN32 #define DEFAULT_LOG_DIR "C:\\WINDOWS\\Temp" +#define DEFAULT_DATA_DIR "C:\\WINDOWS\\Temp" #else #define DEFAULT_LOG_DIR "/var/log/suricata" +#define DEFAULT_DATA_DIR DATA_DIR #endif /* OS_WIN32 */ void ConfInit(void); diff --git a/src/suricata.c b/src/suricata.c index 6393de0f83..33aeb51e94 100644 --- a/src/suricata.c +++ b/src/suricata.c @@ -1520,6 +1520,7 @@ static TmEcode ParseCommandLine(int argc, char** argv, SCInstance *suri) {"dag", required_argument, 0, 0}, {"napatech", 0, 0, 0}, {"build-info", 0, &build_info, 1}, + {"data-dir", required_argument, 0, 0}, #ifdef WINDIVERT {"windivert", required_argument, 0, 0}, {"windivert-forward", required_argument, 0, 0}, @@ -1852,6 +1853,24 @@ static TmEcode ParseCommandLine(int argc, char** argv, SCInstance *suri) return TM_ECODE_FAILED; } } + else if (strcmp((long_opts[option_index]).name, "data-dir") == 0) { + if (optarg == NULL) { + SCLogError(SC_ERR_INITIALIZATION, "no option argument (optarg) for -d"); + return TM_ECODE_FAILED; + } + + if (ConfigSetDataDirectory(optarg) != TM_ECODE_OK) { + SCLogError(SC_ERR_FATAL, "Failed to set data directory."); + return TM_ECODE_FAILED; + } + if (ConfigCheckDataDirectory(optarg) != TM_ECODE_OK) { + SCLogError(SC_ERR_LOGDIR_CMDLINE, "The data directory \"%s\"" + " supplied at the commandline (-d %s) doesn't " + "exist. Shutting down the engine.", optarg, optarg); + return TM_ECODE_FAILED; + } + suri->set_datadir = true; + } break; case 'c': suri->conf_filename = optarg; @@ -1922,7 +1941,7 @@ static TmEcode ParseCommandLine(int argc, char** argv, SCInstance *suri) } if (ConfigSetLogDirectory(optarg) != TM_ECODE_OK) { - SCLogError(SC_ERR_FATAL, "Failed to set log directory.\n"); + SCLogError(SC_ERR_FATAL, "Failed to set log directory."); return TM_ECODE_FAILED; } if (ConfigCheckLogDirectory(optarg) != TM_ECODE_OK) { @@ -2653,6 +2672,12 @@ static void SetupUserMode(SCInstance *suri) FatalError(SC_ERR_LOGDIR_CONFIG, "could not set USER mode logdir"); } } + if (suri->set_datadir == false) { + /* override data dir to current work dir" */ + if (ConfigSetDataDirectory((char *)".") != TM_ECODE_OK) { + FatalError(SC_ERR_LOGDIR_CONFIG, "could not set USER mode datadir"); + } + } } } diff --git a/src/suricata.h b/src/suricata.h index ca3bdffb8d..6ddc5a92a8 100644 --- a/src/suricata.h +++ b/src/suricata.h @@ -153,6 +153,7 @@ typedef struct SCInstance_ { bool system; bool set_logdir; + bool set_datadir; int delayed_detect; int disabled_detect; diff --git a/src/util-conf.c b/src/util-conf.c index 212be9d7a8..84b5527eca 100644 --- a/src/util-conf.c +++ b/src/util-conf.c @@ -61,7 +61,54 @@ TmEcode ConfigCheckLogDirectory(const char *log_dir) struct stat buf; if (stat(log_dir, &buf) != 0) { #endif /* OS_WIN32 */ - SCReturnInt(TM_ECODE_FAILED); + SCReturnInt(TM_ECODE_FAILED); + } + SCReturnInt(TM_ECODE_OK); +} + +TmEcode ConfigSetDataDirectory(char *name) +{ + if (strlen(name) == 0) + return TM_ECODE_OK; + + size_t size = strlen(name) + 1; + char tmp[size]; + strlcpy(tmp, name, size); + if (tmp[size - 2] == '/') + tmp[size - 2] = '\0'; + + return ConfSetFinal("default-data-dir", tmp) ? TM_ECODE_OK : TM_ECODE_FAILED; +} + +const char *ConfigGetDataDirectory() +{ + const char *data_dir = NULL; + + if (ConfGet("default-data-dir", &data_dir) != 1) { +#ifdef OS_WIN32 + data_dir = _getcwd(NULL, 0); + if (data_dir == NULL) { + data_dir = DEFAULT_DATA_DIR; + } +#else + data_dir = DEFAULT_DATA_DIR; +#endif /* OS_WIN32 */ + } + + return data_dir; +} + +TmEcode ConfigCheckDataDirectory(const char *data_dir) +{ + SCEnter(); +#ifdef OS_WIN32 + struct _stat buf; + if (_stat(data_dir, &buf) != 0) { +#else + struct stat buf; + if (stat(data_dir, &buf) != 0) { +#endif /* OS_WIN32 */ + SCReturnInt(TM_ECODE_FAILED); } SCReturnInt(TM_ECODE_OK); } diff --git a/src/util-conf.h b/src/util-conf.h index 6be51d6845..721d1234c3 100644 --- a/src/util-conf.h +++ b/src/util-conf.h @@ -31,6 +31,10 @@ TmEcode ConfigSetLogDirectory(char *name); const char *ConfigGetLogDirectory(void); TmEcode ConfigCheckLogDirectory(const char *log_dir); +TmEcode ConfigSetDataDirectory(char *name); +const char *ConfigGetDataDirectory(void); +TmEcode ConfigCheckDataDirectory(const char *log_dir); + ConfNode *ConfFindDeviceConfig(ConfNode *node, const char *iface); int ConfUnixSocketIsEnable(void);