diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-05-26 19:31:29 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-05-26 19:31:29 +0100 |
commit | 4734176fe1719865d3222aebd6bf3c294349226e (patch) | |
tree | b36f9246764092a0e24dfe71df7b6b5546515536 /src/lua | |
parent | 582e212af4385fdaeb2e209fde6cb5a795a29a3a (diff) | |
download | rspamd-4734176fe1719865d3222aebd6bf3c294349226e.tar.gz rspamd-4734176fe1719865d3222aebd6bf3c294349226e.zip |
[Minor] Move lua globals setup to a more appropriate place
Diffstat (limited to 'src/lua')
-rw-r--r-- | src/lua/lua_common.c | 320 | ||||
-rw-r--r-- | src/lua/lua_common.h | 4 |
2 files changed, 324 insertions, 0 deletions
diff --git a/src/lua/lua_common.c b/src/lua/lua_common.c index f33bc3daa..230c64b78 100644 --- a/src/lua/lua_common.c +++ b/src/lua/lua_common.c @@ -375,6 +375,326 @@ rspamd_lua_set_path (lua_State *L, const ucl_object_t *cfg_obj, GHashTable *vars lua_pop (L, 1); } +#define RSPAMD_CONFDIR_INDEX "CONFDIR" +#define RSPAMD_RUNDIR_INDEX "RUNDIR" +#define RSPAMD_DBDIR_INDEX "DBDIR" +#define RSPAMD_LOGDIR_INDEX "LOGDIR" +#define RSPAMD_PLUGINSDIR_INDEX "PLUGINSDIR" +#define RSPAMD_RULESDIR_INDEX "RULESDIR" +#define RSPAMD_LUALIBDIR_INDEX "LUALIBDIR" +#define RSPAMD_WWWDIR_INDEX "WWWDIR" +#define RSPAMD_PREFIX_INDEX "PREFIX" +#define RSPAMD_VERSION_INDEX "VERSION" + +static gint +rspamd_lua_cmp_version_components (const gchar *comp1, const gchar *comp2) +{ + guint v1, v2; + + v1 = strtoul (comp1, NULL, 10); + v2 = strtoul (comp2, NULL, 10); + + return v1 - v2; +} + +static int +rspamd_lua_rspamd_version_cmp (lua_State *L) +{ + const gchar *ver; + gchar **components; + gint ret = 0; + + if (lua_type (L, 2) == LUA_TSTRING) { + ver = lua_tostring (L, 2); + + components = g_strsplit_set (ver, ".-_", -1); + + if (!components) { + return luaL_error (L, "invalid arguments to 'cmp': %s", ver); + } + + if (components[0]) { + ret = rspamd_lua_cmp_version_components (components[0], + RSPAMD_VERSION_MAJOR); + } + + if (ret) { + goto set; + } + + if (components[1]) { + ret = rspamd_lua_cmp_version_components (components[1], + RSPAMD_VERSION_MINOR); + } + + if (ret) { + goto set; + } + + if (components[2]) { + ret = rspamd_lua_cmp_version_components (components[2], + RSPAMD_VERSION_PATCH); + } + + /* + * XXX: we don't compare git releases assuming that it is meaningless + */ + } + else { + return luaL_error (L, "invalid arguments to 'cmp'"); + } + +set: + g_strfreev (components); + lua_pushnumber (L, ret); + + return 1; +} + +static int +rspamd_lua_rspamd_version_numeric (lua_State *L) +{ + static gint64 version_num = RSPAMD_VERSION_NUM; + const gchar *type; + + if (lua_gettop (L) >= 2 && lua_type (L, 1) == LUA_TSTRING) { + type = lua_tostring (L, 1); + if (g_ascii_strcasecmp (type, "short") == 0) { + version_num = RSPAMD_VERSION_MAJOR_NUM * 1000 + + RSPAMD_VERSION_MINOR_NUM * 100 + + RSPAMD_VERSION_PATCH_NUM * 10; + } + else if (g_ascii_strcasecmp (type, "main") == 0) { + version_num = RSPAMD_VERSION_MAJOR_NUM * 1000 + + RSPAMD_VERSION_MINOR_NUM * 100; + } + else if (g_ascii_strcasecmp (type, "major") == 0) { + version_num = RSPAMD_VERSION_MAJOR_NUM; + } + else if (g_ascii_strcasecmp (type, "minor") == 0) { + version_num = RSPAMD_VERSION_MINOR_NUM; + } + else if (g_ascii_strcasecmp (type, "patch") == 0) { + version_num = RSPAMD_VERSION_PATCH_NUM; + } + } + + lua_pushnumber (L, version_num); + + return 1; +} + +static int +rspamd_lua_rspamd_version (lua_State *L) +{ + const gchar *result = NULL, *type; + + if (lua_gettop (L) == 0) { + result = RVERSION; + } + else if (lua_gettop (L) >= 1 && lua_type (L, 1) == LUA_TSTRING) { + /* We got something like string */ + type = lua_tostring (L, 1); + + if (g_ascii_strcasecmp (type, "short") == 0) { + result = RSPAMD_VERSION_MAJOR + "." RSPAMD_VERSION_MINOR + "." RSPAMD_VERSION_PATCH; + } + else if (g_ascii_strcasecmp (type, "main") == 0) { + result = RSPAMD_VERSION_MAJOR "." RSPAMD_VERSION_MINOR; + } + else if (g_ascii_strcasecmp (type, "major") == 0) { + result = RSPAMD_VERSION_MAJOR; + } + else if (g_ascii_strcasecmp (type, "minor") == 0) { + result = RSPAMD_VERSION_MINOR; + } + else if (g_ascii_strcasecmp (type, "patch") == 0) { + result = RSPAMD_VERSION_PATCH; + } + else if (g_ascii_strcasecmp (type, "id") == 0) { + result = RID; + } + else if (g_ascii_strcasecmp (type, "num") == 0) { + return rspamd_lua_rspamd_version_numeric (L); + } + else if (g_ascii_strcasecmp (type, "cmp") == 0) { + return rspamd_lua_rspamd_version_cmp (L); + } + } + + lua_pushstring (L, result); + + return 1; +} + +void +rspamd_lua_set_globals (struct rspamd_config *cfg, 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)) { + const gchar *confdir = RSPAMD_CONFDIR, *rundir = RSPAMD_RUNDIR, + *dbdir = RSPAMD_DBDIR, *logdir = RSPAMD_LOGDIR, + *wwwdir = RSPAMD_WWWDIR, *pluginsdir = RSPAMD_PLUGINSDIR, + *rulesdir = RSPAMD_RULESDIR, *lualibdir = RSPAMD_LUALIBDIR, + *prefix = RSPAMD_PREFIX; + const gchar *t; + + /* Try environment */ + t = getenv ("PLUGINSDIR"); + if (t) { + pluginsdir = t; + } + + t = getenv ("RULESDIR"); + if (t) { + rulesdir = t; + } + + t = getenv ("DBDIR"); + if (t) { + dbdir = t; + } + + t = getenv ("RUNDIR"); + if (t) { + rundir = t; + } + + t = getenv ("LUALIBDIR"); + if (t) { + lualibdir = t; + } + + t = getenv ("LOGDIR"); + if (t) { + logdir = t; + } + + t = getenv ("WWWDIR"); + if (t) { + wwwdir = t; + } + + t = getenv ("CONFDIR"); + if (t) { + confdir = t; + } + + + if (vars) { + t = g_hash_table_lookup (vars, "PLUGINSDIR"); + if (t) { + pluginsdir = t; + } + + t = g_hash_table_lookup (vars, "RULESDIR"); + if (t) { + rulesdir = t; + } + + t = g_hash_table_lookup (vars, "LUALIBDIR"); + if (t) { + lualibdir = t; + } + + t = g_hash_table_lookup (vars, "RUNDIR"); + if (t) { + rundir = t; + } + + t = g_hash_table_lookup (vars, "WWWDIR"); + if (t) { + wwwdir = t; + } + + t = g_hash_table_lookup (vars, "CONFDIR"); + if (t) { + confdir = t; + } + + t = g_hash_table_lookup (vars, "DBDIR"); + if (t) { + dbdir = t; + } + + t = g_hash_table_lookup (vars, "LOGDIR"); + if (t) { + logdir = t; + } + } + + lua_createtable (L, 0, 9); + + rspamd_lua_table_set (L, RSPAMD_CONFDIR_INDEX, confdir); + rspamd_lua_table_set (L, RSPAMD_RUNDIR_INDEX, rundir); + rspamd_lua_table_set (L, RSPAMD_DBDIR_INDEX, dbdir); + rspamd_lua_table_set (L, RSPAMD_LOGDIR_INDEX, logdir); + rspamd_lua_table_set (L, RSPAMD_WWWDIR_INDEX, wwwdir); + rspamd_lua_table_set (L, RSPAMD_PLUGINSDIR_INDEX, pluginsdir); + rspamd_lua_table_set (L, RSPAMD_RULESDIR_INDEX, rulesdir); + rspamd_lua_table_set (L, RSPAMD_LUALIBDIR_INDEX, lualibdir); + rspamd_lua_table_set (L, RSPAMD_PREFIX_INDEX, prefix); + + lua_setglobal (L, "rspamd_paths"); + } + + lua_settop (L, orig_top); +} + lua_State * rspamd_lua_init () { diff --git a/src/lua/lua_common.h b/src/lua/lua_common.h index 457f470e9..b4a241412 100644 --- a/src/lua/lua_common.h +++ b/src/lua/lua_common.h @@ -298,6 +298,10 @@ void rspamd_lua_dumpstack (lua_State *L); 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); + struct memory_pool_s * rspamd_lua_check_mempool (lua_State * L, gint pos); struct rspamd_config * lua_check_config (lua_State * L, gint pos); struct rspamd_async_session* lua_check_session (lua_State * L, gint pos); |