]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
suricata: --data-dir option
authorVictor Julien <victor@inliniac.net>
Thu, 25 Apr 2019 13:42:46 +0000 (15:42 +0200)
committerVictor Julien <victor@inliniac.net>
Tue, 3 Sep 2019 13:17:55 +0000 (15:17 +0200)
configure.ac
src/conf.h
src/suricata.c
src/suricata.h
src/util-conf.c
src/util-conf.h

index 482ad3f27cb58176ad3e778086ac8f76b5a35a6a..691d4c28b220809bc289a891f1333310e02b1e94 100644 (file)
@@ -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)
index daedbf9248188ae79a0c12f3f9a2af1793bd88a1..c71dded8ca90773fb85febb77a9ea9d2dd333846 100644 (file)
@@ -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);
index 6393de0f838e3745ed185af45565908028925045..33aeb51e946862834131a4d2cc6f75d4e7496fff 100644 (file)
@@ -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");
+            }
+        }
     }
 }
 
index ca3bdffb8d2c261d14e5929de47bdf4a811cdc81..6ddc5a92a89cacab77f71a2313e1766e680b9348 100644 (file)
@@ -153,6 +153,7 @@ typedef struct SCInstance_ {
 
     bool system;
     bool set_logdir;
+    bool set_datadir;
 
     int delayed_detect;
     int disabled_detect;
index 212be9d7a8bb33683cb26ada479c315d7694ad25..84b5527ecac2ed6a0173034600f3fb3b70b5bcd3 100644 (file)
@@ -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);
 }
index 6be51d6845f1c2a37e08153e189455cf3b28add2..721d1234c35c0ea62773a97cb4bd286af613af50 100644 (file)
@@ -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);