aboutsummaryrefslogtreecommitdiffstats
path: root/src/lua/lua_map.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2018-04-26 14:51:50 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2018-04-26 14:51:50 +0100
commit6338432f8b061e866c3782b45c03dccfe4681669 (patch)
tree0c9d6bc20a151e6ee393fa142634ee71b2956b97 /src/lua/lua_map.c
parent0329cde5bda00eaf4ede9ebc9948937766ac002d (diff)
downloadrspamd-6338432f8b061e866c3782b45c03dccfe4681669.tar.gz
rspamd-6338432f8b061e866c3782b45c03dccfe4681669.zip
[Minor] Add method to get all maps configured
Diffstat (limited to 'src/lua/lua_map.c')
-rw-r--r--src/lua/lua_map.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/lua/lua_map.c b/src/lua/lua_map.c
index 27e79ac2b..7f5195d8e 100644
--- a/src/lua/lua_map.c
+++ b/src/lua/lua_map.c
@@ -85,6 +85,15 @@ LUA_FUNCTION_DEF (map, set_callback);
*/
LUA_FUNCTION_DEF (map, get_uri);
+/***
+ * @method map:get_stats(reset)
+ * Get statistics for specific map. It returns table in form:
+ * [key] => [nhits]
+ * @param {boolean} reset reset stats if true
+ * @return {table} map's stat
+ */
+LUA_FUNCTION_DEF (map, get_stats);
+
static const struct luaL_reg maplib_m[] = {
LUA_INTERFACE_DEF (map, get_key),
LUA_INTERFACE_DEF (map, is_signed),
@@ -93,6 +102,7 @@ static const struct luaL_reg maplib_m[] = {
LUA_INTERFACE_DEF (map, set_sign_key),
LUA_INTERFACE_DEF (map, set_callback),
LUA_INTERFACE_DEF (map, get_uri),
+ LUA_INTERFACE_DEF (map, get_stats),
{"__tostring", rspamd_lua_class_tostring},
{NULL, NULL}
};
@@ -596,6 +606,61 @@ lua_config_add_map (lua_State *L)
return 1;
}
+gint
+lua_config_get_maps (lua_State*L)
+{
+ struct rspamd_config *cfg = lua_check_config (L, 1);
+ struct rspamd_lua_map *map, **pmap;
+ struct rspamd_map *m;
+ gint i = 1;
+ GList *cur;
+
+ if (cfg) {
+ lua_newtable (L);
+ cur = g_list_first (cfg->maps);
+
+ while (cur) {
+ m = cur->data;
+
+ if (m->lua_map) {
+ map = m->lua_map;
+ }
+ else {
+ /* Implement heuristic */
+ map = rspamd_mempool_alloc0 (cfg->cfg_pool, sizeof (*map));
+
+ if (m->read_callback == rspamd_radix_read) {
+ map->type = RSPAMD_LUA_MAP_RADIX;
+ map->data.radix = *m->user_data;
+ }
+ else if (m->read_callback == rspamd_kv_list_read) {
+ map->type = RSPAMD_LUA_MAP_HASH;
+ map->data.hash = *m->user_data;
+ }
+ else {
+ map->type = RSPAMD_LUA_MAP_UNKNOWN;
+ }
+
+ map->map = m;
+ m->lua_map = map;
+ }
+
+ pmap = lua_newuserdata (L, sizeof (*pmap));
+ *pmap = map;
+ rspamd_lua_setclass (L, "rspamd{map}", -1);
+ lua_rawseti (L, -2, i);
+
+ cur = g_list_next (cur);
+ i ++;
+ }
+ }
+ else {
+ return luaL_error (L, "invalid arguments");
+ }
+
+ return 1;
+}
+
static const gchar *
lua_map_process_string_key (lua_State *L, gint pos, gsize *len)
{