mirror of
https://github.com/falcosecurity/falco.git
synced 2025-08-28 10:51:24 +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)
|
||||
: ctx(ctx), version(0)
|
||||
: ctx(ctx)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
/*!
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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())
|
||||
|
Loading…
Reference in New Issue
Block a user