]> source.dussan.org Git - rspamd.git/commitdiff
Implement universal rspamd_config_add_metric_symbol function.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 6 Aug 2015 09:01:21 +0000 (10:01 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 6 Aug 2015 09:01:21 +0000 (10:01 +0100)
src/libserver/cfg_file.h
src/libserver/cfg_rcl.c
src/libserver/cfg_utils.c

index 258290852b9bcbe630b9a9eac3407f9e2f8df76f..da401834a1cc2ce9a6bd19d6d78506bebe326386 100644 (file)
@@ -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
index 3e0853bc6e62ac6299770a1c95cb171301653d3a..beb74050a2e292d8e7a6f56c6a8cc589970962cf 100644 (file)
@@ -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
index 407f6d78866bf69497685384fcfc8b2b6519fea9..65e6ea9a7ae480a8b8c970175f020ce98d7b370b 100644 (file)
@@ -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;
+}