From cd04606f10242676ce67d8628d14e27bd43a9976 Mon Sep 17 00:00:00 2001 From: Narayan Desai Date: Thu, 22 May 2008 20:46:15 +0000 Subject: Fix specific probe handling. Now clients only get one (most-specific) instance of each probe. all probe results how up at the probe basename git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@4627 ce84e21b-d406-0410-9b95-82705330c041 --- src/lib/Server/Plugins/Metadata.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/lib/Server/Plugins/Metadata.py b/src/lib/Server/Plugins/Metadata.py index 15e4177e8..9caa7e7ae 100644 --- a/src/lib/Server/Plugins/Metadata.py +++ b/src/lib/Server/Plugins/Metadata.py @@ -12,6 +12,8 @@ class MetadataRuntimeError(Exception): '''This error is raised when the metadata engine is called prior to reading enough data''' pass +probe_matcher = re.compile("(?P\S+).(?P[GH])_\S+") + class ClientMetadata(object): '''This object contains client metadata''' def __init__(self, client, groups, bundles, categories, probed, uuid, @@ -43,9 +45,24 @@ class ProbeSet(Bcfg2.Server.Plugin.EntrySet): def get_probe_data(self, metadata): ret = [] - for entry in self.get_matching(metadata): + candidates = self.get_matching(metadata) + temp = {} + for cand in candidates: + if cand.specific.all: + if cand.name not in temp: + temp[cand.name] = (cand, 0) + continue + mdata = probe_matcher.match(cand.name).groupdict() + if mdata['basename'] in temp: + if mdata['mode'] > temp[mdata['basename']][1]: + temp[mdata['basename']] = (cand, mdata['mode']) + else: + temp[mdata['basename']] = (cand, mdata['mode']) + + for (name, data) in temp.iteritems(): + entry, prio = data probe = lxml.etree.Element('probe') - probe.set('name', entry.name.split('/')[-1]) + probe.set('name', name.split('/')[-1]) probe.set('source', "Metadata") probe.text = entry.data match = self.bangline.match(entry.data.split('\n')[0]) -- cgit v1.2.3-1-g7c22