From 9f9e615fcd0f12c19c7cce04b0cf716fdc95769d Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 6 Aug 2015 10:01:21 +0100 Subject: [PATCH] Implement universal rspamd_config_add_metric_symbol function. --- src/libserver/cfg_file.h | 16 +++++++ src/libserver/cfg_rcl.c | 54 ++---------------------- src/libserver/cfg_utils.c | 88 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+), 51 deletions(-) diff --git a/src/libserver/cfg_file.h b/src/libserver/cfg_file.h index 258290852..da401834a 100644 --- a/src/libserver/cfg_file.h +++ b/src/libserver/cfg_file.h @@ -406,6 +406,22 @@ gboolean rspamd_init_filters (struct rspamd_config *cfg, bool reconfig); */ void rspamd_init_cfg (struct rspamd_config *cfg, gboolean init_lua); +/** + * Add new symbol to the metric + * @param metric metric's name (or NULL for the default metric) + * @param symbol symbol's name + * @param score symbol's score + * @param description optional description + * @param group optional group name + * @param one_shot TRUE if symbol can add its score once + * @param rewrite_existing TRUE if we need to rewrite the existing symbol + * @return TRUE if symbol has been inserted or FALSE if `rewrite_existing` is not enabled and symbol already exists + */ +gboolean rspamd_config_add_metric_symbol (struct rspamd_config *cfg, + const gchar *metric, + const gchar *symbol, gdouble score, const gchar *description, + const gchar *group, gboolean one_shot, gboolean rewrite_existing); + #endif /* ifdef CFG_FILE_H */ /* * vi:ts=4 diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c index 3e0853bc6..beb74050a 100644 --- a/src/libserver/cfg_rcl.c +++ b/src/libserver/cfg_rcl.c @@ -253,11 +253,8 @@ rspamd_rcl_insert_symbol (struct rspamd_config *cfg, struct metric *metric, const ucl_object_t *obj, const gchar *group, gboolean is_legacy, GError **err) { const gchar *description = NULL, *sym_name; - gdouble symbol_score, *score_ptr; + gdouble symbol_score; const ucl_object_t *val; - struct rspamd_symbols_group *sym_group; - struct rspamd_symbol_def *sym_def; - GList *metric_list; gboolean one_shot = FALSE; /* @@ -323,53 +320,8 @@ rspamd_rcl_insert_symbol (struct rspamd_config *cfg, struct metric *metric, return FALSE; } - sym_def = - rspamd_mempool_alloc (cfg->cfg_pool, sizeof (struct rspamd_symbol_def)); - score_ptr = rspamd_mempool_alloc (cfg->cfg_pool, sizeof (gdouble)); - - *score_ptr = symbol_score; - sym_def->weight_ptr = score_ptr; - sym_def->name = rspamd_mempool_strdup (cfg->cfg_pool, sym_name); - sym_def->description = (gchar *)description; - sym_def->one_shot = one_shot; - - msg_debug ("registered symbol %s with weight %.2f in metric %s and group %s", - sym_def->name, symbol_score, metric->name, group); - - g_hash_table_insert (metric->symbols, sym_def->name, sym_def); - - if ((metric_list = - g_hash_table_lookup (cfg->metrics_symbols, sym_def->name)) == NULL) { - metric_list = g_list_prepend (NULL, metric); - rspamd_mempool_add_destructor (cfg->cfg_pool, - (rspamd_mempool_destruct_t)g_list_free, - metric_list); - g_hash_table_insert (cfg->metrics_symbols, sym_def->name, metric_list); - } - else { - /* Slow but keep start element of list in safe */ - if (!g_list_find (metric_list, metric)) { - metric_list = g_list_append (metric_list, metric); - } - } - - /* Search for symbol group */ - sym_group = g_hash_table_lookup (cfg->symbols_groups, group); - if (sym_group == NULL) { - /* Create new group */ - sym_group = - rspamd_mempool_alloc0 (cfg->cfg_pool, - sizeof (struct rspamd_symbols_group)); - sym_group->name = rspamd_mempool_strdup (cfg->cfg_pool, group); - sym_group->symbols = NULL; - g_hash_table_insert (cfg->symbols_groups, sym_group->name, sym_group); - } - - sym_def->gr = sym_group; - - LL_PREPEND (sym_group->symbols, sym_def); - - return TRUE; + return rspamd_config_add_metric_symbol (cfg, metric->name, sym_name, + symbol_score, description, group, one_shot, TRUE); } static gboolean diff --git a/src/libserver/cfg_utils.c b/src/libserver/cfg_utils.c index 407f6d788..65e6ea9a7 100644 --- a/src/libserver/cfg_utils.c +++ b/src/libserver/cfg_utils.c @@ -924,3 +924,91 @@ rspamd_init_cfg (struct rspamd_config *cfg, gboolean init_lua) (rspamd_mempool_destruct_t)lua_close, cfg->lua_state); } } + +gboolean +rspamd_config_add_metric_symbol (struct rspamd_config *cfg, + const gchar *metric_name, const gchar *symbol, + gdouble score, const gchar *description, const gchar *group, + gboolean one_shot, gboolean rewrite_existing) +{ + struct rspamd_symbols_group *sym_group; + struct rspamd_symbol_def *sym_def; + GList *metric_list; + struct metric *metric; + gdouble *score_ptr; + + g_assert (cfg != NULL); + g_assert (symbol != NULL); + + if (metric_name == NULL) { + metric_name = DEFAULT_METRIC; + } + + metric = g_hash_table_lookup (cfg->metrics, metric_name); + + if (metric == NULL) { + msg_err ("metric %s has not been found", metric_name); + return FALSE; + } + + if (g_hash_table_lookup (cfg->metrics_symbols, symbol) != NULL && + !rewrite_existing) { + msg_debug ("symbol %s has been already registered, do not override"); + return FALSE; + } + + sym_def = + rspamd_mempool_alloc (cfg->cfg_pool, sizeof (struct rspamd_symbol_def)); + score_ptr = rspamd_mempool_alloc (cfg->cfg_pool, sizeof (gdouble)); + + *score_ptr = score; + sym_def->weight_ptr = score_ptr; + sym_def->name = rspamd_mempool_strdup (cfg->cfg_pool, symbol); + sym_def->one_shot = one_shot; + + if (description) { + sym_def->description = rspamd_mempool_strdup (cfg->cfg_pool, description); + } + + msg_debug ("registered symbol %s with weight %.2f in metric %s and group %s", + sym_def->name, score, metric->name, group); + + g_hash_table_insert (metric->symbols, sym_def->name, sym_def); + + if ((metric_list = + g_hash_table_lookup (cfg->metrics_symbols, sym_def->name)) == NULL) { + metric_list = g_list_prepend (NULL, metric); + rspamd_mempool_add_destructor (cfg->cfg_pool, + (rspamd_mempool_destruct_t)g_list_free, + metric_list); + g_hash_table_insert (cfg->metrics_symbols, sym_def->name, metric_list); + } + else { + /* Slow but keep start element of list in safe */ + if (!g_list_find (metric_list, metric)) { + metric_list = g_list_append (metric_list, metric); + } + } + + /* Search for symbol group */ + if (group == NULL) { + group = "ungrouped"; + } + + sym_group = g_hash_table_lookup (cfg->symbols_groups, group); + if (sym_group == NULL) { + /* Create new group */ + sym_group = + rspamd_mempool_alloc0 (cfg->cfg_pool, + sizeof (struct rspamd_symbols_group)); + sym_group->name = rspamd_mempool_strdup (cfg->cfg_pool, group); + sym_group->symbols = NULL; + g_hash_table_insert (cfg->symbols_groups, sym_group->name, sym_group); + } + + sym_def->gr = sym_group; + + LL_PREPEND (sym_group->symbols, sym_def); + + return TRUE; +} -- 2.39.5