]> source.dussan.org Git - rspamd.git/commitdiff
[Rework] Change lua global variables registration
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 26 Mar 2019 16:38:27 +0000 (16:38 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 26 Mar 2019 16:38:27 +0000 (16:38 +0000)
src/libserver/cfg_rcl.c
src/lua/lua_common.c
src/lua/lua_common.h
src/rspamadm/rspamadm.c
test/rspamd_lua_test.c

index 9a2d7cd193dab5865ed06b70ce67ef191a926125..c6d2f3572bd37f501a32cf635819ea7fa25fdbda 100644 (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;
 
index cff684aad01d85fc1f8ca28c82a90b4ff5d66c1e..7f49c090d445af2aa5585a832d5b7ebeb0e152e0 100644 (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);
 }
 
index c8858571a0c44024588185ff5fabba4098aa40d7..520f5920de69a44415adf1ea28105ef534d5e855 100644 (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);
index 0c6ffd419993ce6bfce6850f677ecb8a7647ba14..227cbc86b43cdf1a0b6da956558d489fc20a116e 100644 (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
index 15dd3923b79cc10c3e24b2b554d78166b5aaf644..2af0d9aab787721a6450edfb153afeedd9249482 100644 (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);