@@ -2977,7 +2977,8 @@ start_controller_worker (struct rspamd_worker *worker) | |||
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); |
@@ -2252,7 +2252,8 @@ start_fuzzy (struct rspamd_worker *worker) | |||
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); |
@@ -278,7 +278,8 @@ start_hs_helper (struct rspamd_worker *worker) | |||
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 */ |
@@ -642,8 +642,6 @@ rspamd_config_post_load (struct rspamd_config *cfg, | |||
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 | |||
@@ -750,22 +748,6 @@ rspamd_config_post_load (struct rspamd_config *cfg, | |||
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; |
@@ -257,7 +257,7 @@ rspamd_worker_init_signals (struct rspamd_worker *worker, struct event_base *bas | |||
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; | |||
@@ -301,6 +301,12 @@ rspamd_prepare_worker (struct rspamd_worker *worker, const char *name, | |||
} | |||
} | |||
if (load_lua) { | |||
struct rspamd_config *cfg = worker->srv->cfg; | |||
rspamd_lua_run_postloads (cfg->lua_state, cfg, ev_base); | |||
} | |||
return ev_base; | |||
} | |||
@@ -40,7 +40,7 @@ struct rspamd_worker_signal_handler; | |||
*/ | |||
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 |
@@ -177,7 +177,8 @@ start_log_helper (struct rspamd_worker *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; |
@@ -16,6 +16,7 @@ | |||
#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" | |||
@@ -1136,3 +1137,34 @@ lua_check_ev_base (lua_State * L, gint pos) | |||
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; | |||
} |
@@ -364,5 +364,14 @@ void lua_call_finish_script (lua_State *L, struct | |||
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 */ |
@@ -350,7 +350,8 @@ start_lua_worker (struct rspamd_worker *worker) | |||
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; |
@@ -1445,7 +1445,8 @@ start_rspamd_proxy (struct rspamd_worker *worker) | |||
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, |
@@ -576,7 +576,7 @@ start_worker (struct rspamd_worker *worker) | |||
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); | |||