From: Vsevolod Stakhov Date: Mon, 9 Jan 2017 16:08:00 +0000 (+0000) Subject: [Feature] Add plugins list path in WebUI X-Git-Tag: 1.5.0~398 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a44ad6b4002efdba33959c704aa25272a5999cd0;p=rspamd.git [Feature] Add plugins list path in WebUI --- diff --git a/src/controller.c b/src/controller.c index df6abf116..71c2c895d 100644 --- a/src/controller.c +++ b/src/controller.c @@ -58,6 +58,7 @@ #define PATH_COUNTERS "/counters" #define PATH_ERRORS "/errors" #define PATH_NEIGHBOURS "/neighbours" +#define PATH_PLUGINS "/plugins" #define msg_err_session(...) rspamd_default_log_function(G_LOG_LEVEL_CRITICAL, \ session->pool->tag.tagname, session->pool->tag.uid, \ @@ -185,6 +186,7 @@ struct rspamd_controller_plugin_cbdata { ucl_object_t *obj; gboolean is_enable; gboolean need_task; + guint version; }; static gboolean @@ -1617,7 +1619,6 @@ rspamd_controller_handle_lua (struct rspamd_http_connection_entry *conn_ent, if (lua_pcall (L, 2, 0, 0) != 0) { rspamd_controller_send_error (conn_ent, 503, "Cannot run callback: %s", lua_tostring (L, -1)); - rspamd_session_destroy (task->s); lua_settop (L, 0); return 0; @@ -2531,6 +2532,52 @@ rspamd_controller_handle_custom (struct rspamd_http_connection_entry *conn_ent, return cmd->handler (conn_ent, msg, cmd->ctx); } +static int +rspamd_controller_handle_plugins (struct rspamd_http_connection_entry *conn_ent, + struct rspamd_http_message *msg) +{ + struct rspamd_controller_session *session = conn_ent->ud; + struct rspamd_controller_plugin_cbdata *cbd; + GHashTableIter it; + gpointer k, v; + ucl_object_t *plugins; + + if (!rspamd_controller_check_password (conn_ent, session, msg, + FALSE)) { + return 0; + } + + plugins = ucl_object_typed_new (UCL_OBJECT); + g_hash_table_iter_init (&it, session->ctx->plugins); + + while (g_hash_table_iter_next (&it, &k, &v)) { + ucl_object_t *elt, *npath; + + cbd = v; + elt = (ucl_object_t *)ucl_object_lookup (plugins, cbd->plugin); + + if (elt == NULL) { + elt = ucl_object_typed_new (UCL_OBJECT); + ucl_object_insert_key (elt, ucl_object_fromint (cbd->version), + "version", 0, false); + npath = ucl_object_typed_new (UCL_ARRAY); + ucl_object_insert_key (elt, npath, "paths", 0, false); + ucl_object_insert_key (plugins, elt, cbd->plugin, 0, false); + } + else { + npath = (ucl_object_t *)ucl_object_lookup (elt, "paths"); + } + + g_assert (npath != NULL); + ucl_array_append (npath, ucl_object_fromstring (k)); + } + + rspamd_controller_send_ucl (conn_ent, plugins); + ucl_object_unref (plugins); + + return 0; +} + static int rspamd_controller_handle_lua_plugin (struct rspamd_http_connection_entry *conn_ent, struct rspamd_http_message *msg) @@ -2604,7 +2651,6 @@ rspamd_controller_handle_lua_plugin (struct rspamd_http_connection_entry *conn_e if (lua_pcall (L, 2, 0, 0) != 0) { rspamd_controller_send_error (conn_ent, 503, "Cannot run callback: %s", lua_tostring (L, -1)); - rspamd_session_destroy (task->s); lua_settop (L, 0); return 0; @@ -3154,6 +3200,12 @@ rspamd_controller_register_plugin_path (lua_State *L, cbd->plugin = g_strdup (plugin_name); cbd->obj = ucl_object_ref (webui_data); + elt = ucl_object_lookup (webui_data, "version"); + + if (elt) { + cbd->version = ucl_object_toint (elt); + } + elt = ucl_object_lookup (webui_data, "enable"); if (elt && !!ucl_object_toboolean (elt)) { @@ -3367,6 +3419,9 @@ start_controller_worker (struct rspamd_worker *worker) rspamd_http_router_add_path (ctx->http, PATH_NEIGHBOURS, rspamd_controller_handle_neighbours); + rspamd_http_router_add_path (ctx->http, + PATH_PLUGINS, + rspamd_controller_handle_plugins); rspamd_controller_register_plugins_paths (ctx); rspamd_regexp_t *lua_re = rspamd_regexp_new ("^/.*/.*\\.lua$", NULL, NULL);