]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Allow to dump symbols and groups using configdump
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 28 Feb 2020 16:25:15 +0000 (16:25 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 28 Feb 2020 16:25:15 +0000 (16:25 +0000)
src/rspamadm/configdump.c

index bbd219e3d8972f0df5b65af85eddbf5a5a6e71f2..8c9c027244a3ac98f4060f493f1abeb2c666c6ce 100644 (file)
@@ -27,6 +27,7 @@ static gboolean compact = FALSE;
 static gboolean show_help = FALSE;
 static gboolean show_comments = FALSE;
 static gboolean modules_state = FALSE;
+static gboolean symbol_groups_only = FALSE;
 static gboolean skip_template = FALSE;
 static gchar *config = NULL;
 extern struct rspamd_main *rspamd_main;
@@ -58,6 +59,8 @@ static GOptionEntry entries[] = {
                                "Show saved comments from the configuration file", NULL },
                {"modules-state", 'm', 0, G_OPTION_ARG_NONE, &modules_state,
                                "Show modules state only", NULL},
+               {"groups", 'g', 0, G_OPTION_ARG_NONE, &symbol_groups_only,
+                               "Show symbols groups only", NULL},
                {"skip-template", 'T', 0, G_OPTION_ARG_NONE, &skip_template,
                                "Do not apply Jinja templates", NULL},
                {NULL,  0,   0, G_OPTION_ARG_NONE, NULL, NULL, NULL}
@@ -300,6 +303,109 @@ rspamadm_configdump (gint argc, gchar **argv, const struct rspamadm_command *cmd
 
                        exit (EXIT_SUCCESS);
                }
+
+               if (symbol_groups_only) {
+                       /*
+                        * Create object from symbols groups and output it using the
+                        * specified format
+                        */
+                       ucl_object_t *out = ucl_object_typed_new (UCL_OBJECT);
+                       GHashTableIter it;
+                       gpointer k, v;
+
+                       g_hash_table_iter_init (&it, cfg->groups);
+
+                       while (g_hash_table_iter_next (&it, &k, &v)) {
+                               const gchar *gr_name = (const gchar *)k;
+                               struct rspamd_symbols_group *gr = (struct rspamd_symbols_group *)v;
+                               ucl_object_t *gr_ucl = ucl_object_typed_new (UCL_OBJECT);
+
+                               ucl_object_insert_key (gr_ucl,
+                                               ucl_object_frombool (!!(gr->flags & RSPAMD_SYMBOL_GROUP_PUBLIC)),
+                                               "public", strlen ("public"), false);
+                               ucl_object_insert_key (gr_ucl,
+                                               ucl_object_frombool (!!(gr->flags & RSPAMD_SYMBOL_GROUP_DISABLED)),
+                                               "disabled", strlen ("disabled"), false);
+                               ucl_object_insert_key (gr_ucl,
+                                               ucl_object_frombool (!!(gr->flags & RSPAMD_SYMBOL_GROUP_ONE_SHOT)),
+                                               "one_shot", strlen ("one_shot"), false);
+                               ucl_object_insert_key (gr_ucl,
+                                               ucl_object_fromdouble (gr->max_score),
+                                               "max_score", strlen ("one_shot"), false);
+                               ucl_object_insert_key (gr_ucl,
+                                               ucl_object_fromstring (gr->description),
+                                               "description", strlen ("description"), false);
+
+                               if (gr->symbols) {
+                                       GHashTableIter sit;
+                                       gpointer sk, sv;
+
+                                       g_hash_table_iter_init (&sit, gr->symbols);
+                                       ucl_object_t *sym_ucl = ucl_object_typed_new (UCL_OBJECT);
+
+                                       while (g_hash_table_iter_next (&sit, &sk, &sv)) {
+                                               const gchar *sym_name = (const gchar *) sk;
+                                               struct rspamd_symbol *s = (struct rspamd_symbol *)sv;
+                                               ucl_object_t *spec_sym = ucl_object_typed_new (UCL_OBJECT);
+
+                                               ucl_object_insert_key (spec_sym,
+                                                               ucl_object_fromdouble (s->score),
+                                                               "score", strlen ("score"),
+                                                               false);
+                                               ucl_object_insert_key (spec_sym,
+                                                               ucl_object_fromstring (s->description),
+                                                               "description", strlen ("description"), false);
+                                               ucl_object_insert_key (spec_sym,
+                                                               ucl_object_frombool (!!(s->flags & RSPAMD_SYMBOL_FLAG_DISABLED)),
+                                                               "disabled", strlen ("disabled"),
+                                                               false);
+
+                                               if (s->nshots == 1) {
+                                                       ucl_object_insert_key (spec_sym,
+                                                                       ucl_object_frombool (true),
+                                                                       "one_shot", strlen ("one_shot"),
+                                                                       false);
+                                               }
+                                               else {
+                                                       ucl_object_insert_key (spec_sym,
+                                                                       ucl_object_frombool (false),
+                                                                       "one_shot", strlen ("one_shot"),
+                                                                       false);
+                                               }
+
+                                               ucl_object_t *add_groups = ucl_object_typed_new (UCL_ARRAY);
+                                               guint j;
+                                               struct rspamd_symbols_group *add_gr;
+
+                                               PTR_ARRAY_FOREACH (s->groups, j, add_gr) {
+                                                       if (add_gr->name && strcmp (add_gr->name, gr_name) != 0) {
+                                                               ucl_array_append (add_groups,
+                                                                               ucl_object_fromstring (add_gr->name));
+                                                       }
+                                               }
+
+                                               ucl_object_insert_key (spec_sym,
+                                                               add_groups,
+                                                               "extra_groups", strlen ("extra_groups"),
+                                                               false);
+
+                                               ucl_object_insert_key (sym_ucl, spec_sym, sym_name,
+                                                               strlen (sym_name), true);
+                                       }
+
+                                       ucl_object_insert_key (gr_ucl, sym_ucl, "symbols",
+                                                       strlen ("symbols"), false);
+                               }
+
+                               ucl_object_insert_key (out, gr_ucl, gr_name, strlen (gr_name),
+                                               true);
+                       }
+
+                       rspamadm_dump_section_obj (cfg, out, NULL);
+
+                       exit (EXIT_SUCCESS);
+               }
+
                /* Output configuration */
                if (argc == 1) {
                        rspamadm_dump_section_obj (cfg, cfg->rcl_obj, cfg->doc_strings);