From c54ea14d6d2401758aa71cceda2f739ac6e86c47 Mon Sep 17 00:00:00 2001 From: Narayan Desai Date: Tue, 8 Apr 2008 17:21:41 +0000 Subject: Implement probe-handling using EntrySet code (makes client- and group-specific probes possible) git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@4489 ce84e21b-d406-0410-9b95-82705330c041 --- src/lib/Server/Plugins/Metadata.py | 54 ++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/src/lib/Server/Plugins/Metadata.py b/src/lib/Server/Plugins/Metadata.py index 9aff24d9d..d24a6a271 100644 --- a/src/lib/Server/Plugins/Metadata.py +++ b/src/lib/Server/Plugins/Metadata.py @@ -29,6 +29,34 @@ class ClientMetadata(object): '''Test to see if client is a member of group''' return group in self.groups +class ProbeSet(Bcfg2.Server.Plugin.EntrySet): + def __init__(self, path, fam): + fpattern = '[A-Za-z]+' + Bcfg2.Server.Plugin.EntrySet.__init__(self, fpattern, path, True, + Bcfg2.Server.Plugin.SpecificData) + fam.AddMonitor(path, self) + self.bangline = re.compile('^#!(?P(/\w+)+)$') + + def HandleEvent(self, event): + if event.filename != self.path: + return self.handle_event(event) + + def get_probe_data(self, metadata): + ret = [] + for entry in self.get_matching(metadata): + probe = lxml.etree.Element('probe') + probe.set('name', entry.name.split('/')[-1]) + probe.set('source', entry.name) + probe.text = entry.data + match = self.bangline.match(entry.data.split('\n')[0]) + if match: + probe.set('interpreter', match.group('interpreter')) + else: + probe.set('interpreter', '/bin/sh') + ret.append(probe) + return ret + + class Metadata(Bcfg2.Server.Plugin.Plugin): '''This class contains data for bcfg2 server metadata''' __version__ = '$Id$' @@ -60,12 +88,10 @@ class Metadata(Bcfg2.Server.Plugin.Plugin): self.pdirty = False try: loc = datastore + "/Probes" - self.probes = Bcfg2.Server.Plugin.DirectoryBacked(loc, core.fam) + self.probes = ProbeSet(loc, core.fam) except: self.probes = False self.probedata = {} - self.ptimes = {} - self.pctime = 0 self.extra = {'groups.xml':[], 'clients.xml':[]} self.password = core.password @@ -313,24 +339,9 @@ class Metadata(Bcfg2.Server.Plugin.Plugin): def GetProbes(self, meta, force=False): '''Return a set of probes for execution on client''' - ret = [] - ctime = time.time() - self.ptimes.get(meta.hostname, 0) - diff = ctime > self.pctime - if self.probes and (diff or force): - bangline = re.compile('^#!(?P(/\w+)+)$') - for name, entry in [(name, entry) for name, entry in \ - self.probes.entries.iteritems() if entry.data]: - probe = lxml.etree.Element('probe') - probe.set('name', name ) - probe.set('source', self.__name__) - probe.text = entry.data - match = bangline.match(entry.data.split('\n')[0]) - if match: - probe.set('interpreter', match.group('interpreter')) - else: - probe.set('interpreter', '/bin/sh') - ret.append(probe) - return ret + if self.probes: + return self.probes.get_probe_data(meta) + return [] def ReceiveData(self, client, datalist): self.cgroups[client.hostname] = [] @@ -338,7 +349,6 @@ class Metadata(Bcfg2.Server.Plugin.Plugin): for data in datalist: self.ReceiveDataItem(client, data) self.pdirty = True - self.ptimes[client.hostname] = time.time() self.write_probedata() def ReceiveDataItem(self, client, data): -- cgit v1.2.3-1-g7c22