]> source.dussan.org Git - rspamd.git/commitdiff
[Project] Eliminate C counterpart for `configwizard`
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 30 May 2018 14:32:16 +0000 (15:32 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 30 May 2018 14:32:16 +0000 (15:32 +0100)
lualib/rspamadm/configwizard.lua
src/rspamadm/CMakeLists.txt
src/rspamadm/commands.c
src/rspamadm/configwizard.c [deleted file]

index 542b61552c6ec857b8fd4f34807b62e551c8a7b4..0fa48ad9c7f225e204ec4b82b46940d312038350 100644 (file)
@@ -22,6 +22,7 @@ local lua_util = require "lua_util"
 local lua_stat_tools = require "lua_stat"
 local lua_redis = require "lua_redis"
 local ucl = require "ucl"
+local argparse = require "argparse"
 
 local plugins_stat = require "plugins_stats"
 
@@ -34,6 +35,19 @@ local rspamd_logo = [[
              |_|
 ]]
 
+local parser = argparse()
+    :name "rspamadm configwizard"
+    :description "Perform guided configuration for Rspamd daemon"
+    :help_description_margin(32)
+parser:option "-c --config"
+      :description "Path to config file"
+      :argname("<file>")
+      :default(rspamd_paths["CONFDIR"] .. "/" .. "rspamd.conf")
+parser:argument "checks"
+      :description "Checks to do (or 'list')"
+      :argname("<checks>")
+      :args "*"
+
 local redis_params
 
 local function printf(fmt, ...)
@@ -578,109 +592,130 @@ end
 
 
 
-return function(args, cfg)
-  local changes = {
-    l = {}, -- local changes
-    o = {}, -- override changes
-  }
-
-  local interactive_start = true
-  local checks = {}
-  local all_checks = {
-    'controller',
-    'redis',
-    'dkim',
-    'statistic',
-  }
-
-  if #args > 0 then
-    interactive_start = false
-
-    for _,arg in ipairs(args) do
-      if arg == 'all' then
-        checks = all_checks
-      elseif arg == 'list' then
-        printf(highlight(rspamd_logo))
-        printf('Available modules')
-        for _,c in ipairs(all_checks) do
-          printf('- %s', c)
+return {
+  handler = function(cmd_args)
+    local changes = {
+      l = {}, -- local changes
+      o = {}, -- override changes
+    }
+
+    local interactive_start = true
+    local checks = {}
+    local all_checks = {
+      'controller',
+      'redis',
+      'dkim',
+      'statistic',
+    }
+
+    local opts = parser:parse(cmd_args)
+    local args = opts['checks'] or {}
+
+    local _r,err = rspamd_config:load_ucl(opts['config'])
+    local cfg = rspamd_config:get_ucl()
+
+    if not _r then
+      rspamd_logger.errx('cannot parse %s: %s', opts['config'], err)
+      os.exit(1)
+    end
+
+    _r,err = rspamd_config:parse_rcl({'logging', 'worker'})
+    if not _r then
+      logger.errx('cannot process %s: %s', opts['config'], err)
+      os.exit(1)
+    end
+
+    if #args > 0 then
+      interactive_start = false
+
+      for _,arg in ipairs(args) do
+        if arg == 'all' then
+          checks = all_checks
+        elseif arg == 'list' then
+          printf(highlight(rspamd_logo))
+          printf('Available modules')
+          for _,c in ipairs(all_checks) do
+            printf('- %s', c)
+          end
+          return
+        else
+          table.insert(checks, arg)
         end
-        return
-      else
-        table.insert(checks, arg)
       end
+    else
+      checks = all_checks
     end
-  else
-    checks = all_checks
-  end
 
-  local function has_check(check)
-    for _,c in ipairs(checks) do
-      if c == check then
-        return true
+    local function has_check(check)
+      for _,c in ipairs(checks) do
+        if c == check then
+          return true
+        end
       end
-    end
 
-    return false
-  end
+      return false
+    end
 
-  rspamd_util.umask('022')
-  if interactive_start then
-    printf(highlight(rspamd_logo))
-    printf("Welcome to the configuration tool")
-    printf("We use %s configuration file, writing results to %s",
-      highlight(cfg.config_path), highlight(local_conf))
-    plugins_stat(nil, nil)
-  end
+    rspamd_util.umask('022')
+    if interactive_start then
+      printf(highlight(rspamd_logo))
+      printf("Welcome to the configuration tool")
+      printf("We use %s configuration file, writing results to %s",
+          highlight(opts['config']), highlight(local_conf))
+      plugins_stat(nil, nil)
+    end
 
-  if not interactive_start or
-      ask_yes_no("Do you wish to continue?", true) then
+    if not interactive_start or
+        ask_yes_no("Do you wish to continue?", true) then
 
-    if has_check('controller') then
-      local controller = find_worker(cfg, 'controller')
-      if controller then
-        setup_controller(controller, changes)
+      if has_check('controller') then
+        local controller = find_worker(cfg, 'controller')
+        if controller then
+          setup_controller(controller, changes)
+        end
       end
-    end
 
-    if has_check('redis') then
-      if not cfg.redis or (not cfg.redis.servers and not cfg.redis.read_servers) then
-        setup_redis(cfg, changes)
+      if has_check('redis') then
+        if not cfg.redis or (not cfg.redis.servers and not cfg.redis.read_servers) then
+          setup_redis(cfg, changes)
+        else
+          redis_params = cfg.redis
+        end
       else
         redis_params = cfg.redis
       end
-    else
-      redis_params = cfg.redis
-    end
 
-    if has_check('dkim') then
-      if cfg.dkim_signing and not cfg.dkim_signing.domain then
-        if ask_yes_no('Do you want to setup dkim signing feature?') then
-          setup_dkim_signing(cfg, changes)
+      if has_check('dkim') then
+        if cfg.dkim_signing and not cfg.dkim_signing.domain then
+          if ask_yes_no('Do you want to setup dkim signing feature?') then
+            setup_dkim_signing(cfg, changes)
+          end
         end
       end
-    end
-
-    if has_check('statistic') or has_check('statistics') then
-      setup_statistic(cfg, changes)
-    end
 
-    local nchanges = 0
-    for _,_ in pairs(changes.l) do nchanges = nchanges + 1 end
-    for _,_ in pairs(changes.o) do nchanges = nchanges + 1 end
+      if has_check('statistic') or has_check('statistics') then
+        setup_statistic(cfg, changes)
+      end
 
-    if nchanges > 0 then
-      print_changes(changes)
-      if ask_yes_no("Apply changes?", true) then
-        apply_changes(changes)
-        printf("%d changes applied, the wizard is finished now", nchanges)
-        printf("*** Please reload the Rspamd configuration ***")
+      local nchanges = 0
+      for _,_ in pairs(changes.l) do nchanges = nchanges + 1 end
+      for _,_ in pairs(changes.o) do nchanges = nchanges + 1 end
+
+      if nchanges > 0 then
+        print_changes(changes)
+        if ask_yes_no("Apply changes?", true) then
+          apply_changes(changes)
+          printf("%d changes applied, the wizard is finished now", nchanges)
+          printf("*** Please reload the Rspamd configuration ***")
+        else
+          printf("No changes applied, the wizard is finished now")
+        end
       else
-        printf("No changes applied, the wizard is finished now")
+        printf("No changes found, the wizard is finished now")
       end
-    else
-      printf("No changes found, the wizard is finished now")
     end
-  end
-end
+  end,
+  name = 'configwizard',
+  description = parser._description,
+}
 
index 3559186f431d5bcc7e28978351b3863f04bb9710..11603d05ddc7e23e3d57c347cd45edf8b8296977 100644 (file)
@@ -8,7 +8,6 @@ SET(RSPAMADMSRC rspamadm.c
         configdump.c
         control.c
         confighelp.c
-        configwizard.c
         stat_convert.c
         signtool.c
         lua_repl.c
index 224cc48d34e3358c392fb8ca92c9c64416da6523..8d93a86da1354a1602c885b106a0ef65dad83ecd 100644 (file)
@@ -30,7 +30,6 @@ extern struct rspamadm_command fuzzyconvert_command;
 extern struct rspamadm_command signtool_command;
 extern struct rspamadm_command lua_command;
 extern struct rspamadm_command dkim_keygen_command;
-extern struct rspamadm_command configwizard_command;
 
 const struct rspamadm_command *commands[] = {
        &help_command,
@@ -46,7 +45,6 @@ const struct rspamadm_command *commands[] = {
        &signtool_command,
        &lua_command,
        &dkim_keygen_command,
-       &configwizard_command,
        NULL
 };
 
diff --git a/src/rspamadm/configwizard.c b/src/rspamadm/configwizard.c
deleted file mode 100644 (file)
index bfa35bb..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-/*-
- * Copyright 2017 Vsevolod Stakhov
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "config.h"
-#include "rspamadm.h"
-#include "cfg_file.h"
-#include "cfg_rcl.h"
-#include "utlist.h"
-#include "rspamd.h"
-#include "lua/lua_common.h"
-#include "utlist.h"
-
-static gchar *config = NULL;
-extern struct rspamd_main *rspamd_main;
-/* Defined in modules.c */
-extern module_t *modules[];
-extern worker_t *workers[];
-
-static void rspamadm_configwizard (gint argc, gchar **argv,
-                                                                  const struct rspamadm_command *cmd);
-static const char *rspamadm_configwizard_help (gboolean full_help,
-                                                                                          const struct rspamadm_command *cmd);
-
-struct rspamadm_command configwizard_command = {
-               .name = "configwizard",
-               .flags = 0,
-               .help = rspamadm_configwizard_help,
-               .run = rspamadm_configwizard,
-               .lua_subrs = NULL,
-};
-
-static GOptionEntry entries[] = {
-               {"config", 'c', 0, G_OPTION_ARG_STRING, &config,
-                               "Config file to use",     NULL},
-               {NULL,  0,   0, G_OPTION_ARG_NONE, NULL, NULL, NULL}
-};
-
-static const char *
-rspamadm_configwizard_help (gboolean full_help, const struct rspamadm_command *cmd)
-{
-       const char *help_str;
-
-       if (full_help) {
-               help_str = "Perform guided configuration for Rspamd daemon\n\n"
-                               "Usage: rspamadm configwizard [-c <config_name>] [checks...]\n"
-                               "       rspamadm configwizard [-c <config_name>] list\n"
-                               "Where options are:\n\n"
-                               "--help: shows available options and commands";
-       }
-       else {
-               help_str = "Perform guided configuration for Rspamd daemon";
-       }
-
-       return help_str;
-}
-
-static void
-config_logger (rspamd_mempool_t *pool, gpointer ud)
-{
-       struct rspamd_main *rm = ud;
-
-       rm->cfg->log_type = RSPAMD_LOG_CONSOLE;
-       rm->cfg->log_level = G_LOG_LEVEL_MESSAGE;
-
-       rspamd_set_logger (rm->cfg, g_quark_try_string ("main"), &rm->logger,
-                       rm->server_pool);
-
-       if (rspamd_log_open_priv (rm->logger, rm->workers_uid, rm->workers_gid) ==
-                       -1) {
-               fprintf (stderr, "Fatal error, cannot open logfile, exiting\n");
-               exit (EXIT_FAILURE);
-       }
-}
-
-static void
-rspamadm_configwizard (gint argc, gchar **argv,
-                                          const struct rspamadm_command *cmd)
-{
-       GOptionContext *context;
-       GError *error = NULL;
-       const gchar *confdir;
-       struct rspamd_config *cfg = rspamd_main->cfg;
-       gboolean ret = TRUE;
-       worker_t **pworker;
-       lua_State *L;
-
-       context = g_option_context_new (
-                       "configwizard - perform guided configuration");
-       g_option_context_set_summary (context,
-                       "Summary:\n  Rspamd administration utility version "
-                                       RVERSION
-                                       "\n  Release id: "
-                                       RID);
-       g_option_context_add_main_entries (context, entries, NULL);
-
-       if (!g_option_context_parse (context, &argc, &argv, &error)) {
-               fprintf (stderr, "option parsing failed: %s\n", error->message);
-               g_error_free (error);
-               exit (1);
-       }
-
-       if (config == NULL) {
-               if ((confdir = g_hash_table_lookup (ucl_vars, "CONFDIR")) == NULL) {
-                       confdir = RSPAMD_CONFDIR;
-               }
-
-               config = g_strdup_printf ("%s%c%s", confdir, G_DIR_SEPARATOR,
-                               "rspamd.conf");
-       }
-
-       pworker = &workers[0];
-       while (*pworker) {
-               /* Init string quarks */
-               (void) g_quark_from_static_string ((*pworker)->name);
-               pworker++;
-       }
-
-       cfg->cache = rspamd_symbols_cache_new (cfg);
-       cfg->compiled_modules = modules;
-       cfg->compiled_workers = workers;
-       cfg->cfg_name = config;
-
-       if (!rspamd_config_read (cfg, cfg->cfg_name, config_logger, rspamd_main, ucl_vars)) {
-               ret = FALSE;
-       }
-       else {
-               /* Do post-load actions */
-               rspamd_lua_post_load_config (cfg);
-
-               if (!rspamd_init_filters (cfg, FALSE)) {
-                       ret = FALSE;
-               }
-
-               if (ret) {
-                       ret = rspamd_config_post_load (cfg, RSPAMD_CONFIG_INIT_SYMCACHE);
-               }
-       }
-
-       if (ret) {
-               L = cfg->lua_state;
-               rspamd_lua_set_path (L, cfg->rcl_obj, ucl_vars);
-               ucl_object_insert_key (cfg->rcl_obj, ucl_object_fromstring (cfg->cfg_name),
-                               "config_path", 0, false);
-
-               rspamadm_execute_lua_ucl_subr (L,
-                               argc,
-                               argv,
-                               cfg->rcl_obj,
-                               "configwizard");
-
-               lua_close (L);
-       }
-
-       exit (ret ? EXIT_SUCCESS  : EXIT_FAILURE);
-}