diff options
author | Narayan Desai <desai@mcs.anl.gov> | 2006-05-08 18:44:37 +0000 |
---|---|---|
committer | Narayan Desai <desai@mcs.anl.gov> | 2006-05-08 18:44:37 +0000 |
commit | b39ef2743d2b35551fed68c6624c801641cac350 (patch) | |
tree | bdf6de330426dbc3fe63c17d485eff840abe2199 /src | |
parent | 476a5c27cd9a0548facb8f51c78df571f183535e (diff) | |
download | bcfg2-b39ef2743d2b35551fed68c6624c801641cac350.tar.gz bcfg2-b39ef2743d2b35551fed68c6624c801641cac350.tar.bz2 bcfg2-b39ef2743d2b35551fed68c6624c801641cac350.zip |
* Add diff delta support in Cfg
* Add support to propagate 'verify' status in Pkgmgr
git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@1859 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/Server/Plugins/Cfg.py | 47 | ||||
-rw-r--r-- | src/lib/Server/Plugins/Pkgmgr.py | 2 |
2 files changed, 34 insertions, 15 deletions
diff --git a/src/lib/Server/Plugins/Cfg.py b/src/lib/Server/Plugins/Cfg.py index 60f604849..e78e3d35b 100644 --- a/src/lib/Server/Plugins/Cfg.py +++ b/src/lib/Server/Plugins/Cfg.py @@ -1,7 +1,7 @@ '''This module implements a config file repository''' __revision__ = '$Revision$' -import binascii, exceptions, logging, os, re, stat, Bcfg2.Server.Plugin +import binascii, logging, os, re, stat, tempfile, Bcfg2.Server.Plugin logger = logging.getLogger('Bcfg2.Plugins.Cfg') @@ -108,8 +108,8 @@ class ConfigFileEntry(object): basename = name.split('/')[-1] rbasename = self.repopath.split('/')[-1] if not ((basename == ':info') or (basename[:len(rbasename)] == rbasename)): - logger.error("Confused about file %s; ignoring" % (name)) - return + logger.error("Confused about file %s; ignoring" % (name)) + return if basename == ':info': return self.read_info() @@ -122,6 +122,7 @@ class ConfigFileEntry(object): def HandleEvent(self, event): '''Handle FAM updates''' action = event.code2str() + #logger.debug("Got event %s for %s" % (action, event.filename)) if event.filename == ':info': if action in ['changed', 'exists', 'created']: return self.read_info() @@ -161,20 +162,36 @@ class ConfigFileEntry(object): logger.error("Failed to locate basefile for %s" % name) raise Bcfg2.Server.Plugin.PluginExecutionError, ('basefile', name) filedata += basefile.data + #logger.debug("Used basefile %s" % (basefile.name)) for delta in [delta for delta in self.fragments if delta.applies(metadata) and delta.op]: - # find applicable deltas - lines = filedata.split('\n') - if not lines[-1]: - lines = lines[:-1] - dlines = [dline for dline in delta.data.split('\n') if dline] - for line in dlines: - if line[0] == '-': - if line[1:] in lines: - lines.remove(line[1:]) - else: - lines.append(line[1:]) - filedata = "\n".join(lines) + "\n" + if delta.op == 'cat': + lines = filedata.split('\n') + if not lines[-1]: + lines = lines[:-1] + dlines = [dline for dline in delta.data.split('\n') if dline] + for line in dlines: + if line[0] == '-': + if line[1:] in lines: + lines.remove(line[1:]) + else: + lines.append(line[1:]) + filedata = "\n".join(lines) + "\n" + elif delta.op == 'diff': + basefile = open(tempfile.mktemp(), 'w') + basefile.write(filedata) + basefile.close() + dfile = open(tempfile.mktemp(), 'w') + dfile.write(delta.data) + dfile.close() + ret = os.system("patch -uf %s < %s > /dev/null 2>&1"%(basefile.name, dfile.name)) + output = open(basefile.name, 'r').read() + [os.unlink(fname) for fname in [basefile.name, dfile.name]] + if ret >> 8 != 0: + raise Bcfg2.Server.Plugin.PluginExecutionError, ('delta', delta) + filedata = output + else: + logger.error("Unknown delta type %s" % (delta.op)) [entry.attrib.__setitem__(key, value) for (key, value) in self.metadata.iteritems()] if self.paranoid: diff --git a/src/lib/Server/Plugins/Pkgmgr.py b/src/lib/Server/Plugins/Pkgmgr.py index a009e2910..563a7c448 100644 --- a/src/lib/Server/Plugins/Pkgmgr.py +++ b/src/lib/Server/Plugins/Pkgmgr.py @@ -41,6 +41,8 @@ class PNode(Bcfg2.Server.Plugin.INode): if pkg.attrib.get('file'): self.contents['Package'][pkgname]['url'] = pkg.get('url') self.contents['Package'][pkgname]['type'] = pkg.get('type') + if pkg.get('verify'): + self.contents['Package'][pkgname]['verify'] = pkg.get('verify') if pkgname not in pdict['Package']: pdict['Package'].append(pkgname) else: |