commit afe627e: [Feature] Add controller plugins support and selectors plugin

Vsevolod Stakhov vsevolod at highsecure.ru
Mon Jun 1 12:14:06 UTC 2020


Author: Vsevolod Stakhov
Date: 2020-06-01 13:13:31 +0100
URL: https://github.com/rspamd/rspamd/commit/afe627edabb8c8fbf4909cd55deff2935d2d7cc8 (HEAD -> master)

[Feature] Add controller plugins support and selectors plugin

---
 rules/controller/init.lua      | 64 +++++++++++++++++++++++++++++++++++
 rules/controller/selectors.lua | 77 ++++++++++++++++++++++++++++++++++++++++++
 rules/rspamd.lua               |  1 +
 3 files changed, 142 insertions(+)

diff --git a/rules/controller/init.lua b/rules/controller/init.lua
new file mode 100644
index 000000000..5057c08f5
--- /dev/null
+++ b/rules/controller/init.lua
@@ -0,0 +1,64 @@
+--[[
+Copyright (c) 2020, Vsevolod Stakhov <vsevolod at highsecure.ru>
+
+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.
+]]--
+
+-- Controller endpoints
+
+local local_conf = rspamd_paths['LOCAL_CONFDIR']
+local local_rules = rspamd_paths['RULESDIR']
+local rspamd_util = require "rspamd_util"
+local lua_util = require "lua_util"
+local rspamd_logger = require "rspamd_logger"
+
+-- Define default controller paths, could be overridden in local.d/controller.lua
+
+local controller_plugin_paths = {
+  selectors = dofile(local_rules .. "/controller/selectors.lua")
+}
+
+if rspamd_util.file_exists(local_conf .. '/controller.lua') then
+  local controller_overrides = dofile(local_conf .. '/controller.lua')
+
+  if controller_overrides and type(controller_overrides) == 'table' then
+    controller_plugin_paths = lua_util.override_defaults(controller_plugin_paths, controller_overrides)
+  end
+end
+
+for plug,paths in pairs(controller_plugin_paths) do
+  if not rspamd_plugins[plug] then
+    rspamd_plugins[plug] = {}
+  end
+  if not rspamd_plugins[plug].webui then
+    rspamd_plugins[plug].webui = {}
+  end
+
+  local webui = rspamd_plugins[plug].webui
+
+  for path,attrs in pairs(paths) do
+    if type(attrs) == 'table' then
+      if type(attrs.handler) ~= 'function' then
+        rspamd_logger.infox(rspamd_config, 'controller plugin %s; webui path %s has invalid handler: %s; ignore it',
+            plug, path, type(attrs.handler))
+      else
+        webui[path] = lua_util.shallowcopy(attrs)
+        rspamd_logger.infox(rspamd_config, 'controller plugin %s; register webui path %s',
+            plug, path)
+      end
+    else
+      rspamd_logger.infox(rspamd_config, 'controller plugin %s; webui path %s has invalid type: %s; ignore it',
+        plug, path, type(attrs))
+    end
+  end
+end
\ No newline at end of file
diff --git a/rules/controller/selectors.lua b/rules/controller/selectors.lua
new file mode 100644
index 000000000..58065fc85
--- /dev/null
+++ b/rules/controller/selectors.lua
@@ -0,0 +1,77 @@
+--[[
+Copyright (c) 2020, Vsevolod Stakhov <vsevolod at highsecure.ru>
+
+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.
+]]--
+
+local lua_selectors = require "lua_selectors"
+
+-- Controller selectors plugin
+
+local function handle_list_transforms(_, conn)
+  conn:send_ucl(lua_selectors.list_transforms())
+end
+
+local function handle_list_extractors(_, conn)
+  conn:send_ucl(lua_selectors.list_extractors())
+end
+
+local function handle_check_selector(_, conn, req_params)
+  if req_params.selector then
+    local selector = lua_selectors.create_selector_closure(rspamd_config,
+        req_params.selector, '', true)
+    if not selector then
+      conn:send_error(500, 'invalid selector')
+    else
+      conn:send_ucl({success = true})
+    end
+  else
+    conn:send_error(404, 'missing selector')
+  end
+end
+
+local function handle_check_message(task, conn, req_params)
+  if req_params.selector then
+    local selector = lua_selectors.create_selector_closure(rspamd_config,
+        req_params.selector, '', true)
+    if not selector then
+      conn:send_error(500, 'invalid selector')
+    else
+      task:process_message()
+      local elts = selector(task)
+      conn:send_ucl({success = true, data = elts})
+    end
+  else
+    conn:send_error(404, 'missing selector')
+  end
+end
+
+return {
+  list_extractors = {
+    handler = handle_list_extractors,
+    enable = true,
+  },
+  list_transforms = {
+    handler = handle_list_transforms,
+    enable = true,
+  },
+  check_selector = {
+    handler = handle_check_selector,
+    enable = true,
+  },
+  check_message = {
+    handler = handle_check_message,
+    enable = true,
+    need_task = true,
+  }
+}
\ No newline at end of file
diff --git a/rules/rspamd.lua b/rules/rspamd.lua
index 8ce90b0d0..a5dbef42d 100644
--- a/rules/rspamd.lua
+++ b/rules/rspamd.lua
@@ -38,6 +38,7 @@ dofile(local_rules .. '/forwarding.lua')
 dofile(local_rules .. '/mid.lua')
 dofile(local_rules .. '/bitcoin.lua')
 dofile(local_rules .. '/content.lua')
+dofile(local_rules .. '/controller/init.lua')
 
 if rspamd_util.file_exists(local_conf .. '/rspamd.local.lua') then
   dofile(local_conf .. '/rspamd.local.lua')


More information about the Commits mailing list