From 6e0971f1e1ae1fdc57ed6eeb8c7640bb6d1ed93e Mon Sep 17 00:00:00 2001 From: Jason Dellaluce Date: Mon, 5 Sep 2022 07:32:23 +0000 Subject: [PATCH] update(userspace/engine): support plugin version requirement alternatives in rule loader Signed-off-by: Jason Dellaluce --- userspace/engine/rule_loader.cpp | 22 ++++++++++++++++------ userspace/engine/rule_loader.h | 19 +++++++++++++++---- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/userspace/engine/rule_loader.cpp b/userspace/engine/rule_loader.cpp index 3ded9313..b87825e9 100644 --- a/userspace/engine/rule_loader.cpp +++ b/userspace/engine/rule_loader.cpp @@ -836,7 +836,7 @@ void rule_loader::clear() m_required_plugin_versions.clear(); } -const std::map> rule_loader::required_plugin_versions() const +const std::vector& rule_loader::required_plugin_versions() const { return m_required_plugin_versions; } @@ -851,11 +851,21 @@ void rule_loader::define(configuration& cfg, engine_version_info& info) void rule_loader::define(configuration& cfg, plugin_version_info& info) { - sinsp_version plugin_version(info.version); - THROW(!plugin_version.m_valid, "Invalid required version '" + info.version - + "' for plugin '" + info.name + "'", - info.ctx); - m_required_plugin_versions[info.name].insert(info.version); + std::unordered_set plugin_names; + for (const auto& req : info.alternatives) + { + sinsp_version plugin_version(req.version); + THROW(!plugin_version.m_valid, + "Invalid required version '" + req.version + + "' for plugin '" + req.name + "'", + info.ctx); + THROW(plugin_names.find(req.name) != plugin_names.end(), + "Defined multiple alternative version requirements for plugin '" + + req.name + "'", + info.ctx); + plugin_names.insert(req.name); + } + m_required_plugin_versions.push_back(info.alternatives); } void rule_loader::define(configuration& cfg, list_info& info) diff --git a/userspace/engine/rule_loader.h b/userspace/engine/rule_loader.h index b6450985..576a40e3 100644 --- a/userspace/engine/rule_loader.h +++ b/userspace/engine/rule_loader.h @@ -182,6 +182,18 @@ public: */ struct plugin_version_info { + struct requirement + { + requirement() = default; + requirement(const std::string n, const std::string v): + name(n), version(v) { } + + std::string name; + std::string version; + }; + + typedef std::vector requirement_alternatives; + // This differs from the other _info structs by having // a default constructor. This allows it to be used // by falco_engine, which aliases the type. @@ -190,8 +202,7 @@ public: ~plugin_version_info() = default; context ctx; - std::string name; - std::string version; + requirement_alternatives alternatives; }; /*! @@ -303,7 +314,7 @@ public: \brief Returns the set of all required versions for each plugin according to the internal definitions. */ - virtual const std::map> required_plugin_versions() const; + virtual const std::vector& required_plugin_versions() const; /*! \brief Defines an info block. If a similar info block is found @@ -348,5 +359,5 @@ private: indexed_vector m_rule_infos; indexed_vector m_macro_infos; indexed_vector m_list_infos; - std::map> m_required_plugin_versions; + std::vector m_required_plugin_versions; };