~ubuntu-branches/ubuntu/hardy/bcfg2/hardy-updates

« back to all changes in this revision

Viewing changes to src/lib/Server/Plugins/Cfg.py

  • Committer: Bazaar Package Importer
  • Author(s): Sami Haahtinen
  • Date: 2006-11-16 22:39:16 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20061116223916-8dtn3t86cz58vg2x
Tags: 0.8.6.1-1
* New Upstream Release
* Replaced faulty if clause in bcfg2.postrm (Closes: #398772)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
'''This module implements a config file repository'''
2
 
__revision__ = '$Revision: 2262 $'
 
2
__revision__ = '$Revision: 2489 $'
3
3
 
4
4
import binascii, logging, os, re, stat, tempfile, Bcfg2.Server.Plugin, lxml.etree
5
5
 
83
83
        self.paranoid = False
84
84
        self.interpolate = False
85
85
        
86
 
    def read_info(self):
 
86
    def read_info(self, name):
87
87
        '''read in :info metadata'''
88
88
        self.interpolate = False
89
89
        self.paranoid = False
90
 
        filename = "%s/:info" % self.repopath
 
90
        filename = "%s/%s" % (self.repopath, name)
91
91
        for line in open(filename).readlines():
92
92
            match = self.info.match(line)
93
93
            if not match:
118
118
            logger.error("Confused about file %s; ignoring" % (name))
119
119
            return
120
120
        if basename == ':info':
121
 
            return self.read_info()
 
121
            return self.read_info(basename)
122
122
 
123
123
        try:
124
124
            self.fragments.append(FileEntry(self.path, name))
130
130
        '''Handle FAM updates'''
131
131
        action = event.code2str()
132
132
        #logger.debug("Got event %s for %s" % (action, event.filename))
133
 
        if event.filename == ':info':
 
133
        if event.filename in [':info', 'info']:
134
134
            if action in ['changed', 'exists', 'created']:
135
 
                return self.read_info()
 
135
                return self.read_info(event.filename)
136
136
        if event.filename != self.path.split('/')[-1]:
137
137
            if not specific.match('/' + event.filename):
138
138
                logger.info('Suppressing event for bogus file %s' % event.filename)
146
146
        elif len(entries) > 1:
147
147
            logger.error("Matched multiple entries for spec %s" % (event.filename))
148
148
            logger.error("Entry filenames are:")
149
 
            logger.error([entry.get('name') for entry in entries])
 
149
            logger.error([entry.name for entry in entries])
150
150
            
151
151
        if action == 'deleted':
152
152
            logger.info("Removing entry %s" % event.filename)
215
215
        if self.interpolate:
216
216
            if metadata.hostname in probeData:
217
217
                for name, value in probeData[metadata.hostname].iteritems():
218
 
                    filedata = filedata.replace("@@%s@@"%name, value )
 
218
                    if value != None:
 
219
                        filedata = filedata.replace("@@%s@@"%name, value )
219
220
            else:
220
221
                logger.warning("Cannot interpolate data for client: %s for config file: %s"% (metadata.hostname, basefile.name))
221
222
        if self.paranoid:
234
235
class Cfg(Bcfg2.Server.Plugin.Plugin):
235
236
    '''This generator in the configuration file repository for bcfg2'''
236
237
    __name__ = 'Cfg'
237
 
    __version__ = '$Id: Cfg.py 2262 2006-09-15 15:24:19Z desai $'
 
238
    __version__ = '$Id: Cfg.py 2489 2006-11-12 16:01:13Z desai $'
238
239
    __author__ = 'bcfg-dev@mcs.anl.gov'
239
240
    tempfile = re.compile("^.*~$|^.*\.swp")
240
241
 
260
261
        if self.interpolate:
261
262
            if self.probes:
262
263
                for name, entry in self.probes.entries.iteritems():
263
 
                    probe = lxml.etree.Element('probe')
264
 
                    probe.set('name', name )
265
 
                    probe.set('source', 'Cfg')
266
 
                    probe.text = entry.data
267
 
                    match = bangline.match(entry.data.split('\n')[0])
268
 
                    if match:
269
 
                        probe.set('interpreter', match.group('interpreter'))
270
 
                    ret.append(probe)
 
264
                    if entry.data:
 
265
                        probe = lxml.etree.Element('probe')
 
266
                        probe.set('name', name )
 
267
                        probe.set('source', 'Cfg')
 
268
                        probe.text = entry.data
 
269
                        match = bangline.match(entry.data.split('\n')[0])
 
270
                        if match:
 
271
                            probe.set('interpreter', match.group('interpreter'))
 
272
                        else:
 
273
                            probe.set('interpreter', '/bin/sh')
 
274
                        ret.append(probe)
271
275
            probe = lxml.etree.Element('probe')
272
276
            probe.set('name', 'hostname')
273
277
            probe.set('source', 'Cfg')
277
281
 
278
282
    def ReceiveData(self, client, data):
279
283
        '''Receive probe results pertaining to client'''
280
 
        probeData[client.hostname] = { data.get('name'):data.text }
 
284
        try:
 
285
            probeData[client.hostname].update({ data.get('name'):data.text })
 
286
        except KeyError:
 
287
            probeData[client.hostname] = { data.get('name'):data.text }
281
288
 
282
289
    def AddDirectoryMonitor(self, name):
283
290
        '''Add new directory to FAM structures'''