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 <susinilorenzo1@gmail.com>
This commit is contained in:
Lorenzo Susini 2023-09-26 10:22:36 +00:00 committed by poiana
parent cd6cb14c08
commit f8cbeaaa9b
4 changed files with 32 additions and 9 deletions

View File

@ -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)
{
}

View File

@ -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;
};
/*!

View File

@ -145,11 +145,19 @@ const indexed_vector<rule_loader::rule_info>& 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;
}

View File

@ -19,6 +19,7 @@ limitations under the License.
#include <vector>
#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)); } }
@ -256,7 +257,21 @@ 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);
}
collector.define(cfg, v);
}
else if(item["required_plugin_versions"].IsDefined())