]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Add 'reresolve' command to the control interface
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 23 Nov 2015 09:29:59 +0000 (09:29 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 23 Nov 2015 09:29:59 +0000 (09:29 +0000)
src/libserver/rspamd_control.c
src/libserver/rspamd_control.h
src/rspamadm/control.c

index 5443b81a3ba4ab0646e624870b72edba0eb12862..9e17f212017923172e7ccf1bd907d8a7bc85a545 100644 (file)
@@ -69,17 +69,24 @@ static const struct rspamd_control_cmd_match {
                {
                                .name = {
                                                .begin = "/stat",
-                                               .len = 5
+                                               .len = sizeof ("/stat") - 1
                                },
                                .type = RSPAMD_CONTROL_STAT
                },
                {
                                .name = {
                                                .begin = "/reload",
-                                               .len = 7
+                                               .len = sizeof ("/reload") - 1
                                },
                                .type = RSPAMD_CONTROL_RELOAD
                },
+               {
+                               .name = {
+                                               .begin = "/reresolve",
+                                               .len = sizeof ("/reresolve") - 1
+                               },
+                               .type = RSPAMD_CONTROL_RERESOLVE
+               },
 };
 
 void
@@ -190,6 +197,10 @@ rspamd_control_write_reply (struct rspamd_control_session *session)
                        ucl_object_insert_key (cur, ucl_object_fromint (
                                        elt->reply.reply.reload.status), "status", 0, false);
                        break;
+               case RSPAMD_CONTROL_RERESOLVE:
+                       ucl_object_insert_key (cur, ucl_object_fromint (
+                                       elt->reply.reply.reresolve.status), "status", 0, false);
+                       break;
                default:
                        break;
                }
@@ -358,6 +369,7 @@ rspamd_control_default_cmd_handler (gint fd,
        struct rspamd_control_reply rep;
        gssize r;
        struct rusage rusg;
+       struct rspamd_config *cfg;
 
        memset (&rep, 0, sizeof (rep));
        rep.type = cmd->type;
@@ -379,6 +391,23 @@ rspamd_control_default_cmd_handler (gint fd,
                break;
        case RSPAMD_CONTROL_RELOAD:
                break;
+       case RSPAMD_CONTROL_RERESOLVE:
+               if (cd->worker->srv->cfg) {
+                       REF_RETAIN (cd->worker->srv->cfg);
+                       cfg = cd->worker->srv->cfg;
+
+                       if (cfg->ups_ctx) {
+                               msg_info_config ("reresolving upstreams");
+                               rspamd_upstream_reresolve (cfg->ups_ctx);
+                       }
+
+                       rep.reply.reresolve.status = 0;
+                       REF_RELEASE (cfg);
+               }
+               else {
+                       rep.reply.reresolve.status = EINVAL;
+               }
+               break;
        default:
                break;
        }
index a41421afa779a2e8c28c4beca8b9b06aef3e3cee..ddca143cc75dbcd295fbd6464646c65bf23ae441 100644 (file)
@@ -34,6 +34,7 @@ struct rspamd_worker;
 enum rspamd_control_type {
        RSPAMD_CONTROL_STAT = 0,
        RSPAMD_CONTROL_RELOAD,
+       RSPAMD_CONTROL_RERESOLVE,
        RSPAMD_CONTROL_MAX
 };
 
@@ -46,6 +47,9 @@ struct rspamd_control_command {
                struct {
                        guint unused;
                } reload;
+               struct {
+                       guint unused;
+               } reresolve;
        } cmd;
 };
 
@@ -62,6 +66,9 @@ struct rspamd_control_reply {
                struct {
                        guint status;
                } reload;
+               struct {
+                       guint status;
+               } reresolve;
        } reply;
 };
 
index fc19277ebed20832cd27cca6672d507c161ba6d5..42c17650a681ed6ddfd81e0feff7447d1fe399f2 100644 (file)
@@ -76,7 +76,8 @@ rspamadm_control_help (gboolean full_help)
                                "--help: shows available options and commands\n\n"
                                "Supported commands:\n"
                                "stat - show statistics\n"
-                               "reload - reload workers dynamic data\n";
+                               "reload - reload workers dynamic data\n"
+                               "reresolve - resolve upstreams addresses\n";
        }
        else {
                help_str = "Manage rspamd main control interface";
@@ -144,7 +145,7 @@ rspamadm_control (gint argc, gchar **argv)
        gint sock;
 
        context = g_option_context_new (
-                       "keypair - create encryption keys");
+                       "control - manage rspamd main control interface");
        g_option_context_set_summary (context,
                        "Summary:\n  Rspamd administration utility version "
                                        RVERSION
@@ -158,7 +159,7 @@ rspamadm_control (gint argc, gchar **argv)
                exit (1);
        }
 
-       if (argc == 0) {
+       if (argc <= 1) {
                rspamd_fprintf (stderr, "command required\n");
                exit (1);
        }
@@ -171,6 +172,9 @@ rspamadm_control (gint argc, gchar **argv)
        else if (g_ascii_strcasecmp (cmd, "reload") == 0) {
                path = "/reload";
        }
+       else if (g_ascii_strcasecmp (cmd, "reresolve") == 0) {
+               path = "/reresolve";
+       }
        else {
                rspamd_fprintf (stderr, "unknown command: %s\n", cmd);
                exit (1);