]> granicus.if.org Git - icinga2/commitdiff
Make sure that notified users are stored in state file
authorMichael Friedrich <michael.friedrich@netways.de>
Wed, 12 Nov 2014 19:32:34 +0000 (20:32 +0100)
committerMichael Friedrich <michael.friedrich@netways.de>
Fri, 14 Nov 2014 17:11:58 +0000 (18:11 +0100)
refs #7579

lib/icinga/notification.cpp
lib/icinga/notification.hpp
lib/icinga/notification.ti

index 930cdde02f4b611b346b03d87ec259473ad3579b..1c21c08b7a96783220081f31676bfa44954cba43 100644 (file)
@@ -319,6 +319,7 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe
        Service::OnNotificationSendStart(this, checkable, allUsers, type, cr, author, text);
 
        std::set<User::Ptr> 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) {
index a10f181d952d89c47c4496bf00421b31a0495eaa..2bf6c095760771affb588bf88edd44b3e8cd7459 100644 (file)
@@ -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<String> 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>& checkable, const String& name, const Dictionary::Ptr& locals, const ApplyRule& rule);
index c0e3591b25f9be0b97be35a0d617b50bea5587c1..117c6b32040405638dc31ed5c918ce0b29d9a777 100644 (file)
@@ -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;