]> granicus.if.org Git - icinga2/commitdiff
ido: Implement contactgroup members.
authorGunnar Beutner <gunnar.beutner@netways.de>
Mon, 5 Aug 2013 07:49:19 +0000 (09:49 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Mon, 5 Aug 2013 07:49:19 +0000 (09:49 +0200)
lib/icinga/usergroup.cpp
lib/icinga/usergroup.h
lib/ido/hostgroupdbobject.cpp
lib/ido/servicegroupdbobject.cpp
lib/ido/usergroupdbobject.cpp
lib/ido/usergroupdbobject.h

index 8af17a911a7cba8885a0b025ae87aaf0ab4b520c..915d6b89bc881c00c8cbad64b16a144aa48d5092 100644 (file)
@@ -32,6 +32,7 @@ static boost::mutex l_Mutex;
 static std::map<String, std::vector<User::WeakPtr> > l_MembersCache;
 static bool l_MembersCacheNeedsUpdate = false;
 static Timer::Ptr l_MembersCacheTimer;
+boost::signals2::signal<void (void)> UserGroup::OnMembersChanged;
 
 REGISTER_TYPE(UserGroup);
 
@@ -136,6 +137,10 @@ void UserGroup::RefreshMembersCache(void)
                }
        }
 
-       boost::mutex::scoped_lock lock(l_Mutex);
-       l_MembersCache.swap(newMembersCache);
+       {
+               boost::mutex::scoped_lock lock(l_Mutex);
+               l_MembersCache.swap(newMembersCache);
+       }
+
+       OnMembersChanged();
 }
index 549da006034dff457c6ffe7f0e808bc42fff9074..b4e9a56d56a9d4af0f19ddf3980f71f55bcfa51b 100644 (file)
@@ -48,6 +48,8 @@ public:
 
        static void InvalidateMembersCache(void);
 
+       static boost::signals2::signal<void (void)> OnMembersChanged;
+
 protected:
        virtual void OnRegistrationCompleted(void);
 
index a97580a106912917335aee234e6d8de086217557..fab1b7a368d04213220151e014a80f39a5d4dcc7 100644 (file)
@@ -23,7 +23,6 @@
 #include "icinga/hostgroup.h"
 #include "base/objectlock.h"
 #include "base/initialize.h"
-#include "base/logger_fwd.h"
 #include "base/dynamictype.h"
 #include <boost/foreach.hpp>
 
index 984b38ff640cd21df9bb826d737b96488cb8a713..e527c264b6235fedf437796a9792ddfbb2a75533 100644 (file)
@@ -54,7 +54,6 @@ Dictionary::Ptr ServiceGroupDbObject::GetStatusFields(void) const
        return Empty;
 }
 
-
 void ServiceGroupDbObject::OnConfigUpdate(void)
 {
        MembersChangedHandler();
index 3d45d2e6d3f6798246da3803894b36abc7092d6d..cada32fc4e4b9f066b447bb77acff72082a40f9d 100644 (file)
 #include "ido/dbvalue.h"
 #include "icinga/usergroup.h"
 #include "base/objectlock.h"
+#include "base/initialize.h"
+#include "base/dynamictype.h"
 #include <boost/foreach.hpp>
 
 using namespace icinga;
 
 REGISTER_DBTYPE(UserGroup, "contactgroup", DbObjectTypeContactGroup, "contactgroup_object_id", UserGroupDbObject);
+INITIALIZE_ONCE(UserGroupDbObject, &UserGroupDbObject::StaticInitialize);
 
 UserGroupDbObject::UserGroupDbObject(const DbType::Ptr& type, const String& name1, const String& name2)
        : DbObject(type, name1, name2)
@@ -46,3 +49,33 @@ Dictionary::Ptr UserGroupDbObject::GetStatusFields(void) const
 {
        return Empty;
 }
+
+void UserGroupDbObject::OnConfigUpdate(void)
+{
+       MembersChangedHandler();
+}
+
+void UserGroupDbObject::MembersChangedHandler(void)
+{
+       DbQuery query1;
+       query1.Table = DbType::GetByName("UserGroup")->GetTable() + "_members";
+       query1.Type = DbQueryDelete;
+       query1.WhereCriteria = boost::make_shared<Dictionary>();
+       query1.WhereCriteria->Set("instance_id", 0);
+       OnQuery(query1);
+
+       BOOST_FOREACH(const DynamicObject::Ptr& object, DynamicType::GetObjects("UserGroup")) {
+               UserGroup::Ptr ug = static_pointer_cast<UserGroup>(object);
+
+               BOOST_FOREACH(const User::Ptr& user, ug->GetMembers()) {
+                       DbQuery query2;
+                       query2.Table = DbType::GetByName("UserGroup")->GetTable() + "_members";
+                       query2.Type = DbQueryInsert;
+                       query2.Fields = boost::make_shared<Dictionary>();
+                       query2.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */
+                       query2.Fields->Set("contactgroup_id", DbValue::FromObjectInsertID(ug));
+                       query2.Fields->Set("contact_object_id", user);
+                       OnQuery(query2);
+               }
+       }
+}
index 84123eb1b16f329b86b6bc650f0c4adc91209a46..4e5de55d1fd5ba4b01b47f1558e0cca0981a8cfc 100644 (file)
@@ -38,8 +38,16 @@ public:
 
        UserGroupDbObject(const DbType::Ptr& type, const String& name1, const String& name2);
 
+       static void StaticInitialize(void);
+
        virtual Dictionary::Ptr GetConfigFields(void) const;
        virtual Dictionary::Ptr GetStatusFields(void) const;
+
+protected:
+       virtual void OnConfigUpdate(void);
+
+private:
+       static void MembersChangedHandler(void);
 };
 
 }