ctx->ev_base = rspamd_prepare_worker (worker,
"controller",
- rspamd_controller_accept_socket);
+ rspamd_controller_accept_socket,
+ TRUE);
msec_to_tv (ctx->timeout, &ctx->io_tv);
ctx->start_time = time (NULL);
ctx->ev_base = rspamd_prepare_worker (worker,
"fuzzy",
- NULL);
+ NULL,
+ FALSE);
ctx->peer_fd = -1;
ctx->worker = worker;
double_to_tv (ctx->master_timeout, &ctx->master_io_tv);
ctx->ev_base = rspamd_prepare_worker (worker,
"hs_helper",
- NULL);
+ NULL,
+ FALSE);
if (!rspamd_rs_compile (ctx, worker, FALSE)) {
/* Tell main not to respawn more workers */
struct timespec ts;
#endif
struct metric *def_metric;
- struct rspamd_config_post_load_script *sc;
- struct rspamd_config **pcfg;
gboolean ret = TRUE;
#ifdef HAVE_CLOCK_GETTIME
rspamd_config_libs (cfg->libs_ctx, cfg);
}
- /* Execute post load scripts */
- LL_FOREACH (cfg->on_load, sc) {
- lua_rawgeti (cfg->lua_state, LUA_REGISTRYINDEX, sc->cbref);
- pcfg = lua_newuserdata (cfg->lua_state, sizeof (*pcfg));
- *pcfg = cfg;
- rspamd_lua_setclass (cfg->lua_state, "rspamd{config}", -1);
-
- if (lua_pcall (cfg->lua_state, 1, 0, 0) != 0) {
- msg_err_config ("error executing post load code: %s",
- lua_tostring (cfg->lua_state, -1));
- lua_pop (cfg->lua_state, 1);
-
- return FALSE;
- }
- }
-
/* Validate cache */
if (opts & RSPAMD_CONFIG_INIT_VALIDATE) {
return rspamd_symbols_cache_validate (cfg->cache, cfg, FALSE) && ret;
struct event_base *
rspamd_prepare_worker (struct rspamd_worker *worker, const char *name,
- void (*accept_handler)(int, short, void *))
+ void (*accept_handler)(int, short, void *), gboolean load_lua)
{
struct event_base *ev_base;
struct event *accept_events;
}
}
+ if (load_lua) {
+ struct rspamd_config *cfg = worker->srv->cfg;
+
+ rspamd_lua_run_postloads (cfg->lua_state, cfg, ev_base);
+ }
+
return ev_base;
}
*/
struct event_base *
rspamd_prepare_worker (struct rspamd_worker *worker, const char *name,
- void (*accept_handler)(int, short, void *));
+ void (*accept_handler)(int, short, void *), gboolean load_lua);
/**
* Set special signal handler for a worker
ctx->ev_base = rspamd_prepare_worker (worker,
"log_helper",
- NULL);
+ NULL,
+ TRUE);
ctx->cfg = worker->srv->cfg;
ctx->scripts = worker->cf->scripts;
ctx->L = ctx->cfg->lua_state;
#include "lua_common.h"
#include "lua/global_functions.lua.h"
#include "lptree.h"
+#include "utlist.h"
/* Lua module init function */
#define MODULE_INIT_FUNC "module_init"
luaL_argcheck (L, ud != NULL, pos, "'event_base' expected");
return ud ? *((struct event_base **)ud) : NULL;
}
+
+gboolean
+rspamd_lua_run_postloads (lua_State *L, struct rspamd_config *cfg,
+ struct event_base *ev_base)
+{
+ struct rspamd_config_post_load_script *sc;
+ struct rspamd_config **pcfg;
+ struct event_base **pev_base;
+
+ /* Execute post load scripts */
+ LL_FOREACH (cfg->on_load, sc) {
+ lua_rawgeti (cfg->lua_state, LUA_REGISTRYINDEX, sc->cbref);
+ pcfg = lua_newuserdata (cfg->lua_state, sizeof (*pcfg));
+ *pcfg = cfg;
+ rspamd_lua_setclass (cfg->lua_state, "rspamd{config}", -1);
+
+ pev_base = lua_newuserdata (cfg->lua_state, sizeof (*pev_base));
+ *pev_base = ev_base;
+ rspamd_lua_setclass (cfg->lua_state, "rspamd{ev_base}", -1);
+
+ if (lua_pcall (cfg->lua_state, 2, 0, 0) != 0) {
+ msg_err_config ("error executing post load code: %s",
+ lua_tostring (cfg->lua_state, -1));
+ lua_pop (cfg->lua_state, 1);
+
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
rspamd_config_post_load_script *sc,
struct rspamd_task *task);
+/**
+ * Run post-load operations
+ * @param L
+ * @param cfg
+ * @param ev_base
+ */
+gboolean rspamd_lua_run_postloads (lua_State *L, struct rspamd_config *cfg,
+ struct event_base *ev_base);
+
#endif /* WITH_LUA */
#endif /* RSPAMD_LUA_H */
ctx->ev_base = rspamd_prepare_worker (worker,
"lua_worker",
- lua_accept_socket);
+ lua_accept_socket,
+ TRUE);
L = worker->srv->cfg->lua_state;
ctx->L = L;
struct timeval rot_tv;
ctx->ev_base = rspamd_prepare_worker (worker, "rspamd_proxy",
- proxy_accept_socket);
+ proxy_accept_socket,
+ TRUE);
ctx->resolver = dns_resolver_init (worker->srv->logger,
ctx->ev_base,
struct rspamd_worker_ctx *ctx = worker->ctx;
struct rspamd_worker_log_pipe *lp, *ltmp;
- ctx->ev_base = rspamd_prepare_worker (worker, "normal", accept_socket);
+ ctx->ev_base = rspamd_prepare_worker (worker, "normal", accept_socket, TRUE);
msec_to_tv (ctx->timeout, &ctx->io_tv);
rspamd_symbols_cache_start_refresh (worker->srv->cfg->cache, ctx->ev_base);