diff --git a/src/unix-manager.c b/src/unix-manager.c index 865617d0a0..f5c372716a 100644 --- a/src/unix-manager.c +++ b/src/unix-manager.c @@ -654,18 +654,35 @@ static TmEcode UnixManagerCaptureModeCommand(json_t *cmd, SCReturnInt(TM_ECODE_OK); } -static TmEcode UnixManagerReloadRules(json_t *cmd, json_t *server_msg, void *data) +static TmEcode UnixManagerReloadRulesWrapper(json_t *cmd, json_t *server_msg, void *data, int do_wait) { SCEnter(); - DetectEngineReloadStart(); + int r = DetectEngineReloadStart(); - while (!DetectEngineReloadIsIdle()) - usleep(100); + if (r == 0 && do_wait) { + while (!DetectEngineReloadIsIdle()) + usleep(100); + } else { + if (r == -1) { + json_object_set_new(server_msg, "message", json_string("Reload already in progress")); + SCReturnInt(TM_ECODE_FAILED); + } + } json_object_set_new(server_msg, "message", json_string("done")); SCReturnInt(TM_ECODE_OK); } +static TmEcode UnixManagerReloadRules(json_t *cmd, json_t *server_msg, void *data) +{ + return UnixManagerReloadRulesWrapper(cmd, server_msg, data, 1); +} + +static TmEcode UnixManagerNonBlockingReloadRules(json_t *cmd, json_t *server_msg, void *data) +{ + return UnixManagerReloadRulesWrapper(cmd, server_msg, data, 0); +} + static TmEcode UnixManagerReloadTimeCommand(json_t *cmd, json_t *server_msg, void *data) { @@ -901,6 +918,7 @@ int UnixManagerInit(void) UnixManagerRegisterCommand("conf-get", UnixManagerConfGetCommand, &command, UNIX_CMD_TAKE_ARGS); UnixManagerRegisterCommand("dump-counters", StatsOutputCounterSocket, NULL, 0); UnixManagerRegisterCommand("reload-rules", UnixManagerReloadRules, NULL, 0); + UnixManagerRegisterCommand("ruleset-reload-nonblocking", UnixManagerNonBlockingReloadRules, NULL, 0); UnixManagerRegisterCommand("ruleset-reload-time", UnixManagerReloadTimeCommand, NULL, 0); UnixManagerRegisterCommand("ruleset-stats", UnixManagerRulesetStatsCommand, NULL, 0); UnixManagerRegisterCommand("register-tenant-handler", UnixSocketRegisterTenantHandler, &command, UNIX_CMD_TAKE_ARGS);