summaryrefslogtreecommitdiffstats
path: root/src/lib/Server
diff options
context:
space:
mode:
authorNarayan Desai <desai@mcs.anl.gov>2005-08-31 21:37:18 +0000
committerNarayan Desai <desai@mcs.anl.gov>2005-08-31 21:37:18 +0000
commit6012386e61cedda17d982e2ac9f7ae494671a57c (patch)
tree3c1b78fdf9edaa70e46071d6120b0706761b3b1f /src/lib/Server
parentfb11f161ae5887519f9df4bc2c7225b6c67e8542 (diff)
downloadbcfg2-6012386e61cedda17d982e2ac9f7ae494671a57c.tar.gz
bcfg2-6012386e61cedda17d982e2ac9f7ae494671a57c.tar.bz2
bcfg2-6012386e61cedda17d982e2ac9f7ae494671a57c.zip
working, verified delta support
2005/08/30 16:04:05-05:00 anl.gov!desai fix tb from Cory (Logical change 1.291) git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@1159 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src/lib/Server')
-rw-r--r--src/lib/Server/Generators/Cfg.py37
1 files changed, 26 insertions, 11 deletions
diff --git a/src/lib/Server/Generators/Cfg.py b/src/lib/Server/Generators/Cfg.py
index 5f4d0fc39..659ad714f 100644
--- a/src/lib/Server/Generators/Cfg.py
+++ b/src/lib/Server/Generators/Cfg.py
@@ -56,8 +56,7 @@ class ConfigFileEntry(object):
all data for all clients.'''
specific = regcompile('(.*/)(?P<filename>[\S\-.]+)\.((H_(?P<hostname>\S+))|' +
'(B(?P<bprio>\d+)_(?P<bundle>\S+))|(A(?P<aprio>\d+)_(?P<attr>\S+))|' +
- '(I_(?P<image>\S+))|(C(?P<cprio>\d+)_(?P<class>\S+)))' +
- '(\.(?P<op>cat|udiff))?$')
+ '(I_(?P<image>\S+))|(C(?P<cprio>\d+)_(?P<class>\S+)))$')
info = regcompile('^owner:(\s)*(?P<owner>\w+)|group:(\s)*(?P<group>\w+)|' +
'perms:(\s)*(?P<perms>\w+)|encoding:(\s)*(?P<encoding>\w+)|' +
'(?P<paranoid>paranoid(\s)*)$')
@@ -95,6 +94,8 @@ class ConfigFileEntry(object):
def AddEntry(self, name):
'''add new file additions for a single cf file'''
+ delta = False
+ oldname = name
if name[-5:] == ':info':
return self.read_info()
@@ -103,6 +104,11 @@ class ConfigFileEntry(object):
self.basefiles.sort()
return
+ if name.split('/')[-1].split('.')[-1] in ['cat']:
+ delta = True
+ oldname = name
+ name = name[:-4]
+
specmatch = self.specific.match(name)
if specmatch == None:
syslog(LOG_ERR, "Cfg: Failed to match file %s" % (name))
@@ -113,10 +119,10 @@ class ConfigFileEntry(object):
if value != None:
data[item] = value
- cfile = FileEntry(name, False, data.get('image', None), data.get('class', []),
+ cfile = FileEntry(oldname, False, data.get('image', None), data.get('class', []),
data.get('bundle', []), data.get('attr', []), data.get('hostname', None))
- if specmatch.group("op") != None:
+ if delta:
self.deltas.append(cfile)
self.deltas.sort()
else:
@@ -170,12 +176,20 @@ class ConfigFileEntry(object):
raise GeneratorError, ('basefile', name)
filedata += basefile.data
- # find applicable deltas
- #deltas = [x for x in self.deltas if x.Applies(metadata)]
- # filter for more specific
- #for delta in deltas:
- # pass
- # apply diffs, etc
+ for delta in [x for x in self.deltas if metadata.Applies(x)]:
+ # 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"
+
entry.attrib.update(self.metadata)
if self.paranoid:
entry.attrib['paranoid'] = 'true'
@@ -256,7 +270,8 @@ class Cfg(Generator):
else:
self.LogError("Ignoring event for %s"%(configfile))
elif action == 'deleted':
- self.entries[configfile].HandleEvent(event)
+ if self.entries.has_key(configfile):
+ self.entries[configfile].HandleEvent(event)
elif action in ['exists', 'endExist']:
pass
else: