diff --git a/lib/icinga/notification.cpp b/lib/icinga/notification.cpp index 930cdde02..1c21c08b7 100644 --- a/lib/icinga/notification.cpp +++ b/lib/icinga/notification.cpp @@ -319,6 +319,7 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe Service::OnNotificationSendStart(this, checkable, allUsers, type, cr, author, text); std::set allNotifiedUsers; + Array::Ptr notifiedUsers = GetNotifiedUsers(); BOOST_FOREACH(const User::Ptr& user, allUsers) { String userName = user->GetName(); @@ -337,7 +338,7 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe /* on recovery, check if user was notified before */ if (type == NotificationRecovery) { - if (m_NotifiedUsers.find(userName) == m_NotifiedUsers.end()) { + if (!notifiedUsers->Contains(userName)) { Log(LogNotice, "Notification") << "We did not notify user '" << userName << "' before. Not sending recovery notification."; continue; @@ -353,12 +354,13 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe allNotifiedUsers.insert(user); /* store all notified users for later recovery checks */ - m_NotifiedUsers.insert(userName); + if (!notifiedUsers->Contains(userName)) + notifiedUsers->Add(userName); } /* if this was a recovery notification, reset all notified users */ if (type == NotificationRecovery) - ResetNotifiedUsers(); + notifiedUsers->Clear(); /* used in db_ido for notification history */ Service::OnNotificationSentToAllUsers(this, checkable, allNotifiedUsers, type, cr, author, text); @@ -446,11 +448,6 @@ void Notification::ExecuteNotificationHelper(NotificationType type, const User:: } } -void Notification::ResetNotifiedUsers(void) -{ - m_NotifiedUsers.clear(); -} - int icinga::ServiceStateToFilter(ServiceState state) { switch (state) { diff --git a/lib/icinga/notification.hpp b/lib/icinga/notification.hpp index a10f181d9..2bf6c0957 100644 --- a/lib/icinga/notification.hpp +++ b/lib/icinga/notification.hpp @@ -98,7 +98,6 @@ public: bool CheckNotificationUserFilters(NotificationType type, const User::Ptr& user, bool force); - void ResetNotifiedUsers(void); Endpoint::Ptr GetCommandEndpoint(void) const; static String NotificationTypeToString(NotificationType type); @@ -115,8 +114,6 @@ protected: virtual void Stop(void); private: - std::set m_NotifiedUsers; - void ExecuteNotificationHelper(NotificationType type, const User::Ptr& user, const CheckResult::Ptr& cr, bool force, const String& author = "", const String& text = ""); static void EvaluateApplyRuleOneInstance(const intrusive_ptr& checkable, const String& name, const Dictionary::Ptr& locals, const ApplyRule& rule); diff --git a/lib/icinga/notification.ti b/lib/icinga/notification.ti index c0e3591b2..117c6b320 100644 --- a/lib/icinga/notification.ti +++ b/lib/icinga/notification.ti @@ -47,6 +47,10 @@ class Notification : CustomVarObject < NotificationNameComposer [config, protected] String host_name; [config, protected] String service_name; + [state] Array::Ptr notified_users { + default {{{ return new Array(); }}} + }; + [state] double last_notification; [state, set_protected] double next_notification (NextNotificationRaw); [state, set_protected] Value notification_number;