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"
|_|
]]
+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, ...)
-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,
+}
+++ /dev/null
-/*-
- * 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);
-}