]> granicus.if.org Git - icinga2/commitdiff
DB IDO: Fix group membership updates for runtime created objects
authorMichael Friedrich <michael.friedrich@netways.de>
Wed, 11 Nov 2015 10:55:20 +0000 (11:55 +0100)
committerMichael Friedrich <michael.friedrich@netways.de>
Wed, 11 Nov 2015 11:31:52 +0000 (12:31 +0100)
fixes #10604

lib/db_ido/hostdbobject.cpp
lib/db_ido/hostgroupdbobject.cpp
lib/db_ido/hostgroupdbobject.hpp
lib/db_ido/servicedbobject.cpp
lib/db_ido/servicegroupdbobject.cpp
lib/db_ido/servicegroupdbobject.hpp
lib/db_ido/userdbobject.cpp
lib/db_ido/usergroupdbobject.cpp
lib/db_ido/usergroupdbobject.hpp

index 20a3fb3d214f844277d2942b8388add5272bdeb5..f3c47ab1808c175ff3f06857375ceb04ba00b663 100644 (file)
@@ -18,6 +18,7 @@
  ******************************************************************************/
 
 #include "db_ido/hostdbobject.hpp"
+#include "db_ido/hostgroupdbobject.hpp"
 #include "db_ido/dbtype.hpp"
 #include "db_ido/dbvalue.hpp"
 #include "db_ido/dbevents.hpp"
@@ -180,6 +181,36 @@ void HostDbObject::OnConfigUpdate(void)
 {
        Host::Ptr host = static_pointer_cast<Host>(GetObject());
 
+       /* groups */
+       Array::Ptr groups = host->GetGroups();
+
+       if (groups) {
+               ObjectLock olock(groups);
+               BOOST_FOREACH(const String& groupName, groups) {
+                       HostGroup::Ptr group = HostGroup::GetByName(groupName);
+
+                       DbQuery query1;
+                       query1.Table = DbType::GetByName("HostGroup")->GetTable() + "_members";
+                       query1.Type = DbQueryDelete;
+                       query1.Category = DbCatConfig;
+                       query1.WhereCriteria = new Dictionary();
+                       query1.WhereCriteria->Set("instance_id", 0); /* DbConnection class fills in real ID */
+                       query1.WhereCriteria->Set("hostgroup_id", DbValue::FromObjectInsertID(group));
+                       query1.WhereCriteria->Set("host_object_id", host);
+                       OnQuery(query1);
+
+                       DbQuery query2;
+                       query2.Table = DbType::GetByName("HostGroup")->GetTable() + "_members";
+                       query2.Type = DbQueryInsert;
+                       query2.Category = DbCatConfig;
+                       query2.Fields = new Dictionary();
+                       query2.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */
+                       query2.Fields->Set("hostgroup_id", DbValue::FromObjectInsertID(group));
+                       query2.Fields->Set("host_object_id", host);
+                       OnQuery(query2);
+               }
+       }
+
        /* parents */
        BOOST_FOREACH(const Checkable::Ptr& checkable, host->GetParents()) {
                Host::Ptr parent = dynamic_pointer_cast<Host>(checkable);
index 8a9ce1cb3610102e4ed2c5199cacf97bd20e3eae..731d1ed4fbb92506838e60419d2551d9c2369742 100644 (file)
@@ -50,29 +50,3 @@ Dictionary::Ptr HostGroupDbObject::GetStatusFields(void) const
 {
        return Empty;
 }
-
-void HostGroupDbObject::OnConfigUpdate(void)
-{
-       HostGroup::Ptr group = static_pointer_cast<HostGroup>(GetObject());
-
-       DbQuery query1;
-       query1.Table = DbType::GetByName("HostGroup")->GetTable() + "_members";
-       query1.Type = DbQueryDelete;
-       query1.Category = DbCatConfig;
-       query1.WhereCriteria = new Dictionary();
-       query1.WhereCriteria->Set("instance_id", 0); /* DbConnection class fills in real ID */
-       query1.WhereCriteria->Set("hostgroup_id", DbValue::FromObjectInsertID(group));
-       OnQuery(query1);
-
-       BOOST_FOREACH(const Host::Ptr& host, group->GetMembers()) {
-               DbQuery query2;
-               query2.Table = DbType::GetByName("HostGroup")->GetTable() + "_members";
-               query2.Type = DbQueryInsert;
-               query2.Category = DbCatConfig;
-               query2.Fields = new Dictionary();
-               query2.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */
-               query2.Fields->Set("hostgroup_id", DbValue::FromObjectInsertID(group));
-               query2.Fields->Set("host_object_id", host);
-               OnQuery(query2);
-       }
-}
index 4d092b8d29a8f54cd9dbddea981c70d8d9af66a7..6c447ac0a86ac45824c3e39ff31ecbdca46874e4 100644 (file)
@@ -42,9 +42,6 @@ public:
        virtual Dictionary::Ptr GetConfigFields(void) const override;
        virtual Dictionary::Ptr GetStatusFields(void) const override;
 
-protected:
-       virtual void OnConfigUpdate(void) override;
-
 private:
        static void MembersChangedHandler(const HostGroup::Ptr& hgfilter);
 };
index 1894a72217f7b28972b535fb60d80b2377e0ae7e..e5269151efe185562716a961a9ffa305ab8dca5d 100644 (file)
@@ -18,6 +18,7 @@
  ******************************************************************************/
 
 #include "db_ido/servicedbobject.hpp"
+#include "db_ido/servicegroupdbobject.hpp"
 #include "db_ido/dbtype.hpp"
 #include "db_ido/dbvalue.hpp"
 #include "db_ido/dbevents.hpp"
@@ -179,6 +180,36 @@ void ServiceDbObject::OnConfigUpdate(void)
 {
        Service::Ptr service = static_pointer_cast<Service>(GetObject());
 
+       /* groups */
+       Array::Ptr groups = service->GetGroups();
+
+       if (groups) {
+               ObjectLock olock(groups);
+               BOOST_FOREACH(const String& groupName, groups) {
+                       ServiceGroup::Ptr group = ServiceGroup::GetByName(groupName);
+
+                       DbQuery query1;
+                       query1.Table = DbType::GetByName("ServiceGroup")->GetTable() + "_members";
+                       query1.Type = DbQueryDelete;
+                       query1.Category = DbCatConfig;
+                       query1.WhereCriteria = new Dictionary();
+                       query1.WhereCriteria->Set("instance_id", 0); /* DbConnection class fills in real ID */
+                       query1.WhereCriteria->Set("servicegroup_id", DbValue::FromObjectInsertID(group));
+                       query1.WhereCriteria->Set("service_object_id", service);
+                       OnQuery(query1);
+
+                       DbQuery query2;
+                       query2.Table = DbType::GetByName("ServiceGroup")->GetTable() + "_members";
+                       query2.Type = DbQueryInsert;
+                       query2.Category = DbCatConfig;
+                       query2.Fields = new Dictionary();
+                       query2.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */
+                       query2.Fields->Set("servicegroup_id", DbValue::FromObjectInsertID(group));
+                       query2.Fields->Set("service_object_id", service);
+                       OnQuery(query2);
+               }
+       }
+
        /* service dependencies */
        Log(LogDebug, "ServiceDbObject")
            << "service dependencies for '" << service->GetName() << "'";
index 3d5f92baa18c3f532ca809ddd750d5b338ddf82a..c96e0666582e7ad1198f7b895664d15aa10d9c28 100644 (file)
@@ -49,29 +49,3 @@ Dictionary::Ptr ServiceGroupDbObject::GetStatusFields(void) const
 {
        return Empty;
 }
-
-void ServiceGroupDbObject::OnConfigUpdate(void)
-{
-       ServiceGroup::Ptr group = static_pointer_cast<ServiceGroup>(GetObject());
-
-       DbQuery query1;
-       query1.Table = DbType::GetByName("ServiceGroup")->GetTable() + "_members";
-       query1.Type = DbQueryDelete;
-       query1.Category = DbCatConfig;
-       query1.WhereCriteria = new Dictionary();
-       query1.WhereCriteria->Set("instance_id", 0); /* DbConnection class fills in real ID */
-       query1.WhereCriteria->Set("servicegroup_id", DbValue::FromObjectInsertID(group));
-       OnQuery(query1);
-
-       BOOST_FOREACH(const Service::Ptr& service, group->GetMembers()) {
-               DbQuery query2;
-               query2.Table = DbType::GetByName("ServiceGroup")->GetTable() + "_members";
-               query2.Type = DbQueryInsert;
-               query2.Category = DbCatConfig;
-               query2.Fields = new Dictionary();
-               query2.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */
-               query2.Fields->Set("servicegroup_id", DbValue::FromObjectInsertID(group));
-               query2.Fields->Set("service_object_id", service);
-               OnQuery(query2);
-       }
-}
index 99f304b705995031c0385f9209959e5d699325d5..35a9636f0fcc211c6a20078bbf8d01e562731935 100644 (file)
@@ -41,9 +41,6 @@ public:
 
        virtual Dictionary::Ptr GetConfigFields(void) const override;
        virtual Dictionary::Ptr GetStatusFields(void) const override;
-
-protected:
-       virtual void OnConfigUpdate(void) override;
 };
 
 }
index 1e67a3e12315de48fb74fe61f29af971f1102cac..c9199db61a2a1dac124c3cbe628f591c6a459242 100644 (file)
@@ -18,6 +18,7 @@
  ******************************************************************************/
 
 #include "db_ido/userdbobject.hpp"
+#include "db_ido/usergroupdbobject.hpp"
 #include "db_ido/dbtype.hpp"
 #include "db_ido/dbvalue.hpp"
 #include "icinga/user.hpp"
@@ -80,6 +81,36 @@ void UserDbObject::OnConfigUpdate(void)
        Dictionary::Ptr fields = new Dictionary();
        User::Ptr user = static_pointer_cast<User>(GetObject());
 
+       /* groups */
+       Array::Ptr groups = user->GetGroups();
+
+       if (groups) {
+               ObjectLock olock(groups);
+               BOOST_FOREACH(const String& groupName, groups) {
+                       UserGroup::Ptr group = UserGroup::GetByName(groupName);
+
+                       DbQuery query1;
+                       query1.Table = DbType::GetByName("UserGroup")->GetTable() + "_members";
+                       query1.Type = DbQueryDelete;
+                       query1.Category = DbCatConfig;
+                       query1.WhereCriteria = new Dictionary();
+                       query1.WhereCriteria->Set("instance_id", 0); /* DbConnection class fills in real ID */
+                       query1.WhereCriteria->Set("contactgroup_id", DbValue::FromObjectInsertID(group));
+                       query1.WhereCriteria->Set("contact_object_id", user);
+                       OnQuery(query1);
+
+                       DbQuery query2;
+                       query2.Table = DbType::GetByName("UserGroup")->GetTable() + "_members";
+                       query2.Type = DbQueryInsert;
+                       query2.Category = DbCatConfig;
+                       query2.Fields = new Dictionary();
+                       query2.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */
+                       query2.Fields->Set("contactgroup_id", DbValue::FromObjectInsertID(group));
+                       query2.Fields->Set("contact_object_id", user);
+                       OnQuery(query2);
+               }
+       }
+
        /* contact addresses */
        Log(LogDebug, "UserDbObject")
            << "contact addresses for '" << user->GetName() << "'";
index d124d8d734409831809bcba549ffaa9029f78472..d73d46d117b1d44195fb099f04c74dcfbd0b65ba 100644 (file)
@@ -47,29 +47,3 @@ Dictionary::Ptr UserGroupDbObject::GetStatusFields(void) const
 {
        return Empty;
 }
-
-void UserGroupDbObject::OnConfigUpdate(void)
-{
-       UserGroup::Ptr group = static_pointer_cast<UserGroup>(GetObject());
-
-       DbQuery query1;
-       query1.Table = DbType::GetByName("UserGroup")->GetTable() + "_members";
-       query1.Type = DbQueryDelete;
-       query1.Category = DbCatConfig;
-       query1.WhereCriteria = new Dictionary();
-       query1.WhereCriteria->Set("instance_id", 0);
-       query1.WhereCriteria->Set("contactgroup_id", DbValue::FromObjectInsertID(group));
-       OnQuery(query1);
-
-       BOOST_FOREACH(const User::Ptr& user, group->GetMembers()) {
-               DbQuery query2;
-               query2.Table = DbType::GetByName("UserGroup")->GetTable() + "_members";
-               query2.Type = DbQueryInsert;
-               query2.Category = DbCatConfig;
-               query2.Fields = new Dictionary();
-               query2.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */
-               query2.Fields->Set("contactgroup_id", DbValue::FromObjectInsertID(group));
-               query2.Fields->Set("contact_object_id", user);
-               OnQuery(query2);
-       }
-}
index cd3e2decf7895ac86a51e99c508af30152b051ed..399040c5a4e3eef4a16192b794202f204ac249b6 100644 (file)
@@ -41,9 +41,6 @@ public:
 
        virtual Dictionary::Ptr GetConfigFields(void) const override;
        virtual Dictionary::Ptr GetStatusFields(void) const override;
-
-protected:
-       virtual void OnConfigUpdate(void) override;
 };
 
 }