From f8cbeaaa9b9701dbbfcde69eb95c311d94b3f3c3 Mon Sep 17 00:00:00 2001 From: Lorenzo Susini Date: Tue, 26 Sep 2023 10:22:36 +0000 Subject: [PATCH] update(userspace/engine): let the rule loader reader and collector be able to load rules with both numeric and semver string required_engine_version Signed-off-by: Lorenzo Susini --- userspace/engine/rule_loader.cpp | 2 +- userspace/engine/rule_loader.h | 4 ++-- userspace/engine/rule_loader_collector.cpp | 18 +++++++++++++----- userspace/engine/rule_loader_reader.cpp | 17 ++++++++++++++++- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/userspace/engine/rule_loader.cpp b/userspace/engine/rule_loader.cpp index 9036a67e..30dec726 100644 --- a/userspace/engine/rule_loader.cpp +++ b/userspace/engine/rule_loader.cpp @@ -517,7 +517,7 @@ const nlohmann::json& rule_loader::result::as_json(const rules_contents_t& conte } rule_loader::engine_version_info::engine_version_info(context &ctx) - : ctx(ctx), version(0) + : ctx(ctx) { } diff --git a/userspace/engine/rule_loader.h b/userspace/engine/rule_loader.h index c866625e..929da67f 100644 --- a/userspace/engine/rule_loader.h +++ b/userspace/engine/rule_loader.h @@ -298,7 +298,7 @@ namespace rule_loader */ struct engine_version_info { - engine_version_info() : ctx("no-filename-given"), version(0) { }; + engine_version_info() : ctx("no-filename-given") { }; engine_version_info(context &ctx); ~engine_version_info() = default; engine_version_info(engine_version_info&&) = default; @@ -307,7 +307,7 @@ namespace rule_loader engine_version_info& operator = (const engine_version_info&) = default; context ctx; - uint32_t version; + std::string version; }; /*! diff --git a/userspace/engine/rule_loader_collector.cpp b/userspace/engine/rule_loader_collector.cpp index ffd52b89..1b3eb551 100644 --- a/userspace/engine/rule_loader_collector.cpp +++ b/userspace/engine/rule_loader_collector.cpp @@ -145,11 +145,19 @@ const indexed_vector& rule_loader::collector::rules() co void rule_loader::collector::define(configuration& cfg, engine_version_info& info) { - auto v = falco_engine::engine_version(); - THROW(v < info.version, "Rules require engine version " - + std::to_string(info.version) + ", but engine version is " + std::to_string(v), - info.ctx); - if(m_required_engine_version.version < info.version) + auto engine_version = sinsp_version(falco_engine::engine_version()); + sinsp_version required_engine_version(info.version); + THROW(!required_engine_version.m_valid, "Unable to parse " + info.version + + " as a semver string. Expected \"x.y.z\" semver format.", info.ctx); + + THROW(!engine_version.check(required_engine_version), "Rules require engine version " + + required_engine_version.as_string() + " but engine version is " + + engine_version.as_string(), info.ctx); + + sinsp_version current_required_engine_version(m_required_engine_version.version); + + // Store max required_engine_version + if(current_required_engine_version.check(required_engine_version)) { m_required_engine_version = info; } diff --git a/userspace/engine/rule_loader_reader.cpp b/userspace/engine/rule_loader_reader.cpp index f12ab870..0dad8e33 100644 --- a/userspace/engine/rule_loader_reader.cpp +++ b/userspace/engine/rule_loader_reader.cpp @@ -19,6 +19,7 @@ limitations under the License. #include #include "rule_loader_reader.h" +#include "falco_engine_version.h" #define THROW(cond, err, ctx) { if ((cond)) { throw rule_loader::rule_load_exception(falco::load_result::LOAD_ERR_YAML_VALIDATE, (err), (ctx)); } } @@ -255,8 +256,22 @@ static void read_item( { rule_loader::context ctx(item, rule_loader::context::REQUIRED_ENGINE_VERSION, "", parent); rule_loader::engine_version_info v(ctx); + + try + { + // Convert convert to an uint (more restrictive than converting to a string) + uint32_t ver; + decode_val(item, "required_engine_version", ver, ctx); + + // Build proper semver representation + v.version = std::to_string(FALCO_DEFAULT_ENGINE_MAJOR) + "." + std::to_string(ver) + "." + std::to_string(FALCO_DEFAULT_ENGINE_PATCH); + } + catch(std::exception& e) + { + // Convert to string + decode_val(item, "required_engine_version", v.version, ctx); + } - decode_val(item, "required_engine_version", v.version, ctx); collector.define(cfg, v); } else if(item["required_plugin_versions"].IsDefined())