Browse Source

[Rework] Change lua global variables registration

tags/1.9.1
Vsevolod Stakhov 5 years ago
parent
commit
fbe966f7b9
5 changed files with 106 additions and 55 deletions
  1. 3
    1
      src/libserver/cfg_rcl.c
  2. 97
    50
      src/lua/lua_common.c
  3. 2
    2
      src/lua/lua_common.h
  4. 2
    1
      src/rspamadm/rspamadm.c
  5. 2
    1
      test/rspamd_lua_test.c

+ 3
- 1
src/libserver/cfg_rcl.c View File

@@ -3678,6 +3678,8 @@ rspamd_config_read (struct rspamd_config *cfg, const gchar *filename,
struct rspamd_rcl_section *top, *logger_section;
const ucl_object_t *logger_obj;

rspamd_lua_set_env (cfg->lua_state, vars);

if (!rspamd_config_parse_ucl (cfg, filename, vars, NULL, NULL, &err)) {
msg_err_config_forced ("failed to load config: %e", err);
g_error_free (err);
@@ -3687,7 +3689,7 @@ rspamd_config_read (struct rspamd_config *cfg, const gchar *filename,

top = rspamd_rcl_config_init (cfg, NULL);
rspamd_lua_set_path (cfg->lua_state, cfg->rcl_obj, vars);
rspamd_lua_set_globals (cfg, cfg->lua_state, vars);
rspamd_lua_set_globals (cfg, cfg->lua_state);
rspamd_mempool_add_destructor (cfg->cfg_pool, rspamd_rcl_section_free, top);
err = NULL;


+ 97
- 50
src/lua/lua_common.c View File

@@ -538,59 +538,10 @@ rspamd_lua_rspamd_version (lua_State *L)
}

void
rspamd_lua_set_globals (struct rspamd_config *cfg, lua_State *L,
GHashTable *vars)
rspamd_lua_set_env (lua_State *L, GHashTable *vars)
{
struct rspamd_config **pcfg;
gint orig_top = lua_gettop (L);

/* First check for global variable 'config' */
lua_getglobal (L, "config");
if (lua_isnil (L, -1)) {
/* Assign global table to set up attributes */
lua_newtable (L);
lua_setglobal (L, "config");
}

lua_getglobal (L, "metrics");
if (lua_isnil (L, -1)) {
lua_newtable (L);
lua_setglobal (L, "metrics");
}

lua_getglobal (L, "composites");
if (lua_isnil (L, -1)) {
lua_newtable (L);
lua_setglobal (L, "composites");
}

lua_getglobal (L, "rspamd_classifiers");
if (lua_isnil (L, -1)) {
lua_newtable (L);
lua_setglobal (L, "rspamd_classifiers");
}

lua_getglobal (L, "classifiers");
if (lua_isnil (L, -1)) {
lua_newtable (L);
lua_setglobal (L, "classifiers");
}

lua_getglobal (L, "rspamd_version");
if (lua_isnil (L, -1)) {
lua_pushcfunction (L, rspamd_lua_rspamd_version);
lua_setglobal (L, "rspamd_version");
}

if (cfg != NULL) {
pcfg = lua_newuserdata (L, sizeof (struct rspamd_config *));
rspamd_lua_setclass (L, "rspamd{config}", -1);
*pcfg = cfg;
lua_setglobal (L, "rspamd_config");
}

lua_settop (L, orig_top);

/* Set known paths as rspamd_paths global */
lua_getglobal (L, "rspamd_paths");
if (lua_isnil (L, -1)) {
@@ -728,6 +679,102 @@ rspamd_lua_set_globals (struct rspamd_config *cfg, lua_State *L,
lua_setglobal (L, "rspamd_paths");
}

lua_getglobal (L, "rspamd_env");
if (lua_isnil (L, -1)) {
lua_newtable (L);

if (vars != NULL) {
GHashTableIter it;
gpointer k, v;

g_hash_table_iter_init (&it, vars);

while (g_hash_table_iter_next (&it, &k, &v)) {
rspamd_lua_table_set (L, k, v);
}
}

gint hostlen = sysconf (_SC_HOST_NAME_MAX);

if (hostlen <= 0) {
hostlen = 256;
}
else {
hostlen ++;
}

gchar *hostbuf = g_alloca (hostlen);
memset (hostbuf, 0, hostlen);
gethostname (hostbuf, hostlen - 1);

rspamd_lua_table_set (L, "hostname", hostbuf);

rspamd_lua_table_set (L, "version", RVERSION);
rspamd_lua_table_set (L, "ver_major", RSPAMD_VERSION_MAJOR);
rspamd_lua_table_set (L, "ver_minor", RSPAMD_VERSION_MINOR);
rspamd_lua_table_set (L, "ver_patch", RSPAMD_VERSION_PATCH);
rspamd_lua_table_set (L, "ver_id", RID);
lua_pushstring (L, "ver_num");
lua_pushinteger (L, RSPAMD_VERSION_NUM);
lua_settable (L, -3);

lua_setglobal (L, "rspamd_env");
}

lua_settop (L, orig_top);
}

void
rspamd_lua_set_globals (struct rspamd_config *cfg, lua_State *L)
{
struct rspamd_config **pcfg;
gint orig_top = lua_gettop (L);

/* First check for global variable 'config' */
lua_getglobal (L, "config");
if (lua_isnil (L, -1)) {
/* Assign global table to set up attributes */
lua_newtable (L);
lua_setglobal (L, "config");
}

lua_getglobal (L, "metrics");
if (lua_isnil (L, -1)) {
lua_newtable (L);
lua_setglobal (L, "metrics");
}

lua_getglobal (L, "composites");
if (lua_isnil (L, -1)) {
lua_newtable (L);
lua_setglobal (L, "composites");
}

lua_getglobal (L, "rspamd_classifiers");
if (lua_isnil (L, -1)) {
lua_newtable (L);
lua_setglobal (L, "rspamd_classifiers");
}

lua_getglobal (L, "classifiers");
if (lua_isnil (L, -1)) {
lua_newtable (L);
lua_setglobal (L, "classifiers");
}

lua_getglobal (L, "rspamd_version");
if (lua_isnil (L, -1)) {
lua_pushcfunction (L, rspamd_lua_rspamd_version);
lua_setglobal (L, "rspamd_version");
}

if (cfg != NULL) {
pcfg = lua_newuserdata (L, sizeof (struct rspamd_config *));
rspamd_lua_setclass (L, "rspamd{config}", -1);
*pcfg = cfg;
lua_setglobal (L, "rspamd_config");
}

lua_settop (L, orig_top);
}


+ 2
- 2
src/lua/lua_common.h View File

@@ -306,8 +306,8 @@ void rspamd_lua_set_path (lua_State *L, const ucl_object_t *cfg_obj,
GHashTable *vars);

/* Set some lua globals */
void rspamd_lua_set_globals (struct rspamd_config *cfg, lua_State *L,
GHashTable *vars);
void rspamd_lua_set_env (lua_State *L, GHashTable *vars);
void rspamd_lua_set_globals (struct rspamd_config *cfg, lua_State *L);

struct memory_pool_s * rspamd_lua_check_mempool (lua_State * L, gint pos);
struct rspamd_config * lua_check_config (lua_State * L, gint pos);

+ 2
- 1
src/rspamadm/rspamadm.c View File

@@ -458,8 +458,9 @@ main (gint argc, gchar **argv, gchar **env)
setproctitle ("rspamdadm");

L = cfg->lua_state;
rspamd_lua_set_env (L, ucl_vars);
rspamd_lua_set_path (L, NULL, ucl_vars);
rspamd_lua_set_globals (cfg, L, ucl_vars);
rspamd_lua_set_globals (cfg, L);
rspamadm_add_lua_globals ();

#ifdef WITH_HIREDIS

+ 2
- 1
test/rspamd_lua_test.c View File

@@ -64,7 +64,8 @@ rspamd_lua_test_func (void)
glob_t globbuf;
gint i, len;

rspamd_lua_set_globals (rspamd_main->cfg, L, NULL);
rspamd_lua_set_env (L, NULL);
rspamd_lua_set_globals (rspamd_main->cfg, L);

if (lua_test_case) {
lua_pushstring (L, lua_test_case);

Loading…
Cancel
Save