#include "libserver/worker_util.h"
#include "libserver/rspamd_control.h"
#include "libutil/addr.h"
+#include "lua/lua_common.h"
#include "unix-std.h"
+#include "utlist.h"
#ifdef HAVE_GLOB_H
#include <glob.h>
struct rspamd_config *cfg;
struct event_base *ev_base;
struct event log_ev;
+ struct rspamd_worker_lua_script *scripts;
+ lua_State *L;
gint pair[2];
};
gssize r;
guint32 n, i;
struct rspamd_protocol_log_message_sum *sm;
- GString *out;
+ struct rspamd_worker_lua_script *sc;
+ struct rspamd_config **pcfg;
r = read (fd, buf, sizeof (buf));
else {
sm = g_malloc (r);
memcpy (sm, buf, r);
- out = g_string_sized_new (31);
- for (i = 0; i < n; i ++) {
+ DL_FOREACH (ctx->scripts, sc) {
+ lua_rawgeti (ctx->L, LUA_REGISTRYINDEX, sc->cbref);
- rspamd_printf_gstring (out, "%s%s", i == 0 ? "" : ", ",
- rspamd_symbols_cache_symbol_by_id (ctx->cfg->cache,
- sm->results[i]));
+ lua_createtable (ctx->L, n, 0);
+ for (i = 0; i < n; i ++) {
+ lua_pushnumber (ctx->L, sm->results[i]);
+ lua_rawseti (ctx->L, -2, (i + 1));
+ }
+
+ pcfg = lua_newuserdata (ctx->L, sizeof (*pcfg));
+ *pcfg = ctx->cfg;
+ rspamd_lua_setclass (ctx->L, "rspamd{config}", -1);
+
+ if (lua_pcall (ctx->L, 2, 0, 0) != 0) {
+ msg_err ("error executing log handler code: %s",
+ lua_tostring (ctx->L, -1));
+ lua_pop (ctx->L, 1);
+ }
}
- msg_info ("got log line: %v", out);
- g_string_free (out, TRUE);
g_free (sm);
}
}
ctx->ev_base = rspamd_prepare_worker (worker,
"log_helper",
NULL);
+ ctx->cfg = worker->srv->cfg;
+ ctx->scripts = worker->cf->scripts;
+ ctx->L = ctx->cfg->lua_state;
#ifdef HAVE_SOCK_SEQPACKET
r = socketpair (AF_LOCAL, SOCK_SEQPACKET, 0, ctx->pair);
srv_cmd.type = RSPAMD_SRV_LOG_PIPE;
srv_cmd.cmd.log_pipe.type = RSPAMD_LOG_PIPE_SYMBOLS;
+
/* Wait for startup being completed */
rspamd_mempool_lock_mutex (worker->srv->start_mtx);
rspamd_srv_send_command (worker, ctx->ev_base, &srv_cmd, ctx->pair[1],