diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index 914531339..8e5ccabba 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -246,6 +246,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 ea3c1a5ee..a015942d3 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; [no_user_view, no_user_modify] String removed_by; diff --git a/lib/icinga/scheduleddowntime.cpp b/lib/icinga/scheduleddowntime.cpp index ae38ca9b6..282700a83 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;