Ticket #243: bcfg2-PluginTCheetah_with_Probes.patch

File bcfg2-PluginTCheetah_with_Probes.patch, 2.4 KB (added by gogo@…, 15 years ago)
  • TCheetah.py

     
    88info = re.compile('^owner:(\s)*(?P<owner>\w+)$|group:(\s)*(?P<group>\w+)$|' + 
    99                  'perms:(\s)*(?P<perms>\w+)$') 
    1010 
     11probeData = {} 
     12 
    1113class TemplateFile: 
    1214    '''Template file creates Cheetah template structures for the loaded file''' 
    1315    def __init__(self, name, properties): 
     
    4850        self.template.metadata = metadata 
    4951        self.template.properties = self.properties.properties 
    5052        try: 
     53            self.template.probes = probeData[metadata.hostname] 
     54        except: 
     55            logger.info("No probes available in template.") 
     56        try: 
    5157            entry.text = str(self.template) 
    5258        except: 
    5359            logger.error("Failed to template %s" % entry.get('name'), exc_info=1) 
     
    7985        self.handles = {} 
    8086        self.AddDirectoryMonitor('') 
    8187        self.properties = CheetahProperties('%s/../etc/properties.xml' % self.data, self.core.fam) 
     88        try: 
     89            self.probes = Bcfg2.Server.Plugin.DirectoryBacked(datastore + '/Probes', self.core.fam ) 
     90        except: 
     91            self.probes = False 
     92        # eventually flush fam events here so that all entries built here 
     93        # ready to go 
    8294 
     95    def GetProbes(self, _): 
     96        '''Return a set of probes for execution on client''' 
     97        ret = [] 
     98        bangline = re.compile('^#!(?P<interpreter>(/\w+)+)$') 
     99        if self.probes: 
     100            for name, entry in self.probes.entries.iteritems(): 
     101                probe = lxml.etree.Element('probe') 
     102                probe.set('name', name ) 
     103                probe.set('source', 'TCheetah') 
     104                probe.text = entry.data 
     105                match = bangline.match(entry.data.split('\n')[0]) 
     106                if match: 
     107                    probe.set('interpreter', match.group('interpreter')) 
     108                ret.append(probe) 
     109        return ret 
     110 
     111    def ReceiveData(self, client, data): 
     112        '''Receive probe results pertaining to client''' 
     113        try: 
     114            probeData[client.hostname].update({ data.get('name'):data.text }) 
     115        except KeyError: 
     116            probeData[client.hostname] = { data.get('name'):data.text } 
     117 
    83118    def BuildEntry(self, entry, metadata): 
    84119        '''Dispatch fetch calls to the correct object''' 
    85120        self.entries[entry.get('name')].BuildFile(entry, metadata)