diff options
author | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2009-03-27 19:39:01 +0300 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2009-03-27 19:39:01 +0300 |
commit | 182b158dc85acb9a3de38bc11eb09feff991cf11 (patch) | |
tree | 952b9cd5c82dfed079bc5b06e0fe170fb6b94a04 /src | |
parent | 89a83f2ef6c2358fe45faac5b15da6344fa7728c (diff) | |
download | rspamd-182b158dc85acb9a3de38bc11eb09feff991cf11.tar.gz rspamd-182b158dc85acb9a3de38bc11eb09feff991cf11.zip |
* Fix variables substitution
* Add simple lua interface to access task structures
* Improve error reporting for regexp module
Diffstat (limited to 'src')
-rw-r--r-- | src/cfg_file.h | 3 | ||||
-rw-r--r-- | src/cfg_utils.c | 18 | ||||
-rw-r--r-- | src/lua.c | 75 | ||||
-rw-r--r-- | src/plugins/regexp.c | 8 |
4 files changed, 91 insertions, 13 deletions
diff --git a/src/cfg_file.h b/src/cfg_file.h index fbf7309d3..b1cbd6125 100644 --- a/src/cfg_file.h +++ b/src/cfg_file.h @@ -285,11 +285,12 @@ char parse_flag (const char *str); /** * Substitutes variable in specified string, may be recursive (eg. ${var1${var2}}) * @param cfg config file + * @param name variable's name * @param str incoming string * @param recursive whether do recursive scanning * @return new string with substituted variables (uses cfg memory pool for allocating) */ -char* substitute_variable (struct config_file *cfg, char *str, u_char recursive); +char* substitute_variable (struct config_file *cfg, char *name, char *str, u_char recursive); /** * Do post load actions for config diff --git a/src/cfg_utils.c b/src/cfg_utils.c index b7c540ec4..fa2bcc918 100644 --- a/src/cfg_utils.c +++ b/src/cfg_utils.c @@ -352,10 +352,11 @@ parse_flag (const char *str) * Return: newly allocated string with substituted variables (original string may be freed if variables are found) */ char * -substitute_variable (struct config_file *cfg, char *str, u_char recursive) +substitute_variable (struct config_file *cfg, char *name, char *str, u_char recursive) { char *var, *new, *v_begin, *v_end; size_t len; + gboolean changed = FALSE; if (str == NULL) { yywarn ("substitute_variable: trying to substitute variable in NULL string"); @@ -378,7 +379,7 @@ substitute_variable (struct config_file *cfg, char *str, u_char recursive) var = ""; } else if (recursive) { - var = substitute_variable (cfg, var, recursive); + new = substitute_variable (cfg, v_begin, var, recursive); } /* Allocate new string */ new = memory_pool_alloc (cfg->cfg_pool, len - strlen (v_begin) + strlen (var) + 1); @@ -386,8 +387,12 @@ substitute_variable (struct config_file *cfg, char *str, u_char recursive) snprintf (new, len - strlen (v_begin) + strlen (var) + 1, "%s%s%s", str, var, v_end + 1); str = new; + changed = TRUE; + } + + if (changed && name != NULL) { + g_hash_table_insert (cfg->variables, name, str); } - return str; } @@ -400,7 +405,7 @@ substitute_module_variables (gpointer key, gpointer value, gpointer data) LIST_FOREACH_SAFE (cur, cur_module_opt, next, tmp) { if (cur->value) { - cur->value = substitute_variable (cfg, cur->value, 0); + cur->value = substitute_variable (cfg, NULL, cur->value, 1); } } } @@ -412,10 +417,7 @@ substitute_all_variables (gpointer key, gpointer value, gpointer data) char *new; /* Do recursive substitution */ - new = substitute_variable (cfg, (char *)value, 1); - if (new != value) { - g_hash_table_replace (cfg->variables, key, new); - } + new = substitute_variable (cfg, (char *)key, (char *)value, 1); } static void @@ -33,6 +33,80 @@ lua_State *L = NULL; +static int lua_task_get_message (lua_State *L); +static int lua_task_insert_result (lua_State *L); +static int lua_task_get_urls (lua_State *L); + +/* Task methods */ +static const struct luaL_reg tasklib_m[] = { + {"get_message", lua_task_get_message}, + {"insert_result", lua_task_insert_result}, + {"get_urls", lua_task_get_urls}, + {NULL, NULL}, +}; + +static struct worker_task * +lua_check_task (lua_State *L) +{ + void *ud = luaL_checkudata (L, 1, "Rspamd.task"); + luaL_argcheck (L, ud != NULL, 1, "'task' expected"); + return (struct worker_task *)ud; +} + +static int +lua_task_get_message (lua_State *L) +{ + struct worker_task *task = lua_check_task (L); + if (task != NULL) { + /* XXX write handler for message object */ + } + return 1; +} + +static int +lua_task_insert_result (lua_State *L) +{ + struct worker_task *task = lua_check_task (L); + const char *metric_name, *symbol_name; + double flag; + + if (task != NULL) { + metric_name = luaL_checkstring (L, 2); + symbol_name = luaL_checkstring (L, 3); + flag = luaL_checknumber (L, 4); + insert_result (task, metric_name, symbol_name, flag, NULL); + } + return 1; +} + +static int +lua_task_get_urls (lua_State *L) +{ + struct worker_task *task = lua_check_task (L); + struct uri *url; + + if (task != NULL) { + TAILQ_FOREACH (url, &task->urls, next) { + lua_pushstring (L, struri (url)); + } + } + return 1; +} + +static int +luaopen_task (lua_State *L) +{ + luaL_newmetatable(L, "Rspamd.task"); + + lua_pushstring(L, "__index"); + lua_pushvalue(L, -2); /* pushes the metatable */ + lua_settable(L, -3); /* metatable.__index = metatable */ + + luaL_openlib(L, NULL, tasklib_m, 0); + + return 1; +} + void init_lua_filters (struct config_file *cfg) { @@ -59,6 +133,7 @@ init_lua_filters (struct config_file *cfg) } } } + luaopen_task (L); } diff --git a/src/plugins/regexp.c b/src/plugins/regexp.c index e9c4ca7bf..15edb7d70 100644 --- a/src/plugins/regexp.c +++ b/src/plugins/regexp.c @@ -76,13 +76,13 @@ regexp_module_init (struct config_file *cfg, struct module_ctx **ctx) } static gboolean -read_regexp_expression (memory_pool_t *pool, struct regexp_module_item *chain, char *line) +read_regexp_expression (memory_pool_t *pool, struct regexp_module_item *chain, char *symbol, char *line) { struct expression *e, *cur; e = parse_expression (regexp_module_ctx->regexp_pool, line); if (e == NULL) { - msg_warn ("read_regexp_expression: %s is invalid regexp expression", line); + msg_warn ("read_regexp_expression: %s = \"%s\" is invalid regexp expression", symbol, line); return FALSE; } chain->expr = e; @@ -91,7 +91,7 @@ read_regexp_expression (memory_pool_t *pool, struct regexp_module_item *chain, c if (cur->type == EXPR_REGEXP) { cur->content.operand = parse_regexp (pool, cur->content.operand); if (cur->content.operand == NULL) { - msg_warn ("read_regexp_expression: cannot parse regexp, skip expression %s", line); + msg_warn ("read_regexp_expression: cannot parse regexp, skip expression %s = \"%s\"", symbol, line); return FALSE; } chain->regexp_number ++; @@ -130,7 +130,7 @@ regexp_module_config (struct config_file *cfg) } cur_item = memory_pool_alloc0 (regexp_module_ctx->regexp_pool, sizeof (struct regexp_module_item)); cur_item->symbol = cur->param; - if (!read_regexp_expression (regexp_module_ctx->regexp_pool, cur_item, cur->value)) { + if (!read_regexp_expression (regexp_module_ctx->regexp_pool, cur_item, cur->param, cur->value)) { res = FALSE; } regexp_module_ctx->items = g_list_prepend (regexp_module_ctx->items, cur_item); |