]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Another fix for Redis sentinel
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 1 Apr 2019 13:22:17 +0000 (14:22 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 1 Apr 2019 13:22:17 +0000 (14:22 +0100)
Issue: #2796

lualib/lua_redis.lua
lualib/rspamadm/configwizard.lua
lualib/rspamadm/stat_convert.lua
src/libserver/cfg_rcl.c
src/lua/lua_common.c
src/plugins/lua/bayes_expiry.lua
src/plugins/lua/reputation.lua

index 4e30850d534bb242f109ef43201d25d850d248f5..a93545f230980cbc370ca4d920c47d3ec8273c53 100644 (file)
@@ -313,8 +313,10 @@ local function enrich_defaults(rspamd_config, module, redis_params)
   local opts = rspamd_config:get_all_opt('redis')
 
   if opts then
-    if opts[module] then
-      process_redis_opts(opts[module], redis_params)
+    if module then
+      if opts[module] then
+        process_redis_opts(opts[module], redis_params)
+      end
     end
 
     process_redis_opts(opts, redis_params)
@@ -344,7 +346,7 @@ end
 -- @module lua_redis
 -- This module contains helper functions for working with Redis
 --]]
-local function try_load_redis_servers(options, rspamd_config, result)
+local function process_redis_options(options, rspamd_config, result)
   local default_port = 6379
   local upstream_list = require "rspamd_upstream_list"
   local read_only = true
@@ -427,7 +429,22 @@ local function try_load_redis_servers(options, rspamd_config, result)
   return false
 end
 
-exports.try_load_redis_servers = try_load_redis_servers
+--[[[
+@function try_load_redis_servers(options, rspamd_config, no_fallback)
+Tries to load redis servers from the specified `options` object.
+Returns `redis_params` table or nil in case of failure
+
+--]]
+exports.try_load_redis_servers = function(options, rspamd_config, no_fallback, module_name)
+  local result = {}
+
+  if process_redis_options(options, rspamd_config, result) then
+    if not no_fallback then
+      enrich_defaults(rspamd_config, module_name, result)
+    end
+    return maybe_return_cached(result)
+  end
+end
 
 -- This function parses redis server definition using either
 -- specific server string for this module or global
@@ -448,7 +465,7 @@ local function rspamd_parse_redis_server(module_name, module_opts, no_fallback)
     local ret
 
     if opts.redis then
-      ret = try_load_redis_servers(opts.redis, rspamd_config, result)
+      ret = process_redis_options(opts.redis, rspamd_config, result)
 
       if ret then
         if not no_fallback then
@@ -458,7 +475,7 @@ local function rspamd_parse_redis_server(module_name, module_opts, no_fallback)
       end
     end
 
-    ret = try_load_redis_servers(opts, rspamd_config, result)
+    ret = process_redis_options(opts, rspamd_config, result)
 
     if ret then
       if not no_fallback then
@@ -482,13 +499,13 @@ local function rspamd_parse_redis_server(module_name, module_opts, no_fallback)
     local ret
 
     if opts[module_name] then
-      ret = try_load_redis_servers(opts[module_name], rspamd_config, result)
+      ret = process_redis_options(opts[module_name], rspamd_config, result)
 
       if ret then
         return maybe_return_cached(result)
       end
     else
-      ret = try_load_redis_servers(opts, rspamd_config, result)
+      ret = process_redis_options(opts, rspamd_config, result)
 
       -- Exclude disabled
       if opts['disabled_modules'] then
index 3a6ff3116782abf280253984d495c9c894d839d5..6de3e9c26751f8c6beb114b0e876d4534844f46b 100644 (file)
@@ -449,9 +449,11 @@ local function check_redis_classifier(cls, changes)
     return
   end
 
-  local parsed_redis = {}
-  if not lua_redis.try_load_redis_servers(cls, nil, parsed_redis) then
-    if not lua_redis.try_load_redis_servers(redis_params, nil, parsed_redis) then
+  local parsed_redis = lua_redis.try_load_redis_servers(cls, nil)
+
+  if not parsed_redis then
+    parsed_redis = lua_redis.try_load_redis_servers(redis_params, nil)
+    if not parsed_redis then
       printf("Cannot parse Redis params")
       return
     end
@@ -583,8 +585,8 @@ local function setup_statistic(cfg, changes)
       return false
     end
 
-    local parsed_redis = {}
-    if lua_redis.try_load_redis_servers(redis_params, nil, parsed_redis) then
+    local parsed_redis = lua_redis.try_load_redis_servers(redis_params, nil)
+    if parsed_redis then
       printf('You have %d sqlite classifiers', #sqlite_configs)
       local expire = readline_expire()
 
index 230dc3f3f211c14f74be815aed24f2f4b8a2f0d7..3b54826aaa9fac1852b061b48b77f5bed648dc90 100644 (file)
@@ -5,11 +5,11 @@ local logger = require "rspamd_logger"
 local lua_util = require "lua_util"
 
 return function (_, res)
-  local redis_params = {}
+  local redis_params = lua_redis.try_load_redis_servers(res.redis, nil)
   if res.expire then
     res.expire = lua_util.parse_time_interval(res.expire)
   end
-  if not lua_redis.try_load_redis_servers(res.redis, nil, redis_params) then
+  if not redis_params then
     logger.errx('cannot load redis server definition')
 
     return false
index 5c99aed59fe3ce8ec2837d5fb6da44782f3d1881..ed99ef8b6de5a6e547afa07fc0032c06eaf0e86c 100644 (file)
@@ -3554,7 +3554,7 @@ rspamd_rcl_jinja_handler (struct ucl_parser *parser,
                GString *tb;
 
                tb = lua_touserdata (L, -1);
-               msg_err_config ("cannot call lua try_load_redis_servers script: %s", tb->str);
+               msg_err_config ("cannot call lua jinja_template script: %s", tb->str);
                g_string_free (tb, TRUE);
                lua_settop (L, err_idx - 1);
 
index 5f1be424dd9faaff85a9951b94946466cca6ddd6..81fac36403055b04f0c5a0159547f54bd216ffb5 100644 (file)
@@ -2500,12 +2500,9 @@ gboolean
 rspamd_lua_try_load_redis (lua_State *L, const ucl_object_t *obj,
                                                                        struct rspamd_config *cfg, gint *ref_id)
 {
-       gint res_pos, err_idx;
+       gint err_idx;
        struct rspamd_config **pcfg;
 
-       /* Create results table */
-       lua_createtable (L, 0, 0);
-       res_pos = lua_gettop (L);
        lua_pushcfunction (L, &rspamd_lua_traceback);
        err_idx = lua_gettop (L);
 
@@ -2522,7 +2519,7 @@ rspamd_lua_try_load_redis (lua_State *L, const ucl_object_t *obj,
        pcfg = lua_newuserdata (L, sizeof (*pcfg));
        rspamd_lua_setclass (L, "rspamd{config}", -1);
        *pcfg = cfg;
-       lua_pushvalue (L, res_pos);
+       lua_pushboolean (L, false); /* no_fallback */
 
        if (lua_pcall (L, 3, 1, err_idx) != 0) {
                GString *tb;
@@ -2535,16 +2532,17 @@ rspamd_lua_try_load_redis (lua_State *L, const ucl_object_t *obj,
                return FALSE;
        }
 
-       if (lua_toboolean (L, -1)) {
+       if (lua_istable (L, -1)) {
                if (ref_id) {
                        /* Ref table */
-                       lua_pushvalue (L, res_pos);
+                       lua_pushvalue (L, -1);
                        *ref_id = luaL_ref (L, LUA_REGISTRYINDEX);
                        lua_settop (L, 0);
                }
                else {
                        /* Leave it on the stack */
-                       lua_settop (L, res_pos);
+                       lua_insert (L, err_idx);
+                       lua_settop (L, err_idx);
                }
 
                return TRUE;
index 9f5d7a68f901e4dafc53aabf4f06fc8f1129d8ae..6e2c328dc7b113ce1a5e993fad99e9ed01bcde83 100644 (file)
@@ -97,10 +97,13 @@ local function check_redis_classifier(cls, cfg)
     end
     -- Now try to load redis_params if needed
 
-    local redis_params = {}
-    if not lredis.try_load_redis_servers(cls, rspamd_config, redis_params) then
-      if not lredis.try_load_redis_servers(cfg[N] or E, rspamd_config, redis_params) then
-        if not lredis.try_load_redis_servers(cfg['redis'] or E, rspamd_config, redis_params) then
+    local redis_params
+    redis_params = lredis.try_load_redis_servers(cls, rspamd_config, false, 'bayes')
+    if not redis_params then
+      redis_params = lredis.try_load_redis_servers(cfg[N] or E, rspamd_config, false, 'bayes')
+      if not redis_params then
+        redis_params = lredis.try_load_redis_servers(cfg[N] or E, rspamd_config, true)
+        if not redis_params then
           return false
         end
       end
index e91c6ebb77e9cbdf97b17de4c93c1fd5649ceeef..b72c007191df8ac637b82e061a25849d361da1e0 100644 (file)
@@ -897,8 +897,9 @@ end
 local function reputation_redis_init(rule, cfg, ev_base, worker)
   local our_redis_params = {}
 
-  if not lua_redis.try_load_redis_servers(rule.backend.config,
-      rspamd_config, our_redis_params) then
+  our_redis_params = lua_redis.try_load_redis_servers(rule.backend.config, rspamd_config,
+      true)
+  if not our_redis_params then
     our_redis_params = redis_params
   end
   if not our_redis_params then