in src/oomd/config/ConfigCompiler.cpp [104:192]
std::unique_ptr<Oomd::Engine::Ruleset> compileRuleset(
const Oomd::Config2::IR::Ruleset& ruleset,
bool dropin,
const Oomd::PluginConstructionContext& context) {
uint32_t silenced_logs = 0;
int post_action_delay = DEFAULT_POST_ACTION_DELAY;
int prekill_hook_timeout = DEFAULT_PREKILL_HOOK_TIMEOUT;
std::vector<std::unique_ptr<Oomd::Engine::DetectorGroup>> detector_groups;
std::vector<std::unique_ptr<Oomd::Engine::BasePlugin>> actions;
if (ruleset.name.empty()) {
OLOG << "Ruleset is missing name";
return nullptr;
}
// Log silencing field is optional
if (ruleset.silence_logs.size()) {
auto copy = ruleset.silence_logs;
Oomd::Util::trim(copy);
auto parts = Oomd::Util::split(copy, ',');
for (auto& part : parts) {
Oomd::Util::trim(part);
if (part == "engine") {
silenced_logs |= Oomd::Engine::LogSources::ENGINE;
} else if (part == "plugins") {
silenced_logs |= Oomd::Engine::LogSources::PLUGINS;
} else {
OLOG << "Unrecognized log source=" << part;
return nullptr;
}
}
}
if (!dropin && (ruleset.dgs.empty() || ruleset.acts.empty())) {
OLOG << "Ruleset is missing DetectorGroups or missing Actions";
return nullptr;
}
// post_action_delay field is optional
if (ruleset.post_action_delay.size()) {
post_action_delay = std::stoi(ruleset.post_action_delay);
if (post_action_delay < 0) {
OLOG << "Ruleset post_action_delay must be non-negative";
return nullptr;
}
}
// prekill_hook_timeout field is optional
if (ruleset.prekill_hook_timeout.size()) {
prekill_hook_timeout = std::stoi(ruleset.prekill_hook_timeout);
if (prekill_hook_timeout < 0) {
OLOG << "Ruleset prekill_hook_timeout must be non-negative";
return nullptr;
}
}
for (const auto& dg : ruleset.dgs) {
auto compiled_detectorgroup = compileDetectorGroup(dg, context);
if (!compiled_detectorgroup) {
return nullptr;
}
detector_groups.emplace_back(std::move(compiled_detectorgroup));
}
for (const auto& action : ruleset.acts) {
auto compiled_action =
compilePlugin<Oomd::Config2::IR::Action>(action, context);
if (!compiled_action) {
return nullptr;
}
actions.emplace_back(std::move(compiled_action));
}
return std::make_unique<Oomd::Engine::Ruleset>(
ruleset.name,
std::move(detector_groups),
std::move(actions),
ruleset.dropin.disable_on_drop_in,
ruleset.dropin.detectorgroups_enabled,
ruleset.dropin.actiongroup_enabled,
silenced_logs,
post_action_delay,
prekill_hook_timeout);
}