]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Feature] Extend log structure
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 5 Apr 2016 15:24:44 +0000 (16:24 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 5 Apr 2016 15:24:44 +0000 (16:24 +0100)
src/libserver/protocol.c
src/libserver/protocol.h
src/log_helper.c

index e0df280d57972de12d7895ac00aaced0f950464c..35c912f59ef5159d157676483f715d3d792e1e3e 100644 (file)
@@ -1061,6 +1061,7 @@ rspamd_protocol_write_log_pipe (struct rspamd_worker_ctx *ctx,
        struct metric_result *mres;
        GHashTableIter it;
        gpointer k, v;
+       struct symbol *sym;
        gint id, i;
        gsize sz;
 
@@ -1071,9 +1072,12 @@ rspamd_protocol_write_log_pipe (struct rspamd_worker_ctx *ctx,
                                mres = g_hash_table_lookup (task->results, DEFAULT_METRIC);
 
                                if (mres) {
-                                       sz = sizeof (*ls) + sizeof (guint32) *
+                                       sz = sizeof (*ls) +
+                                                       sizeof (struct rspamd_protocol_log_symbol_result) *
                                                        g_hash_table_size (mres->symbols);
                                        ls = g_slice_alloc (sz);
+                                       ls->score = mres->score;
+                                       ls->required_score = mres->actions_limits[METRIC_ACTION_REJECT];
                                        ls->nresults = g_hash_table_size (mres->symbols);
 
                                        g_hash_table_iter_init (&it, mres->symbols);
@@ -1082,12 +1086,15 @@ rspamd_protocol_write_log_pipe (struct rspamd_worker_ctx *ctx,
                                        while (g_hash_table_iter_next (&it, &k, &v)) {
                                                id = rspamd_symbols_cache_find_symbol (task->cfg->cache,
                                                                k);
+                                               sym = v;
 
                                                if (id >= 0) {
-                                                       ls->results[i] = id;
+                                                       ls->results[i].id = id;
+                                                       ls->results[i].score = sym->score;
                                                }
                                                else {
-                                                       ls->results[i] = -1;
+                                                       ls->results[i].id = -1;
+                                                       ls->results[i].score = 0.0;
                                                }
 
                                                i ++;
@@ -1095,7 +1102,7 @@ rspamd_protocol_write_log_pipe (struct rspamd_worker_ctx *ctx,
                                }
                                else {
                                        sz = sizeof (*ls);
-                                       ls = g_slice_alloc (sz);
+                                       ls = g_slice_alloc0 (sz);
                                        ls->nresults = 0;
                                }
 
index 15705c19adeaacbced26280ddd6181fc45f40273..9ba1d67ca5d6e6db2e2f6333783c145ff0215e8c 100644 (file)
 #define RSPAMD_LENGTH_ERROR RSPAMD_BASE_ERROR + 4
 #define RSPAMD_STATFILE_ERROR RSPAMD_BASE_ERROR + 5
 
+struct rspamd_protocol_log_symbol_result {
+       guint32 id;
+       gdouble score;
+};
 struct rspamd_protocol_log_message_sum {
        guint32 nresults;
-       guint32 results[];
+       gdouble score;
+       gdouble required_score;
+       struct rspamd_protocol_log_symbol_result results[];
 };
 
 struct metric;
index fd3ada91006c72958f91b5b9309759d593c58e19..d46122b69b81a092e25057d0b50bbc44a90387ab 100644 (file)
@@ -87,10 +87,11 @@ rspamd_log_helper_read (gint fd, short what, gpointer ud)
        if (r >= (gssize)sizeof (struct rspamd_protocol_log_message_sum)) {
                memcpy (&n, buf, sizeof (n));
 
-               if (n != (r - sizeof (guint32)) / sizeof (guint32)) {
+               if (n != (r - sizeof (*sm)) / sizeof (struct rspamd_protocol_log_symbol_result)) {
                        msg_warn ("cannot read data from log pipe: bad length: %d elements "
                                        "announced but %d available", n,
-                                       (r - sizeof (guint32)) / sizeof (guint32));
+                                       (r - sizeof (*sm)) /
+                                       sizeof (struct rspamd_protocol_log_symbol_result));
                }
                else {
                        sm = g_malloc (r);
@@ -98,10 +99,17 @@ rspamd_log_helper_read (gint fd, short what, gpointer ud)
 
                        DL_FOREACH (ctx->scripts, sc) {
                                lua_rawgeti (ctx->L, LUA_REGISTRYINDEX, sc->cbref);
+                               lua_pushnumber (ctx->L, sm->score);
+                               lua_pushnumber (ctx->L, sm->required_score);
 
                                lua_createtable (ctx->L, n, 0);
                                for (i = 0; i < n; i ++) {
-                                       lua_pushnumber (ctx->L, sm->results[i]);
+                                       lua_createtable (ctx->L, 2, 0);
+                                       lua_pushnumber (ctx->L, sm->results[i].id);
+                                       lua_rawseti (ctx->L, -2, 1);
+                                       lua_pushnumber (ctx->L, sm->results[i].score);
+                                       lua_rawseti (ctx->L, -2, 2);
+
                                        lua_rawseti (ctx->L, -2, (i + 1));
                                }
 
@@ -109,7 +117,7 @@ rspamd_log_helper_read (gint fd, short what, gpointer ud)
                                *pcfg = ctx->cfg;
                                rspamd_lua_setclass (ctx->L, "rspamd{config}", -1);
 
-                               if (lua_pcall (ctx->L, 2, 0, 0) != 0) {
+                               if (lua_pcall (ctx->L, 4, 0, 0) != 0) {
                                        msg_err ("error executing log handler code: %s",
                                                        lua_tostring (ctx->L, -1));
                                        lua_pop (ctx->L, 1);