diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c8112032..c3f0b8ed 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -97,7 +97,10 @@ jobs: - name: Check Engine version run: | base_hash=$(grep CHECKSUM "./userspace/engine/falco_engine_version.h" | awk '{print $3}' | sed -e 's/"//g') - base_engine_ver=$(grep ENGINE_VERSION "./userspace/engine/falco_engine_version.h" | awk '{print $3}' | sed -e 's/(//g' -e 's/)//g') + base_engine_ver_major=$(grep ENGINE_VERSION_MAJOR "./userspace/engine/falco_engine_version.h" | head -n 1 | awk '{print $3}' | sed -e 's/(//g' -e 's/)//g') + base_engine_ver_minor=$(grep ENGINE_VERSION_MINOR "./userspace/engine/falco_engine_version.h" | head -n 1 | awk '{print $3}' | sed -e 's/(//g' -e 's/)//g') + base_engine_ver_patch=$(grep ENGINE_VERSION_PATCH "./userspace/engine/falco_engine_version.h" | head -n 1 | awk '{print $3}' | sed -e 's/(//g' -e 's/)//g') + base_engine_ver="${base_engine_ver_major}.${base_engine_ver_minor}.${base_engine_ver_patch}" cur_hash=$(echo "${{ needs.build-dev.outputs.cmdout }}" | cut -d ' ' -f 2) cur_engine_ver=$(echo "${{ needs.build-dev.outputs.cmdout }}" | cut -d ' ' -f 1) diff --git a/userspace/engine/falco_engine.cpp b/userspace/engine/falco_engine.cpp index 16b8f28c..422d8664 100644 --- a/userspace/engine/falco_engine.cpp +++ b/userspace/engine/falco_engine.cpp @@ -75,9 +75,9 @@ falco_engine::~falco_engine() m_sources.clear(); } -std::string falco_engine::engine_version() +sinsp_version falco_engine::engine_version() { - return FALCO_ENGINE_VERSION; + return sinsp_version(FALCO_ENGINE_VERSION); } const falco_source* falco_engine::find_source(const std::string& name) const @@ -567,7 +567,7 @@ void falco_engine::describe_rule(std::string *rule, const std::vector& rule_loader::collector::rules() co void rule_loader::collector::define(configuration& cfg, engine_version_info& info) { - 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); - + auto v = falco_engine::engine_version(); + THROW(!v.compatible_with(info.version), "Rules require engine version " + + info.version.as_string() + ", but engine version is " + v.as_string(), + info.ctx); + // Store max required_engine_version - if(current_required_engine_version.check(required_engine_version)) + if(m_required_engine_version.version < info.version) { m_required_engine_version = info; } @@ -169,7 +163,7 @@ void rule_loader::collector::define(configuration& cfg, plugin_version_info& inf for (const auto& req : info.alternatives) { sinsp_version plugin_version(req.version); - THROW(!plugin_version.m_valid, + THROW(!plugin_version.is_valid(), "Invalid required version '" + req.version + "' for plugin '" + req.name + "'", info.ctx); diff --git a/userspace/engine/rule_loader_reader.cpp b/userspace/engine/rule_loader_reader.cpp index 0dad8e33..1983583c 100644 --- a/userspace/engine/rule_loader_reader.cpp +++ b/userspace/engine/rule_loader_reader.cpp @@ -20,6 +20,7 @@ limitations under the License. #include "rule_loader_reader.h" #include "falco_engine_version.h" +#include "logger.h" #define THROW(cond, err, ctx) { if ((cond)) { throw rule_loader::rule_load_exception(falco::load_result::LOAD_ERR_YAML_VALIDATE, (err), (ctx)); } } @@ -264,12 +265,17 @@ static void read_item( 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); + v.version = rule_loader::reader::get_implicit_engine_version(ver); } catch(std::exception& e) { // Convert to string - decode_val(item, "required_engine_version", v.version, ctx); + std::string ver; + decode_val(item, "required_engine_version", ver, ctx); + + v.version = sinsp_version(ver); + + THROW(!v.version.is_valid(), "Unable to parse engine version '" + ver + "' as a semver string. Expected \"x.y.z\" semver format.", ctx); } collector.define(cfg, v); diff --git a/userspace/engine/rule_loader_reader.h b/userspace/engine/rule_loader_reader.h index d455650e..378556c1 100644 --- a/userspace/engine/rule_loader_reader.h +++ b/userspace/engine/rule_loader_reader.h @@ -19,6 +19,9 @@ limitations under the License. #include "rule_loader.h" #include "rule_loader_collector.h" +#include "logger.h" +#include "version.h" +#include "falco_engine_version.h" namespace rule_loader { @@ -41,6 +44,19 @@ public: thew new definitions */ virtual bool read(configuration& cfg, collector& loader); + + /*! + \brief Engine version used to be represented as a simple progressive + number. With the new semver schema, the number now represents + the semver minor number. This function converts the legacy version + number to the new semver schema. + */ + static inline sinsp_version get_implicit_engine_version(uint32_t minor) + { + return sinsp_version(std::to_string(FALCO_ENGINE_VERSION_MAJOR) + "." + + std::to_string(minor) + "." + + std::to_string(FALCO_ENGINE_VERSION_PATCH)); + } }; }; // namespace rule_loader diff --git a/userspace/falco/grpc_server_impl.cpp b/userspace/falco/grpc_server_impl.cpp index 8230caf1..ee03e95f 100644 --- a/userspace/falco/grpc_server_impl.cpp +++ b/userspace/falco/grpc_server_impl.cpp @@ -16,6 +16,7 @@ limitations under the License. */ #include "config_falco.h" +#include "falco_engine.h" #include "falco_engine_version.h" #include "grpc_server_impl.h" #include "grpc_queue.h" @@ -79,10 +80,10 @@ void falco::grpc::server_impl::version(const context& ctx, const version::reques res.set_engine_version(FALCO_ENGINE_VERSION); res.set_engine_fields_checksum(FALCO_ENGINE_CHECKSUM); - auto engine_version = sinsp_version(FALCO_ENGINE_VERSION); - res.set_engine_major(engine_version.m_version_major); - res.set_engine_minor(engine_version.m_version_minor); - res.set_engine_patch(engine_version.m_version_patch); + auto engine_version = falco_engine::engine_version(); + res.set_engine_major(engine_version.major()); + res.set_engine_minor(engine_version.minor()); + res.set_engine_patch(engine_version.patch()); res.set_major(FALCO_VERSION_MAJOR); res.set_minor(FALCO_VERSION_MINOR);