From 7ab226f70f53dd907a7c0b85008ebb41f937aa50 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 30 May 2018 15:32:16 +0100 Subject: [PATCH] [Project] Eliminate C counterpart for `configwizard` --- lualib/rspamadm/configwizard.lua | 201 ++++++++++++++++++------------- src/rspamadm/CMakeLists.txt | 1 - src/rspamadm/commands.c | 2 - src/rspamadm/configwizard.c | 167 ------------------------- 4 files changed, 118 insertions(+), 253 deletions(-) delete mode 100644 src/rspamadm/configwizard.c diff --git a/lualib/rspamadm/configwizard.lua b/lualib/rspamadm/configwizard.lua index 542b61552..0fa48ad9c 100644 --- a/lualib/rspamadm/configwizard.lua +++ b/lualib/rspamadm/configwizard.lua @@ -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("") + :default(rspamd_paths["CONFDIR"] .. "/" .. "rspamd.conf") +parser:argument "checks" + :description "Checks to do (or 'list')" + :argname("") + :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, +} diff --git a/src/rspamadm/CMakeLists.txt b/src/rspamadm/CMakeLists.txt index 3559186f4..11603d05d 100644 --- a/src/rspamadm/CMakeLists.txt +++ b/src/rspamadm/CMakeLists.txt @@ -8,7 +8,6 @@ SET(RSPAMADMSRC rspamadm.c configdump.c control.c confighelp.c - configwizard.c stat_convert.c signtool.c lua_repl.c diff --git a/src/rspamadm/commands.c b/src/rspamadm/commands.c index 224cc48d3..8d93a86da 100644 --- a/src/rspamadm/commands.c +++ b/src/rspamadm/commands.c @@ -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 index bfa35bb71..000000000 --- a/src/rspamadm/configwizard.c +++ /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 ] [checks...]\n" - " rspamadm configwizard [-c ] 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); -} -- 2.39.5