From 3987c0ed6e554231d4534347f4a35d5fae91cb5c Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Mon, 23 Sep 2013 09:23:45 -0400 Subject: GroupLogic: sort after other plugins so GroupLogic can use, e.g., Probe groups --- src/lib/Bcfg2/Server/Plugins/GroupLogic.py | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/lib/Bcfg2/Server/Plugins/GroupLogic.py') diff --git a/src/lib/Bcfg2/Server/Plugins/GroupLogic.py b/src/lib/Bcfg2/Server/Plugins/GroupLogic.py index e581ebc6a..ab10776da 100644 --- a/src/lib/Bcfg2/Server/Plugins/GroupLogic.py +++ b/src/lib/Bcfg2/Server/Plugins/GroupLogic.py @@ -36,6 +36,9 @@ class GroupLogic(Bcfg2.Server.Plugin.Plugin, """ GroupLogic is a connector plugin that lets you use an XML Genshi template to dynamically set additional groups for clients. """ + # perform grouplogic later than other Connector plugins, so it can + # use groups set by them + sort_order = 1000 def __init__(self, core, datastore): Bcfg2.Server.Plugin.Plugin.__init__(self, core, datastore) -- cgit v1.2.3-1-g7c22 From 5b2af26603d3ea01378561429179cdd895c42ec0 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Mon, 23 Sep 2013 10:50:06 -0400 Subject: GroupLogic: avoid infinite recursion when using metadata.query in GroupLogic --- src/lib/Bcfg2/Server/Plugins/GroupLogic.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/lib/Bcfg2/Server/Plugins/GroupLogic.py') diff --git a/src/lib/Bcfg2/Server/Plugins/GroupLogic.py b/src/lib/Bcfg2/Server/Plugins/GroupLogic.py index ab10776da..aa71d2cfe 100644 --- a/src/lib/Bcfg2/Server/Plugins/GroupLogic.py +++ b/src/lib/Bcfg2/Server/Plugins/GroupLogic.py @@ -3,6 +3,7 @@ template to dynamically set additional groups for clients. """ import os import lxml.etree +from threading import local import Bcfg2.Server.Plugin from Bcfg2.Server.Plugins.Metadata import MetadataGroup try: @@ -45,8 +46,23 @@ class GroupLogic(Bcfg2.Server.Plugin.Plugin, Bcfg2.Server.Plugin.Connector.__init__(self) self.config = GroupLogicConfig(os.path.join(self.data, "groups.xml"), core.fam) + self._local = local() + # building is a thread-local set that tracks which machines + # GroupLogic is getting additional groups for. If a + # get_additional_groups() is called twice for a machine before + # the first call has completed, the second call returns an + # empty list. This is for infinite recursion protection; + # without this check, it'd be impossible to use things like + # metadata.query.in_group() in GroupLogic, since that requires + # building all metadata, which requires running + # GroupLogic.get_additional_groups() for all hosts, which + # requires building all metadata... + self._local.building = set() def get_additional_groups(self, metadata): + if metadata.hostname in self._local.building: + return [] + self._local.building.add(metadata.hostname) rv = [] for el in self.config.get_xml_value(metadata).findall("Group"): if el.get("category"): @@ -54,4 +70,5 @@ class GroupLogic(Bcfg2.Server.Plugin.Plugin, category=el.get("category"))) else: rv.append(el.get("name")) + self._local.building.discard(metadata.hostname) return rv -- cgit v1.2.3-1-g7c22