diff --git a/doc/12-icinga2-api.md b/doc/12-icinga2-api.md index f74591b7a..de12880ba 100644 --- a/doc/12-icinga2-api.md +++ b/doc/12-icinga2-api.md @@ -1204,7 +1204,11 @@ been removed the next notification will be sent again. Send a `POST` request to the URL endpoint `/v1/actions/remove-acknowledgement`. -A [filter](12-icinga2-api.md#icinga2-api-filters) must be provided. The valid types for this action are `Host` and `Service`. + Parameter | Type | Description + ----------|--------|-------------- + author | String | **Optional.** Name of the removal requestor. + +In addition to these parameters a [filter](12-icinga2-api.md#icinga2-api-filters) must be provided. The valid types for this action are `Host` and `Service`. The example removes all service acknowledgements: @@ -1272,7 +1276,11 @@ Icinga 2 when [adding a comment](12-icinga2-api.md#icinga2-api-actions-add-comme Send a `POST` request to the URL endpoint `/v1/actions/remove-comment`. -A [filter](12-icinga2-api.md#icinga2-api-filters) must be provided. The valid types for this action are `Host`, `Service` and `Comment`. + Parameter | Type | Description + ----------|--------|-------------- + author | String | **Optional.** Name of the removal requestor. + +In addition to these parameters a [filter](12-icinga2-api.md#icinga2-api-filters) must be provided. The valid types for this action are `Host`, `Service` and `Comment`. Example for a simple filter using the `comment` URL parameter: diff --git a/lib/icinga/apiactions.cpp b/lib/icinga/apiactions.cpp index 71ccea0b1..c4a3edb6a 100644 --- a/lib/icinga/apiactions.cpp +++ b/lib/icinga/apiactions.cpp @@ -245,7 +245,7 @@ Dictionary::Ptr ApiActions::RemoveAcknowledgement(const ConfigObject::Ptr& objec + object->GetName() + "."); checkable->ClearAcknowledgement(); - checkable->RemoveCommentsByType(CommentAcknowledgement); + checkable->RemoveCommentsByType(CommentAcknowledgement, HttpUtility::GetLastParameter(params, "author")); return ApiActions::CreateResult(200, "Successfully removed acknowledgement for object '" + checkable->GetName() + "'."); } @@ -280,12 +280,18 @@ Dictionary::Ptr ApiActions::AddComment(const ConfigObject::Ptr& object, Dictionary::Ptr ApiActions::RemoveComment(const ConfigObject::Ptr& object, const Dictionary::Ptr& params) { + auto author (HttpUtility::GetLastParameter(params, "author")); Checkable::Ptr checkable = dynamic_pointer_cast(object); if (checkable) { std::set comments = checkable->GetComments(); for (const Comment::Ptr& comment : comments) { + { + ObjectLock oLock (comment); + comment->SetRemovedBy(author); + } + Comment::RemoveComment(comment->GetName()); } @@ -297,6 +303,11 @@ Dictionary::Ptr ApiActions::RemoveComment(const ConfigObject::Ptr& object, if (!comment) return ApiActions::CreateResult(404, "Cannot remove non-existent comment object."); + { + ObjectLock oLock (comment); + comment->SetRemovedBy(author); + } + String commentName = comment->GetName(); Comment::RemoveComment(commentName); diff --git a/lib/icinga/checkable-comment.cpp b/lib/icinga/checkable-comment.cpp index b2184e1ff..88f5a5207 100644 --- a/lib/icinga/checkable-comment.cpp +++ b/lib/icinga/checkable-comment.cpp @@ -18,15 +18,21 @@ void Checkable::RemoveAllComments() } } -void Checkable::RemoveCommentsByType(int type) +void Checkable::RemoveCommentsByType(int type, const String& removedBy) { for (const Comment::Ptr& comment : GetComments()) { /* Do not remove persistent comments from an acknowledgement */ if (comment->GetEntryType() == CommentAcknowledgement && comment->GetPersistent()) continue; - if (comment->GetEntryType() == type) + if (comment->GetEntryType() == type) { + { + ObjectLock oLock (comment); + comment->SetRemovedBy(removedBy); + } + Comment::RemoveComment(comment->GetName()); + } } } diff --git a/lib/icinga/checkable.hpp b/lib/icinga/checkable.hpp index 498cb1d8f..a5d34725b 100644 --- a/lib/icinga/checkable.hpp +++ b/lib/icinga/checkable.hpp @@ -133,7 +133,7 @@ public: /* Comments */ void RemoveAllComments(); - void RemoveCommentsByType(int type); + void RemoveCommentsByType(int type, const String& removedBy = String()); std::set GetComments() const; void RegisterComment(const Comment::Ptr& comment); diff --git a/lib/icinga/comment.ti b/lib/icinga/comment.ti index 9e2a4f09a..678bcabd8 100644 --- a/lib/icinga/comment.ti +++ b/lib/icinga/comment.ti @@ -71,6 +71,8 @@ class Comment : ConfigObject < CommentNameComposer [config] bool persistent; [config] Timestamp expire_time; [state] int legacy_id; + + [no_user_view, no_user_modify] String removed_by; }; } diff --git a/lib/icingadb/icingadb-objects.cpp b/lib/icingadb/icingadb-objects.cpp index 0cbc96d23..8b0dcf18f 100644 --- a/lib/icingadb/icingadb-objects.cpp +++ b/lib/icingadb/icingadb-objects.cpp @@ -1489,7 +1489,7 @@ void IcingaDB::SendRemovedComment(const Comment::Ptr& comment) "comment_id", GetObjectIdentifier(comment), "environment_id", SHA1(GetEnvironment()), "entry_time", Convert::ToString(TimestampToMilliseconds(comment->GetEntryTime())), - "author", Utility::ValidateUTF8(comment->GetAuthor()), + "author", Utility::ValidateUTF8(comment->GetRemovedBy()), "comment", Utility::ValidateUTF8(comment->GetText()), "entry_type", Convert::ToString(comment->GetEntryType()), "is_persistent", Convert::ToString((unsigned short)comment->GetPersistent()),