From: Gunnar Beutner Date: Tue, 28 Oct 2014 17:58:22 +0000 (+0100) Subject: Fix "assign where" for nested groups X-Git-Tag: v2.2.0~212 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4cb3d5b1f0847c4ec0aa159d48d3d06456506c08;p=icinga2 Fix "assign where" for nested groups fixes #7475 --- 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); }