@@ -479,8 +479,9 @@ exports.load_sqlite_config = load_sqlite_config | |||
-- A helper method that suggests a user how to configure Redis based | |||
-- classifier based on the existing sqlite classifier | |||
local function redis_classifier_from_sqlite(sqlite_classifier) | |||
local function redis_classifier_from_sqlite(sqlite_classifier, expire) | |||
local result = { | |||
new_schema = true, | |||
backend = 'redis', | |||
cache = { | |||
backend = 'redis' | |||
@@ -495,6 +496,10 @@ local function redis_classifier_from_sqlite(sqlite_classifier) | |||
} | |||
} | |||
if expire then | |||
result.expire = expire | |||
end | |||
return {classifier = {bayes = result}} | |||
end | |||
@@ -215,4 +215,45 @@ end | |||
exports.disable_module = disable_module | |||
local function parse_time_interval(str) | |||
local function parse_time_suffix(s) | |||
if s == 's' then | |||
return 1 | |||
elseif s == 'm' then | |||
return 60 | |||
elseif s == 'h' then | |||
return 3600 | |||
elseif s == 'd' then | |||
return 86400 | |||
elseif s == 'y' then | |||
return 365 * 86400; | |||
end | |||
end | |||
local lpeg = require "lpeg" | |||
local digit = lpeg.R("09") | |||
local parser = {} | |||
parser.integer = | |||
(lpeg.S("+-") ^ -1) * | |||
(digit ^ 1) | |||
parser.fractional = | |||
(lpeg.P(".") ) * | |||
(digit ^ 1) | |||
parser.number = | |||
(parser.integer * | |||
(parser.fractional ^ -1)) + | |||
(lpeg.S("+-") * parser.fractional) | |||
parser.time = lpeg.Cf(lpeg.Cc(1) * | |||
(parser.number / tonumber) * | |||
((lpeg.S("smhdy") / parse_time_suffix) ^ -1), | |||
function (acc, val) return acc * val end) | |||
local t = lpeg.match(parser.time, str) | |||
return t | |||
end | |||
exports.parse_time_interval = parse_time_interval | |||
return exports |
@@ -291,45 +291,6 @@ local function setup_dkim_signing(cfg, changes) | |||
changes.l.dkim_signing = {domain = domains} | |||
end | |||
local function parse_time_interval(str) | |||
local function parse_time_suffix(s) | |||
if s == 's' then | |||
return 1 | |||
elseif s == 'm' then | |||
return 60 | |||
elseif s == 'h' then | |||
return 3600 | |||
elseif s == 'd' then | |||
return 86400 | |||
elseif s == 'y' then | |||
return 365 * 86400; | |||
end | |||
end | |||
local lpeg = require "lpeg" | |||
local digit = lpeg.R("09") | |||
local parser = {} | |||
parser.integer = | |||
(lpeg.S("+-") ^ -1) * | |||
(digit ^ 1) | |||
parser.fractional = | |||
(lpeg.P(".") ) * | |||
(digit ^ 1) | |||
parser.number = | |||
(parser.integer * | |||
(parser.fractional ^ -1)) + | |||
(lpeg.S("+-") * parser.fractional) | |||
parser.time = lpeg.Cf(lpeg.Cc(1) * | |||
(parser.number / tonumber) * | |||
((lpeg.S("smhdy") / parse_time_suffix) ^ -1), | |||
function (acc, val) return acc * val end) | |||
local t = lpeg.match(parser.time, str) | |||
return t | |||
end | |||
local function check_redis_classifier(cls, changes) | |||
local symbol_spam, symbol_ham | |||
-- Load symbols from statfiles | |||
@@ -373,7 +334,7 @@ local function check_redis_classifier(cls, changes) | |||
if ask_yes_no("Do you wish to convert data to the new schema?", true) then | |||
local expire = readline_default("Expire time for new tokens [default: 100d]: ", | |||
'100d') | |||
expire = parse_time_interval(expire) | |||
expire = lua_util.parse_time_interval(expire) | |||
if not lua_stat_tools.convert_bayes_schema(parsed_redis, symbol_spam, symbol_ham) then | |||
printf("Conversion failed") | |||
@@ -432,7 +393,7 @@ local function setup_statistic(cfg, changes) | |||
printf('You have %d sqlite classifiers', #sqlite_configs) | |||
local expire = readline_default("Expire time for new tokens [default: 100d]: ", | |||
'100d') | |||
expire = parse_time_interval(expire) | |||
expire = lua_util.parse_time_interval(expire) | |||
local reset_previous = ask_yes_no("Reset previuous data?") | |||
if ask_yes_no('Do you wish to convert them to Redis?', true) then |
@@ -2,10 +2,13 @@ local lua_redis = require "lua_redis" | |||
local stat_tools = require "lua_stat" | |||
local ucl = require "ucl" | |||
local logger = require "rspamd_logger" | |||
local lua_util = require "lua_util" | |||
return function (_, res) | |||
local redis_params = {} | |||
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 | |||
logger.errx('cannot load redis server definition') | |||
@@ -29,7 +32,7 @@ return function (_, res) | |||
end | |||
logger.messagex('Converted classifier to the from sqlite to redis') | |||
logger.messagex('Suggested configuration:') | |||
logger.messagex(ucl.to_format(stat_tools.redis_classifier_from_sqlite(cls), | |||
logger.messagex(ucl.to_format(stat_tools.redis_classifier_from_sqlite(cls, res.expire), | |||
'config')) | |||
end | |||
end |