aboutsummaryrefslogtreecommitdiffstats
path: root/src/lua
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2018-05-26 19:31:29 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2018-05-26 19:31:29 +0100
commit4734176fe1719865d3222aebd6bf3c294349226e (patch)
treeb36f9246764092a0e24dfe71df7b6b5546515536 /src/lua
parent582e212af4385fdaeb2e209fde6cb5a795a29a3a (diff)
downloadrspamd-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.c320
-rw-r--r--src/lua/lua_common.h4
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);