From 8d08ce4da42d2b746a7462899f901e8f422e3d81 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 25 Sep 2015 01:16:02 +0100 Subject: [PATCH] Add configtest command. --- src/CMakeLists.txt | 2 +- src/rspamadm/CMakeLists.txt | 10 +- src/rspamadm/commands.c | 2 + src/rspamadm/configtest.c | 177 ++++++++++++++++++++++++++++++++++++ src/rspamadm/rspamadm.c | 2 +- 5 files changed, 190 insertions(+), 3 deletions(-) create mode 100644 src/rspamadm/configtest.c diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3d3d887e4..2561fa0ff 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -75,7 +75,7 @@ ADD_SUBDIRECTORY(rspamadm) SET(RSPAMDSRC controller.c fuzzy_storage.c lua_worker.c - rspamd.c + rspamd.c smtp_proxy.c worker.c http_proxy.c) diff --git a/src/rspamadm/CMakeLists.txt b/src/rspamadm/CMakeLists.txt index 915dfc622..b5988972d 100644 --- a/src/rspamadm/CMakeLists.txt +++ b/src/rspamadm/CMakeLists.txt @@ -1,4 +1,12 @@ -SET(RSPAMADMSRC rspamadm.c commands.c pw.c keypair.c) +SET(RSPAMADMSRC rspamadm.c commands.c pw.c keypair.c configtest.c + ${CMAKE_BINARY_DIR}/src/workers.c + ${CMAKE_BINARY_DIR}/src/modules.c + ${CMAKE_SOURCE_DIR}/src/controller.c + ${CMAKE_SOURCE_DIR}/src/fuzzy_storage.c + ${CMAKE_SOURCE_DIR}/src/lua_worker.c + ${CMAKE_SOURCE_DIR}/src/smtp_proxy.c + ${CMAKE_SOURCE_DIR}/src/worker.c + ${CMAKE_SOURCE_DIR}/src/http_proxy.c) ADD_EXECUTABLE(rspamadm ${RSPAMADMSRC}) TARGET_LINK_LIBRARIES(rspamadm rspamd-server) diff --git a/src/rspamadm/commands.c b/src/rspamadm/commands.c index 65725b261..703d1ac08 100644 --- a/src/rspamadm/commands.c +++ b/src/rspamadm/commands.c @@ -25,11 +25,13 @@ extern struct rspamadm_command pw_command; extern struct rspamadm_command keypair_command; +extern struct rspamadm_command configtest_command; const struct rspamadm_command *commands[] = { &help_command, &pw_command, &keypair_command, + &configtest_command, NULL }; diff --git a/src/rspamadm/configtest.c b/src/rspamadm/configtest.c new file mode 100644 index 000000000..bfcce0413 --- /dev/null +++ b/src/rspamadm/configtest.c @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2015, Vsevolod Stakhov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "rspamadm.h" +#include "cfg_file.h" +#include "cfg_rcl.h" +#include "rspamd.h" + +static gboolean quiet = FALSE; +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_configtest (gint argc, gchar **argv); +static const char *rspamadm_configtest_help (gboolean full_help); + +struct rspamadm_command configtest_command = { + .name = "configtest", + .flags = 0, + .help = rspamadm_configtest_help, + .run = rspamadm_configtest +}; + +static GOptionEntry entries[] = { + {"quiet", 'q', 0, G_OPTION_ARG_NONE, &quiet, + "Supress output", NULL}, + {"config", 'c', 0, G_OPTION_ARG_STRING, &config, + "Config file to test", NULL}, + {NULL, 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL} +}; + +static const char * +rspamadm_configtest_help (gboolean full_help) +{ + const char *help_str; + + if (full_help) { + help_str = "Perform configuration file test\n" + "Usage: rspamadm configtest [-q -c ]\n" + "Where options are:\n" + "-q quiet output\n" + "-c config file to test\n" + "--help: shows available options and commands"; + } + else { + help_str = "Perform configuration file test"; + } + + 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; + + if (quiet) { + rm->cfg->log_level = G_LOG_LEVEL_CRITICAL; + } + else { + rm->cfg->log_level = G_LOG_LEVEL_WARNING; + } + + rspamd_set_logger (rm->cfg, g_quark_try_string ("main"), rm); + 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_configtest (gint argc, gchar **argv) +{ + GOptionContext *context; + GError *error = NULL; + const gchar *confdir; + struct rspamd_config *cfg = rspamd_main->cfg; + gboolean ret = FALSE; + worker_t **pworker; + + context = g_option_context_new ( + "keypair - create encryption keys"); + 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, NULL, + config_logger, rspamd_main, ucl_vars)) { + ret = FALSE; + } + else { + /* Do post-load actions */ + rspamd_config_post_load (cfg); + ret = TRUE; + } + + if (ret) { + rspamd_symbols_cache_init (rspamd_main->cfg->cache); + + if (!rspamd_init_filters (rspamd_main->cfg, FALSE)) { + ret = FALSE; + } + + /* Insert classifiers symbols */ + (void) rspamd_config_insert_classify_symbols (rspamd_main->cfg); + + if (!rspamd_symbols_cache_validate (rspamd_main->cfg->cache, + rspamd_main->cfg, + FALSE)) { + ret = FALSE; + } + } + + if (!quiet) { + rspamd_printf ("syntax %s\n", ret ? "OK" : "BAD"); + } + + if (!ret) { + exit (EXIT_FAILURE); + } +} diff --git a/src/rspamadm/rspamadm.c b/src/rspamadm/rspamadm.c index 9105b74b8..d052dd054 100644 --- a/src/rspamadm/rspamadm.c +++ b/src/rspamadm/rspamadm.c @@ -32,6 +32,7 @@ static gboolean list_commands = FALSE; static gboolean show_help = FALSE; static gboolean show_version = FALSE; GHashTable *ucl_vars = NULL; +struct rspamd_main *rspamd_main = NULL; static void rspamadm_help (gint argc, gchar **argv); static const char* rspamadm_help_help (gboolean full_help); @@ -176,7 +177,6 @@ main (gint argc, gchar **argv, gchar **env) GOptionContext *context; GOptionGroup *og; struct rspamd_config *cfg; - struct rspamd_main *rspamd_main; GQuark process_quark; gchar **nargv, **targv; const gchar *cmd_name; -- 2.39.5