]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
multi-tenant: allow reload w/o yaml path
authorVictor Julien <vjulien@oisf.net>
Tue, 8 Aug 2023 17:59:57 +0000 (19:59 +0200)
committerVictor Julien <vjulien@oisf.net>
Fri, 11 Aug 2023 05:02:06 +0000 (07:02 +0200)
Store yaml path in de ctx, for reloads w/o path.

This allows for a simpler `reload-tenant N`, where the previously
used yaml is reloaded.

doc/userguide/partials/commands-sc.rst
python/suricata/sc/specs.py
src/detect-engine.c
src/detect.h
src/runmode-unix-socket.c

index a21c2f20cad3fc69d971a21cbb0453f730a15d78..c99f67d8e7b8fc17b3ff6157b8ebe98995662cba 100644 (file)
 
    Register tenant with a particular ID and filename.
 
-.. describe:: reload-tenant <id> <filename>
+.. describe:: reload-tenant <id> [filename]
 
-   Reload a tenant with specified ID and filename.
+   Reload a tenant with specified ID. A filename to a tenant yaml can be
+   specified. If it is omitted, the original yaml that was used to load
+   / last reload the tenant is used.
 
 .. describe:: unregister-tenant <id>
 
index eec831a2d8bd70c0657feaa71620d36a6ff2a32c..c7e045873303651ff966c833bebd85bcc2599925 100644 (file)
@@ -116,7 +116,7 @@ argsd = {
         },
         {
             "name": "filename",
-            "required": 1,
+            "required": 0,
         },
     ],
     "add-hostbit": [
index 251c586bc0610b7b6071b2caaa84c63bb76afcd3..90296c092721f9523466943ebb1362038238deb4 100644 (file)
@@ -2661,6 +2661,10 @@ void DetectEngineCtxFree(DetectEngineCtx *de_ctx)
     SCClassConfDeinit(de_ctx);
     SCReferenceConfDeinit(de_ctx);
 
+    if (de_ctx->tenant_path) {
+        SCFree(de_ctx->tenant_path);
+    }
+
     SCFree(de_ctx);
     //DetectAddressGroupPrintMemory();
     //DetectSigGroupPrintMemory();
@@ -3844,6 +3848,11 @@ static int DetectEngineMultiTenantLoadTenant(uint32_t tenant_id, const char *fil
     de_ctx->type = DETECT_ENGINE_TYPE_TENANT;
     de_ctx->tenant_id = tenant_id;
     de_ctx->loader_id = loader_id;
+    de_ctx->tenant_path = SCStrdup(filename);
+    if (de_ctx->tenant_path == NULL) {
+        SCLogError("Failed to duplicate path");
+        goto error;
+    }
 
     if (SigLoadSignatures(de_ctx, NULL, 0) < 0) {
         SCLogError("Loading signatures failed.");
@@ -3869,6 +3878,9 @@ static int DetectEngineMultiTenantReloadTenant(uint32_t tenant_id, const char *f
         return -1;
     }
 
+    if (filename == NULL)
+        filename = old_de_ctx->tenant_path;
+
     char prefix[64];
     snprintf(prefix, sizeof(prefix), "multi-detect.%u.reload.%d", tenant_id, reload_cnt);
     reload_cnt++;
@@ -3896,6 +3908,11 @@ static int DetectEngineMultiTenantReloadTenant(uint32_t tenant_id, const char *f
     new_de_ctx->type = DETECT_ENGINE_TYPE_TENANT;
     new_de_ctx->tenant_id = tenant_id;
     new_de_ctx->loader_id = old_de_ctx->loader_id;
+    new_de_ctx->tenant_path = SCStrdup(filename);
+    if (new_de_ctx->tenant_path == NULL) {
+        SCLogError("Failed to duplicate path");
+        goto error;
+    }
 
     if (SigLoadSignatures(new_de_ctx, NULL, 0) < 0) {
         SCLogError("Loading signatures failed.");
@@ -3982,10 +3999,12 @@ static int DetectLoaderSetupReloadTenant(uint32_t tenant_id, const char *yaml, i
         return -ENOMEM;
 
     t->tenant_id = tenant_id;
-    t->yaml = SCStrdup(yaml);
-    if (t->yaml == NULL) {
-        SCFree(t);
-        return -ENOMEM;
+    if (yaml != NULL) {
+        t->yaml = SCStrdup(yaml);
+        if (t->yaml == NULL) {
+            SCFree(t);
+            return -ENOMEM;
+        }
     }
     t->reload_cnt = reload_cnt;
 
index 8757539e72f5574c76d286d809b34e1e92c05477..fd299c5047b2ca6fd886e0946c31c473c3e8b002 100644 (file)
@@ -1024,6 +1024,8 @@ typedef struct DetectEngineCtx_ {
     /* --engine-analysis */
     struct EngineAnalysisCtx_ *ea;
 
+    /* path to the tenant yaml for this engine */
+    char *tenant_path;
 } DetectEngineCtx;
 
 /* Engine groups profiles (low, medium, high, custom) */
index 5216efc2de6cd4cbde128beab675cb10ecd9d820..7de884c9279f1ca323c9a93145f5a415c2fa6677 100644 (file)
@@ -1072,7 +1072,7 @@ static int reload_cnt = 1;
  */
 TmEcode UnixSocketReloadTenant(json_t *cmd, json_t* answer, void *data)
 {
-    const char *filename;
+    const char *filename = NULL;
     SCStat st;
 
     if (!(DetectEngineMultiTenantEnabled())) {
@@ -1091,14 +1091,16 @@ TmEcode UnixSocketReloadTenant(json_t *cmd, json_t* answer, void *data)
 
     /* 2 get tenant yaml */
     jarg = json_object_get(cmd, "filename");
-    if (!json_is_string(jarg)) {
-        json_object_set_new(answer, "message", json_string("command is not a string"));
-        return TM_ECODE_FAILED;
-    }
-    filename = json_string_value(jarg);
-    if (SCStatFn(filename, &st) != 0) {
-        json_object_set_new(answer, "message", json_string("file does not exist"));
-        return TM_ECODE_FAILED;
+    if (jarg) {
+        if (!json_is_string(jarg)) {
+            json_object_set_new(answer, "message", json_string("command is not a string"));
+            return TM_ECODE_FAILED;
+        }
+        filename = json_string_value(jarg);
+        if (SCStatFn(filename, &st) != 0) {
+            json_object_set_new(answer, "message", json_string("file does not exist"));
+            return TM_ECODE_FAILED;
+        }
     }
 
     SCLogDebug("reload-tenant: %d %s", tenant_id, filename);