From a262d189218ee599e0f8fa90a8f168e1553734b6 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Mon, 5 Oct 2020 15:12:42 +0200 Subject: [PATCH] Introduce Downtime#config_owner_hash refs #8309 --- lib/icinga/downtime.cpp | 6 ++++++ lib/icinga/downtime.ti | 1 + lib/icinga/scheduleddowntime.cpp | 20 ++++++++++++++++++++ lib/icinga/scheduleddowntime.hpp | 1 + 4 files changed, 28 insertions(+) diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index 9c618b786..668687aae 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -238,6 +238,12 @@ Downtime::Ptr Downtime::AddDowntime(const Checkable::Ptr& checkable, const Strin if (localZone) { attrs->Set("authoritative_zone", localZone->GetName()); } + + auto sd (ScheduledDowntime::GetByName(scheduledDowntime)); + + if (sd) { + attrs->Set("config_owner_hash", sd->HashDowntimeOptions()); + } } Host::Ptr host; diff --git a/lib/icinga/downtime.ti b/lib/icinga/downtime.ti index a55942fb0..fa02f2592 100644 --- a/lib/icinga/downtime.ti +++ b/lib/icinga/downtime.ti @@ -69,6 +69,7 @@ class Downtime : ConfigObject < DowntimeNameComposer [state] int legacy_id; [state] bool was_cancelled; [config] String config_owner; + [config] String config_owner_hash; [config] String authoritative_zone; }; diff --git a/lib/icinga/scheduleddowntime.cpp b/lib/icinga/scheduleddowntime.cpp index 2467ffce2..93b34a154 100644 --- a/lib/icinga/scheduleddowntime.cpp +++ b/lib/icinga/scheduleddowntime.cpp @@ -6,13 +6,17 @@ #include "icinga/downtime.hpp" #include "icinga/service.hpp" #include "base/timer.hpp" +#include "base/tlsutility.hpp" #include "base/configtype.hpp" #include "base/utility.hpp" #include "base/objectlock.hpp" +#include "base/object-packer.hpp" +#include "base/serializer.hpp" #include "base/convert.hpp" #include "base/logger.hpp" #include "base/exception.hpp" #include +#include using namespace icinga; @@ -333,6 +337,22 @@ void ScheduledDowntime::ValidateChildOptions(const Lazy& lvalue, const Va } } +static const std::set l_SDDowntimeOptions ({ + "author", "child_options", "comment", "duration", "fixed", "ranges", "vars" +}); + +String ScheduledDowntime::HashDowntimeOptions() +{ + Dictionary::Ptr allOpts = Serialize(this, FAConfig); + Dictionary::Ptr opts = new Dictionary(); + + for (auto& opt : l_SDDowntimeOptions) { + opts->Set(opt, allOpts->Get(opt)); + } + + return SHA256(PackObject(opts)); +} + bool ScheduledDowntime::AllConfigIsLoaded() { return m_AllConfigLoaded.load(); diff --git a/lib/icinga/scheduleddowntime.hpp b/lib/icinga/scheduleddowntime.hpp index 90e12d240..3c1a23d47 100644 --- a/lib/icinga/scheduleddowntime.hpp +++ b/lib/icinga/scheduleddowntime.hpp @@ -35,6 +35,7 @@ public: void ValidateRanges(const Lazy& lvalue, const ValidationUtils& utils) override; void ValidateChildOptions(const Lazy& lvalue, const ValidationUtils& utils) override; + String HashDowntimeOptions(); protected: void OnAllConfigLoaded() override;