if last_collection > 0 and settings.limits.max_interval > 0 then
if now - last_collection > settings.limits.max_interval then
need_collect = true
- reason = string.format('limit of time since last collection has been reached: %.0f seconds passed ' ..
- '(%.0f seconds trigger)',
- (now - last_collection), settings.limits.max_interval)
+ reason = string.format('limit of time since last collection has been reached: %d seconds passed ' ..
+ '(%d seconds trigger)',
+ math.floor(now - last_collection), math.floor(settings.limits.max_interval))
end
end
rspamd_logger.errx(rspamd_config, 'custom rule has no required attributes: schema, first_row and get_row')
end
end
+ elseif k == 'limits' or k == 'retention' then
+ for sk, sv in pairs(v) do
+ settings[k][sk] = sv
+ end
else
settings[k] = lua_util.deepcopy(v)
end
local opts = rspamd_config:get_all_opt('elastic')
+-- Merge nested tables to preserve defaults when user provides partial config
+local function merge_settings(src, dst)
+ for k, v in pairs(src) do
+ if type(v) == 'table' and type(dst[k]) == 'table' then
+ merge_settings(v, dst[k])
+ else
+ dst[k] = v
+ end
+ end
+end
+
if opts then
for k, v in pairs(opts) do
- settings[k] = v
+ if type(v) == 'table' and settings[k] and type(settings[k]) == 'table' then
+ merge_settings(v, settings[k])
+ else
+ settings[k] = v
+ end
end
if not settings['enabled'] then