]> source.dussan.org Git - rspamd.git/commitdiff
More fixes for the new symbols structure.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 13 Aug 2015 14:28:07 +0000 (15:28 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 13 Aug 2015 14:28:07 +0000 (15:28 +0100)
src/controller.c
src/libserver/cfg_file.h
src/libserver/cfg_rcl.c
src/libserver/cfg_utils.c
src/libserver/composites.c
src/libserver/protocol.c
src/libserver/symbols_cache.c
src/libutil/util.c
src/lua/lua_cfg_file.c
src/main.h

index c2dda4863eac61669ab9f2efbd2e0e72f8aaf4ae..2c9cfae3eee783e6283eb4be0b8837500098cb47 100644 (file)
@@ -503,9 +503,10 @@ rspamd_controller_handle_symbols (struct rspamd_http_connection_entry *conn_ent,
        struct rspamd_http_message *msg)
 {
        struct rspamd_controller_session *session = conn_ent->ud;
-       GHashTableIter it;
+       GHashTableIter it, sit;
        struct rspamd_symbols_group *gr;
-       struct rspamd_symbol_def *sym, *cur;
+       struct rspamd_symbol_def *sym;
+       struct metric *metric;
        ucl_object_t *obj, *top, *sym_obj, *group_symbols;
        gpointer k, v;
 
@@ -515,29 +516,33 @@ rspamd_controller_handle_symbols (struct rspamd_http_connection_entry *conn_ent,
 
        top = ucl_object_typed_new (UCL_ARRAY);
 
-       /* Go through all symbols groups */
-       g_hash_table_iter_init (&it, session->ctx->cfg->symbols_groups);
+       /* Go through all symbols groups in the default metric */
+       metric = g_hash_table_lookup (session->ctx->cfg->metrics, DEFAULT_METRIC);
+       g_assert (metric != NULL);
+       g_hash_table_iter_init (&it, metric->groups);
+
        while (g_hash_table_iter_next (&it, &k, &v)) {
                gr = v;
                obj = ucl_object_typed_new (UCL_OBJECT);
                ucl_object_insert_key (obj, ucl_object_fromstring (
                                gr->name), "group", 0, false);
                /* Iterate through all symbols */
-               sym = gr->symbols;
 
+               g_hash_table_iter_init (&sit, gr->symbols);
                group_symbols = ucl_object_typed_new (UCL_ARRAY);
 
-               LL_FOREACH (sym, cur) {
+               while (g_hash_table_iter_next (&sit, &k, &v)) {
+                       sym = v;
                        sym_obj = ucl_object_typed_new (UCL_OBJECT);
 
-                       ucl_object_insert_key (sym_obj, ucl_object_fromstring (cur->name),
+                       ucl_object_insert_key (sym_obj, ucl_object_fromstring (sym->name),
                                "symbol", 0, false);
                        ucl_object_insert_key (sym_obj,
-                               ucl_object_fromdouble (*cur->weight_ptr),
+                               ucl_object_fromdouble (*sym->weight_ptr),
                                "weight", 0, false);
-                       if (cur->description) {
+                       if (sym->description) {
                                ucl_object_insert_key (sym_obj,
-                                       ucl_object_fromstring (cur->description),
+                                       ucl_object_fromstring (sym->description),
                                        "description", 0, false);
                        }
 
index 431f82ab1a129fb1b258c8b4617b2dbad5bb38ae..49d48033e653873ceb7f82e755c8b43a36213c14 100644 (file)
@@ -17,6 +17,9 @@
 #define DEFAULT_BIND_PORT 11333
 #define DEFAULT_CONTROL_PORT 11334
 
+/* Default metric name */
+#define DEFAULT_METRIC "default"
+
 struct expression;
 struct tokenizer;
 struct rspamd_stat_classifier;
@@ -360,6 +363,13 @@ struct rspamd_worker_conf * rspamd_config_new_worker (struct rspamd_config *cfg,
  */
 struct metric * rspamd_config_new_metric (struct rspamd_config *cfg,
        struct metric *c, const gchar *name);
+
+/*
+ * Return new symbols group definition
+ */
+struct rspamd_symbols_group * rspamd_config_new_group (
+               struct rspamd_config *cfg, struct metric *metric,
+               const gchar *name);
 /*
  * Return a new statfile structure, setting default and non-conflicting attributes
  */
index 1eaaa270b110b591f50ead9e5ce0f14ae19bb157..def4ac4b3dcb9521869b29ecbbeb96dbd8832ce8 100644 (file)
@@ -273,17 +273,9 @@ rspamd_rcl_group_handler (rspamd_mempool_t *pool, const ucl_object_t *obj,
        gr = g_hash_table_lookup (metric->groups, key);
 
        if (gr == NULL) {
-               gr = rspamd_mempool_alloc0 (pool, sizeof (*gr));
-               gr->symbols = g_hash_table_new (rspamd_strcase_hash,
-                               rspamd_strcase_equal);
-               rspamd_mempool_add_destructor (pool,
-                               (rspamd_mempool_destruct_t)g_hash_table_unref, gr->symbols);
-               gr->name = rspamd_mempool_strdup (pool, key);
-
-               g_hash_table_insert (metric->groups, gr->name);
+               gr = rspamd_config_new_group (sd->cfg, metric, key);
        }
 
-
        if (!rspamd_rcl_section_parse_defaults (section, pool, obj,
                        metric, err)) {
                return FALSE;
@@ -360,7 +352,9 @@ rspamd_rcl_symbol_handler (rspamd_mempool_t *pool, const ucl_object_t *obj,
                return FALSE;
        }
 
-       *sym_def->weight_ptr = sym_def->score;
+       if (ucl_object_find_key (obj, "score") != NULL) {
+               *sym_def->weight_ptr = sym_def->score;
+       }
 
        return TRUE;
 }
@@ -402,30 +396,17 @@ rspamd_rcl_metric_handler (rspamd_mempool_t *pool, const ucl_object_t *obj,
                const gchar *key, gpointer ud,
                struct rspamd_rcl_section *section, GError **err)
 {
-       const ucl_object_t *val, *cur, *elt;
+       const ucl_object_t *val, *cur;
        struct rspamd_config *cfg = ud;
-       const gchar *metric_name, *subject_name, *semicolon, *act_str;
        struct metric *metric;
-       struct rspamd_symbols_group *gr;
-
-       gboolean new = TRUE, have_actions = FALSE, have_symbols = FALSE,
-                       have_unknown = FALSE;
-       gdouble unknown_weight;
-       ucl_object_iter_t it = NULL;
        struct rspamd_rcl_section *subsection;
        struct rspamd_rcl_symbol_data sd;
 
        g_assert (key != NULL);
 
-       metric_name = key;
-
-       metric = g_hash_table_lookup (cfg->metrics, metric_name);
+       metric = g_hash_table_lookup (cfg->metrics, key);
        if (metric == NULL) {
-               metric = rspamd_config_new_metric (cfg, metric, metric_name);
-       }
-       else {
-               new = FALSE;
-               have_symbols = TRUE;
+               metric = rspamd_config_new_metric (cfg, metric, key);
        }
 
        if (!rspamd_rcl_section_parse_defaults (section, cfg->cfg_pool, obj,
index fcf5b4fd99d7b58d07127ac3fb236885dd1a9c79..5d8e261b9cb5a3b471cd0c058b0c80df5e8d0dd2 100644 (file)
@@ -574,6 +574,24 @@ rspamd_config_new_metric (struct rspamd_config *cfg, struct metric *c,
        return c;
 }
 
+struct rspamd_symbols_group *
+rspamd_config_new_group (struct rspamd_config *cfg, struct metric *metric,
+               const gchar *name)
+{
+       struct rspamd_symbols_group *gr;
+
+       gr = rspamd_mempool_alloc0 (cfg->cfg_pool, sizeof (*gr));
+       gr->symbols = g_hash_table_new (rspamd_strcase_hash,
+                       rspamd_strcase_equal);
+       rspamd_mempool_add_destructor (cfg->cfg_pool,
+                       (rspamd_mempool_destruct_t)g_hash_table_unref, gr->symbols);
+       gr->name = rspamd_mempool_strdup (cfg->cfg_pool, name);
+
+       g_hash_table_insert (metric->groups, gr->name, gr);
+
+       return gr;
+}
+
 struct rspamd_worker_conf *
 rspamd_config_new_worker (struct rspamd_config *cfg,
        struct rspamd_worker_conf *c)
@@ -971,6 +989,7 @@ rspamd_config_add_metric_symbol (struct rspamd_config *cfg,
        score_ptr = rspamd_mempool_alloc (cfg->cfg_pool, sizeof (gdouble));
 
        *score_ptr = score;
+       sym_def->score = score;
        sym_def->weight_ptr = score_ptr;
        sym_def->name = rspamd_mempool_strdup (cfg->cfg_pool, symbol);
        sym_def->one_shot = one_shot;
@@ -1007,12 +1026,7 @@ rspamd_config_add_metric_symbol (struct rspamd_config *cfg,
        sym_group = g_hash_table_lookup (metric->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 (metric->groups, sym_group->name, sym_group);
+               sym_group = rspamd_config_new_group (cfg, metric, group);
        }
 
        sym_def->gr = sym_group;
index b6d2fb863466c7343ae024d1e130a1d4d99cdeda..21e712e0d84089a8458f1a11c148656b2419e4e4 100644 (file)
@@ -143,6 +143,9 @@ rspamd_composite_expr_process (gpointer input, rspamd_expression_atom_t *atom)
        struct symbol *ms;
        struct rspamd_symbols_group *gr;
        struct rspamd_symbol_def *sdef;
+       struct metric *metric;
+       GHashTableIter it;
+       gpointer k, v;
        gint rc = 0;
        gchar t = '\0';
 
@@ -157,11 +160,17 @@ rspamd_composite_expr_process (gpointer input, rspamd_expression_atom_t *atom)
        }
 
        if (strncmp (sym, "g:", 2) == 0) {
-               gr = g_hash_table_lookup (cd->task->cfg->symbols_groups, sym + 2);
+               metric = g_hash_table_lookup (cd->task->cfg->metrics, DEFAULT_METRIC);
+               g_assert (metric != NULL);
+               gr = g_hash_table_lookup (metric->groups, sym + 2);
 
                if (gr != NULL) {
-                       LL_FOREACH (gr->symbols, sdef) {
+                       g_hash_table_iter_init (&it, gr->symbols);
+
+                       while (g_hash_table_iter_next (&it, &k, &v)) {
+                               sdef = v;
                                rc = rspamd_composite_process_single_symbol (cd, sdef->name, &ms);
+
                                if (rc) {
                                        break;
                                }
index c32eda21a6750717b482d22e047393a4fb95d180..0928f0ad009ed4377f6d7e154b8facf54f6ca127 100644 (file)
@@ -815,7 +815,9 @@ rspamd_metric_symbol_ucl (struct rspamd_task *task, struct metric *m,
                rspamd_printf_gstring (logbuf, "%s,", sym->name);
        }
 
-       description = g_hash_table_lookup (m->descriptions, sym->name);
+       if (sym->def != NULL) {
+               description = sym->def->description;
+       }
 
        obj = ucl_object_typed_new (UCL_OBJECT);
        ucl_object_insert_key (obj, ucl_object_fromstring (
index 0cc2850942492238559c54c797d927ceb9929b28..4cb022764b380d458208b2b621471848c5533152 100644 (file)
@@ -259,7 +259,6 @@ rspamd_symbols_cache_load_items (struct symbols_cache *cache, const gchar *name)
        const guchar *p;
        gint fd;
        gpointer map;
-       double w;
 
        fd = open (name, O_RDONLY);
 
index 055b6b0ff27515a819fbb5ab7e66b0849e91eb13..943c37b081df9870193cf32fa7e889b4941b40aa 100644 (file)
@@ -738,7 +738,7 @@ setproctitle (const gchar *fmt, ...)
 gint
 init_title (gint argc, gchar *argv[], gchar *envp[])
 {
-#if defined(DARWIN) || defined(SOLARIS)
+#if defined(DARWIN) || defined(SOLARIS) || defined(__APPLE__)
        /* XXX: try to handle these OSes too */
        return 0;
 #else
index a8e8dfbb848123da802121850c044209efb4942e..049118504d20cc591f078c0660396739542fb646 100644 (file)
@@ -40,7 +40,7 @@ static void
 lua_process_metric (lua_State *L, const gchar *name, struct rspamd_config *cfg)
 {
        GList *metric_list;
-       gchar *symbol, *old_desc;
+       gchar *symbol;
        const gchar *desc;
        struct metric *metric;
        gdouble *score;
@@ -75,20 +75,7 @@ lua_process_metric (lua_State *L, const gchar *name, struct rspamd_config *cfg)
                                lua_gettable (L, -2);
                                if (lua_isstring (L, -1)) {
                                        desc = lua_tostring (L, -1);
-                                       old_desc =
-                                               g_hash_table_lookup (metric->descriptions, symbol);
-                                       if (old_desc) {
-                                               msg_info ("replacing description for symbol %s",
-                                                       symbol);
-                                               g_hash_table_replace (metric->descriptions,
-                                                       symbol,
-                                                       rspamd_mempool_strdup (cfg->cfg_pool, desc));
-                                       }
-                                       else {
-                                               g_hash_table_insert (metric->descriptions,
-                                                       symbol,
-                                                       rspamd_mempool_strdup (cfg->cfg_pool, desc));
-                                       }
+                                       s->description = rspamd_mempool_strdup (cfg->cfg_pool, desc);
                                }
                                lua_pop (L, 1);
                        }
index 8374af56d32e2b7009850dc569e254cbc98e4671..9b1f928b9a53fe6de012046b29c3b27bb267f629 100644 (file)
@@ -25,8 +25,6 @@
 #define FIXED_CONFIG_FILE RSPAMD_CONFDIR "/rspamd.conf"
 /* Time in seconds to exit for old worker */
 #define SOFT_SHUTDOWN_TIME 10
-/* Default metric name */
-#define DEFAULT_METRIC "default"
 
 /* Spam subject */
 #define SPAM_SUBJECT "*** SPAM *** "