From 4cb3d5b1f0847c4ec0aa159d48d3d06456506c08 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 28 Oct 2014 18:58:22 +0100 Subject: [PATCH] Fix "assign where" for nested groups fixes #7475 --- lib/icinga/host.cpp | 2 ++ lib/icinga/hostgroup.cpp | 5 ++--- lib/icinga/service.cpp | 2 ++ lib/icinga/servicegroup.cpp | 5 ++--- lib/icinga/user.cpp | 2 ++ lib/icinga/usergroup.cpp | 5 ++--- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/icinga/host.cpp b/lib/icinga/host.cpp index b21cc3f4d..8e3940519 100644 --- a/lib/icinga/host.cpp +++ b/lib/icinga/host.cpp @@ -41,6 +41,8 @@ void Host::OnConfigLoaded(void) Array::Ptr groups = GetGroups(); if (groups) { + groups = groups->ShallowClone(); + ObjectLock olock(groups); BOOST_FOREACH(const String& name, groups) { diff --git a/lib/icinga/hostgroup.cpp b/lib/icinga/hostgroup.cpp index 8bf54905c..dc88c06be 100644 --- a/lib/icinga/hostgroup.cpp +++ b/lib/icinga/hostgroup.cpp @@ -66,9 +66,6 @@ bool HostGroup::EvaluateObjectRuleOne(const Host::Ptr& host, const ObjectRule& r /* assign host group membership */ group->ResolveGroupMembership(host, true); - /* update groups attribute for apply */ - host->AddGroup(group_name); - return true; } @@ -100,6 +97,8 @@ std::set HostGroup::GetMembers(void) const void HostGroup::AddMember(const Host::Ptr& host) { + host->AddGroup(GetName()); + boost::mutex::scoped_lock lock(m_HostGroupMutex); m_Members.insert(host); } diff --git a/lib/icinga/service.cpp b/lib/icinga/service.cpp index 3d14fcc6c..ca498f0bf 100644 --- a/lib/icinga/service.cpp +++ b/lib/icinga/service.cpp @@ -42,6 +42,8 @@ void Service::OnConfigLoaded(void) Array::Ptr groups = GetGroups(); if (groups) { + groups = groups->ShallowClone(); + ObjectLock olock(groups); BOOST_FOREACH(const String& name, groups) { diff --git a/lib/icinga/servicegroup.cpp b/lib/icinga/servicegroup.cpp index 2aa28c63d..1bb570fb3 100644 --- a/lib/icinga/servicegroup.cpp +++ b/lib/icinga/servicegroup.cpp @@ -69,9 +69,6 @@ bool ServiceGroup::EvaluateObjectRuleOne(const Service::Ptr& service, const Obje /* assign service group membership */ group->ResolveGroupMembership(service, true); - /* update groups attribute for apply */ - service->AddGroup(group_name); - return true; } @@ -103,6 +100,8 @@ std::set ServiceGroup::GetMembers(void) const void ServiceGroup::AddMember(const Service::Ptr& service) { + service->AddGroup(GetName()); + boost::mutex::scoped_lock lock(m_ServiceGroupMutex); m_Members.insert(service); } diff --git a/lib/icinga/user.cpp b/lib/icinga/user.cpp index 543016eac..6649bef48 100644 --- a/lib/icinga/user.cpp +++ b/lib/icinga/user.cpp @@ -40,6 +40,8 @@ void User::OnConfigLoaded(void) Array::Ptr groups = GetGroups(); if (groups) { + groups = groups->ShallowClone(); + ObjectLock olock(groups); BOOST_FOREACH(const String& name, groups) { diff --git a/lib/icinga/usergroup.cpp b/lib/icinga/usergroup.cpp index 2f2cb27e1..53d0d476a 100644 --- a/lib/icinga/usergroup.cpp +++ b/lib/icinga/usergroup.cpp @@ -66,9 +66,6 @@ bool UserGroup::EvaluateObjectRuleOne(const User::Ptr& user, const ObjectRule& r /* assign user group membership */ group->ResolveGroupMembership(user, true); - /* update groups attribute for apply */ - user->AddGroup(group_name); - return true; } @@ -100,6 +97,8 @@ std::set UserGroup::GetMembers(void) const void UserGroup::AddMember(const User::Ptr& user) { + user->AddGroup(GetName()); + boost::mutex::scoped_lock lock(m_UserGroupMutex); m_Members.insert(user); } -- 2.40.0