-- 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] = {},
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