mirror of
https://github.com/falcosecurity/falco.git
synced 2025-08-28 19:00:48 +00:00
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:
parent
cd6cb14c08
commit
f8cbeaaa9b
@ -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)
|
rule_loader::engine_version_info::engine_version_info(context &ctx)
|
||||||
: ctx(ctx), version(0)
|
: ctx(ctx)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -298,7 +298,7 @@ namespace rule_loader
|
|||||||
*/
|
*/
|
||||||
struct engine_version_info
|
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(context &ctx);
|
||||||
~engine_version_info() = default;
|
~engine_version_info() = default;
|
||||||
engine_version_info(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;
|
engine_version_info& operator = (const engine_version_info&) = default;
|
||||||
|
|
||||||
context ctx;
|
context ctx;
|
||||||
uint32_t version;
|
std::string version;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -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)
|
void rule_loader::collector::define(configuration& cfg, engine_version_info& info)
|
||||||
{
|
{
|
||||||
auto v = falco_engine::engine_version();
|
auto engine_version = sinsp_version(falco_engine::engine_version());
|
||||||
THROW(v < info.version, "Rules require engine version "
|
sinsp_version required_engine_version(info.version);
|
||||||
+ std::to_string(info.version) + ", but engine version is " + std::to_string(v),
|
THROW(!required_engine_version.m_valid, "Unable to parse " + info.version
|
||||||
info.ctx);
|
+ " as a semver string. Expected \"x.y.z\" semver format.", info.ctx);
|
||||||
if(m_required_engine_version.version < info.version)
|
|
||||||
|
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;
|
m_required_engine_version = info;
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ limitations under the License.
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "rule_loader_reader.h"
|
#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)); } }
|
#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::context ctx(item, rule_loader::context::REQUIRED_ENGINE_VERSION, "", parent);
|
||||||
rule_loader::engine_version_info v(ctx);
|
rule_loader::engine_version_info v(ctx);
|
||||||
|
|
||||||
decode_val(item, "required_engine_version", v.version, 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);
|
collector.define(cfg, v);
|
||||||
}
|
}
|
||||||
else if(item["required_plugin_versions"].IsDefined())
|
else if(item["required_plugin_versions"].IsDefined())
|
||||||
|
Loading…
Reference in New Issue
Block a user