#define SOCKET_FILENAME "suricata-command.socket"
#define SOCKET_TARGET SOCKET_PATH SOCKET_FILENAME
+#define MAX_FAILED_RULES 20
+
typedef struct Command_ {
char *name;
TmEcode (*Func)(json_t *, json_t *, void *);
SCReturnInt(retval);
}
+static TmEcode UnixManagerShowFailedRules(json_t *cmd,
+ json_t *server_msg, void *data)
+{
+ SCEnter();
+ int rules_cnt = 0;
+ DetectEngineCtx *de_ctx = DetectEngineGetCurrent();
+ if (de_ctx == NULL) {
+ json_object_set_new(server_msg, "message", json_string("Unable to get info"));
+ SCReturnInt(TM_ECODE_OK);
+ }
+
+ /* Since we need to deference de_ctx, we don't want to lost it. */
+ DetectEngineCtx *list = de_ctx;
+ json_t *js_sigs_array = json_array();
+
+ if (js_sigs_array == NULL) {
+ json_object_set_new(server_msg, "message", json_string("Unable to get info"));
+ goto error;
+ }
+ while (list) {
+ SigString *sigs_str = NULL;
+ TAILQ_FOREACH(sigs_str, &list->sig_stat.failed_sigs, next) {
+ json_t *jdata = json_object();
+ if (jdata == NULL) {
+ json_object_set_new(server_msg, "message", json_string("Unable to get the sig"));
+ goto error;
+ }
+
+ json_object_set_new(jdata, "tenant_id", json_integer(list->tenant_id));
+ json_object_set_new(jdata, "rule", json_string(sigs_str->sig_str));
+ json_object_set_new(jdata, "filename", json_string(sigs_str->filename));
+ json_object_set_new(jdata, "line", json_integer(sigs_str->line));
+ if (sigs_str->sig_error) {
+ json_object_set_new(jdata, "error", json_string(sigs_str->sig_error));
+ }
+ json_array_append_new(js_sigs_array, jdata);
+ if (++rules_cnt > MAX_FAILED_RULES) {
+ break;
+ }
+ }
+ if (rules_cnt > MAX_FAILED_RULES) {
+ break;
+ }
+ list = list->next;
+ }
+
+ json_object_set_new(server_msg, "message", js_sigs_array);
+ DetectEngineDeReference(&de_ctx);
+ SCReturnInt(TM_ECODE_OK);
+
+error:
+ DetectEngineDeReference(&de_ctx);
+ json_object_clear(js_sigs_array);
+ json_decref(js_sigs_array);
+ SCReturnInt(TM_ECODE_FAILED);
+}
+
static TmEcode UnixManagerConfGetCommand(json_t *cmd,
json_t *server_msg, void *data)
{
UnixManagerRegisterCommand("ruleset-reload-nonblocking", UnixManagerNonBlockingReloadRules, NULL, 0);
UnixManagerRegisterCommand("ruleset-reload-time", UnixManagerReloadTimeCommand, NULL, 0);
UnixManagerRegisterCommand("ruleset-stats", UnixManagerRulesetStatsCommand, NULL, 0);
+ UnixManagerRegisterCommand("ruleset-failed-rules", UnixManagerShowFailedRules, NULL, 0);
UnixManagerRegisterCommand("register-tenant-handler", UnixSocketRegisterTenantHandler, &command, UNIX_CMD_TAKE_ARGS);
UnixManagerRegisterCommand("unregister-tenant-handler", UnixSocketUnregisterTenantHandler, &command, UNIX_CMD_TAKE_ARGS);
UnixManagerRegisterCommand("register-tenant", UnixSocketRegisterTenant, &command, UNIX_CMD_TAKE_ARGS);