From 261d4e4a379119d40d6cc891548c99b4b517c6d5 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 22 Sep 2016 17:35:46 +0100 Subject: [PATCH] [Feature] Allow to store settings in redis --- src/plugins/lua/settings.lua | 85 ++++++++++++++++++++++++++++++++++-- 1 file changed, 81 insertions(+), 4 deletions(-) diff --git a/src/plugins/lua/settings.lua b/src/plugins/lua/settings.lua index b25698f27..c9c7eeeba 100644 --- a/src/plugins/lua/settings.lua +++ b/src/plugins/lua/settings.lua @@ -19,10 +19,8 @@ limitations under the License. -- https://rspamd.com/doc/configuration/settings.html local rspamd_logger = require "rspamd_logger" -local set_section = rspamd_config:get_all_opt("settings") -if not (set_section and type(set_section) == 'table') then - rspamd_logger.infox(rspamd_config, 'Module is unconfigured') -end +local rspamd_redis = require 'rspamd_redis' +local redis_params local settings = { [1] = {}, @@ -523,6 +521,85 @@ local function process_settings_map(string) return res end +local function gen_redis_callback(handler, id) + return function(task) + local key = handler(task) + + local function redis_settings_cb(task, err, data) + if not err and type(data) == 'string' then + local ucl = require "ucl" + local parser = ucl.parser() + local res,err = parser:parse_string(data) + if not res then + rspamd_logger.warnx(rspamd_config, 'cannot parse settings from redis: %s', + err) + else + local obj = parser:get_object() + rspamd_logger.infox(task, "<%1> apply settings according to redis rule %2", + task:get_message_id(), id) + task:set_settings(obj) + end + end + end + + if not key then + rspamd_logger.errx(rspamd_config, 'Cannot execute handler number %s', id) + return + end + + local ret,_,_ = rspamd_redis_make_request(task, + redis_params, -- connect params + key, -- hash key + false, -- is write + redis_settings_cb, --callback + 'GET', -- command + {key} -- arguments + ) + end +end + +local redis_section = rspamd_config:get_all_opt("settings_redis") +local redis_key_handlers = {} + +if redis_section then + redis_params = rspamd_parse_redis_server('replies') + if redis_params then + local handlers = redis_section.handlers + + for _,h in ipairs(handlers) do + local chunk,err = loadstring(h) + + if not chunk then + rspamd_logger.errx(rspamd_config, 'Cannot load handler from string: %s', + tostring(err)) + else + local res,func = pcall(chunk) + if not res then + rspamd_logger.errx(rspamd_config, 'Cannot add handler from string: %s', + tostring(func)) + else + table.insert(redis_key_handlers, func) + end + end + end + end + + each(function(id, h) + rspamd_config:register_symbol({ + name = 'REDIS_SETTINGS' .. tostring(id), + type = 'prefilter', + callback = gen_redis_callback(h, id), + priority = 10 + }) + end, redis_key_handlers) +end + +local set_section = rspamd_config:get_all_opt("settings") +if not redis_params and not (set_section and type(set_section) == 'table') then + rspamd_logger.infox(rspamd_config, 'Module is unconfigured') + return +end + if set_section and set_section[1] and type(set_section[1]) == "string" then -- Just a map of ucl if not rspamd_config:add_map(set_section[1], "settings map", process_settings_map) then -- 2.39.5