33//
44// This product includes software developed at Datadog
55// (https://www.datadoghq.com/). Copyright 2021 Datadog, Inc.
6- #include < algorithm>
76#include < atomic>
87#include < memory>
98#include < spdlog/spdlog.h>
1413#include " json_helper.hpp"
1514#include " metrics.hpp"
1615#include " parameter_view.hpp"
16+ #include " remote_config/changeset.hpp"
17+ #include " remote_config/listeners/config_aggregators/asm_aggregator.hpp"
1718#include " std_logging.hpp"
1819#include " subscriber/waf.hpp"
1920
21+ namespace {
22+ using dds::remote_config::asm_aggregator;
23+ using dds::remote_config::changeset;
24+
25+ changeset build_changeset (const rapidjson::Value &doc)
26+ {
27+ changeset changeset;
28+ // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-array-to-pointer-decay)
29+ if (doc.HasMember (asm_aggregator::ASM_ADDED)) {
30+ // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-array-to-pointer-decay)
31+ for (const auto &entry : doc[asm_aggregator::ASM_ADDED].GetObject ()) {
32+ changeset.added .emplace (
33+ entry.name .GetString (), dds::json_to_parameter (entry.value ));
34+ }
35+ }
36+
37+ // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-array-to-pointer-decay)
38+ if (doc.HasMember (asm_aggregator::ASM_REMOVED)) {
39+ // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-array-to-pointer-decay)
40+ const auto &removed = doc[asm_aggregator::ASM_REMOVED];
41+ for (const auto &entry : removed.GetArray ()) {
42+ changeset.removed .emplace (entry.GetString ());
43+ }
44+ }
45+
46+ return changeset;
47+ }
48+ } // namespace
2049namespace dds {
2150
2251void engine::subscribe (std::unique_ptr<subscriber> sub)
@@ -25,16 +54,18 @@ void engine::subscribe(std::unique_ptr<subscriber> sub)
2554}
2655
2756void engine::update (
28- engine_ruleset &ruleset , metrics::telemetry_submitter &submit_metric)
57+ const rapidjson::Document &doc , metrics::telemetry_submitter &submit_metric)
2958{
3059 std::vector<std::unique_ptr<subscriber>> new_subscribers;
3160 auto old_common =
3261 std::atomic_load_explicit (&common_, std::memory_order_acquire);
3362 new_subscribers.reserve (old_common->subscribers .size ());
34- dds::parameter param = json_to_parameter (ruleset. get_document () );
63+ changeset const changeset = build_changeset (doc );
3564 for (auto &sub : old_common->subscribers ) {
3665 try {
37- new_subscribers.emplace_back (sub->update (param, submit_metric));
66+ std::unique_ptr<subscriber> new_sub =
67+ sub->update (changeset, submit_metric);
68+ new_subscribers.emplace_back (std::move (new_sub));
3869 } catch (const std::exception &e) {
3970 SPDLOG_WARN (" Failed to update subscriber {}: {}" , sub->get_name (),
4071 e.what ());
@@ -127,15 +158,24 @@ std::unique_ptr<engine> engine::from_settings(
127158 metrics::telemetry_submitter &msubmitter)
128159{
129160 auto &&rules_path = eng_settings.rules_file_or_default ();
130- auto ruleset = engine_ruleset::from_path (rules_path);
161+ auto ruleset = read_file (rules_path);
162+
163+ rapidjson::Document doc;
164+ rapidjson::ParseResult const result =
165+ doc.Parse (ruleset.data (), ruleset.size ());
166+ if ((result == nullptr ) || !doc.IsObject ()) {
167+ throw parsing_error (" invalid json rule" );
168+ }
169+ dds::parameter ruleset_param = json_to_parameter (doc);
170+
131171 std::unique_ptr<engine> engine_ptr{
132172 engine::create (eng_settings.trace_rate_limit )};
133173
134174 try {
135175 SPDLOG_DEBUG (" Will load WAF rules from {}" , rules_path);
136176 // may throw std::exception
137- auto waf =
138- waf::instance::from_settings ( eng_settings, ruleset , msubmitter);
177+ auto waf = waf::instance::from_settings (
178+ eng_settings, std::move (ruleset_param) , msubmitter);
139179 engine_ptr->subscribe (std::move (waf));
140180 } catch (...) {
141181 DD_STDLOG (DD_STDLOG_WAF_INIT_FAILED, rules_path);
0 commit comments