diff --git a/lib/icinga/apiactions.cpp b/lib/icinga/apiactions.cpp index 0d0422377..885834edc 100644 --- a/lib/icinga/apiactions.cpp +++ b/lib/icinga/apiactions.cpp @@ -288,7 +288,7 @@ Dictionary::Ptr ApiActions::RemoveAcknowledgement(const ConfigObject::Ptr& objec String removedBy (HttpUtility::GetLastParameter(params, "author")); checkable->ClearAcknowledgement(removedBy); - checkable->RemoveCommentsByType(CommentAcknowledgement, removedBy); + checkable->RemoveAckComments(removedBy); return ApiActions::CreateResult(200, "Successfully removed acknowledgement for object '" + checkable->GetName() + "'."); } diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index 83c39e923..efa9477a2 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -321,7 +321,7 @@ Checkable::ProcessingResult Checkable::ProcessCheckResult(const CheckResult::Ptr olock.Unlock(); if (remove_acknowledgement_comments) - RemoveCommentsByType(CommentAcknowledgement); + RemoveAckComments(String(), cr->GetExecutionEnd()); Dictionary::Ptr vars_after = new Dictionary({ { "state", new_state }, diff --git a/lib/icinga/checkable-comment.cpp b/lib/icinga/checkable-comment.cpp index 135f35520..71cfac619 100644 --- a/lib/icinga/checkable-comment.cpp +++ b/lib/icinga/checkable-comment.cpp @@ -19,14 +19,19 @@ void Checkable::RemoveAllComments() } } -void Checkable::RemoveCommentsByType(int type, const String& removedBy) +void Checkable::RemoveAckComments(const String& removedBy, double createdBefore) { for (const Comment::Ptr& comment : GetComments()) { - /* Do not remove persistent comments from an acknowledgement */ - if (comment->GetEntryType() == CommentAcknowledgement && comment->GetPersistent()) - continue; + if (comment->GetEntryType() == CommentAcknowledgement) { + /* Do not remove persistent comments from an acknowledgement */ + if (comment->GetPersistent()) { + continue; + } + + if (comment->GetEntryTime() > createdBefore) { + continue; + } - if (comment->GetEntryType() == type) { { ObjectLock oLock (comment); comment->SetRemovedBy(removedBy); diff --git a/lib/icinga/checkable.hpp b/lib/icinga/checkable.hpp index 6a46425a9..3d48b1445 100644 --- a/lib/icinga/checkable.hpp +++ b/lib/icinga/checkable.hpp @@ -17,6 +17,7 @@ #include #include #include +#include namespace icinga { @@ -156,7 +157,7 @@ public: /* Comments */ void RemoveAllComments(); - void RemoveCommentsByType(int type, const String& removedBy = String()); + void RemoveAckComments(const String& removedBy = String(), double createdBefore = std::numeric_limits::max()); std::set GetComments() const; Comment::Ptr GetLastComment() const; diff --git a/lib/icinga/externalcommandprocessor.cpp b/lib/icinga/externalcommandprocessor.cpp index f781a3412..9850da030 100644 --- a/lib/icinga/externalcommandprocessor.cpp +++ b/lib/icinga/externalcommandprocessor.cpp @@ -665,7 +665,7 @@ void ExternalCommandProcessor::RemoveSvcAcknowledgement(double, const std::vecto service->ClearAcknowledgement(""); } - service->RemoveCommentsByType(CommentAcknowledgement); + service->RemoveAckComments(); } void ExternalCommandProcessor::AcknowledgeHostProblem(double, const std::vector& arguments) @@ -738,7 +738,7 @@ void ExternalCommandProcessor::RemoveHostAcknowledgement(double, const std::vect ObjectLock olock(host); host->ClearAcknowledgement(""); } - host->RemoveCommentsByType(CommentAcknowledgement); + host->RemoveAckComments(); } void ExternalCommandProcessor::EnableHostgroupSvcChecks(double, const std::vector& arguments)