summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNarayan Desai <desai@mcs.anl.gov>2004-01-06 05:30:25 +0000
committerNarayan Desai <desai@mcs.anl.gov>2004-01-06 05:30:25 +0000
commit90238504a2dc317e37615f4094729ec573b7939e (patch)
treede8d900fe122cdaf98c9e429de4882a748adcd73 /src
parent435159b9bd8b1365b1972c89ce746d8180d1841b (diff)
downloadbcfg2-90238504a2dc317e37615f4094729ec573b7939e.tar.gz
bcfg2-90238504a2dc317e37615f4094729ec573b7939e.tar.bz2
bcfg2-90238504a2dc317e37615f4094729ec573b7939e.zip
(Logical change 1.10)
git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@38 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src')
-rw-r--r--src/Core.py55
-rw-r--r--src/GeneratorUtils.py56
2 files changed, 111 insertions, 0 deletions
diff --git a/src/Core.py b/src/Core.py
index e69de29bb..698dd64a1 100644
--- a/src/Core.py
+++ b/src/Core.py
@@ -0,0 +1,55 @@
+#!/usr/bin/python
+# $Id$
+
+from syslog import syslog, LOG_ERR
+
+from Error import PublishError
+
+class PublishedValue(object):
+ def __init__(self,owner,key,value):
+ self.owner=owner
+ self.key=key
+ self.value=value
+
+ def Update(self,owner,value):
+ if owner != self.owner:
+ raise PublishError, (self.key,owner)
+ self.value=value
+
+class Core(object):
+ def __init__(self, generators):
+ self.handles = {}
+ self.pubspace = {}
+ self.generators = []
+ for generator in generators:
+ self.generators.append(generator(self))
+ # we need to inventory and setup generators
+ # Process generator requirements
+ for g in self.generators:
+ for prq in g.__requires__:
+ if not self.pubspace.has_key(prq):
+ raise GeneratorError, (g.name, prq)
+ g.CompleteSetup()
+ for f in g.__build__.keys():
+ self.handles[f] = g
+
+ def PublishValue(self,owner,key,value):
+ if not self.pubspace.has_key(key):
+ # This is a new entry
+ self.pubspace[key]=PublishedValue(owner,key,value)
+ else:
+ # This is an old entry. Update can fai
+ try:
+ self.pubspace[key].Update(owner,value)
+ except PublishError,e:
+ syslog(LOG_ERR, "Publish conflict for %s. Owner %s, Modifier %s"%(key,self.pubspace[key].owner,owner))
+
+ def ReadValue(self,key):
+ if self.pubspace.has_key(key):
+ return self.pubspace[key].value
+ raise KeyError,key
+
+ def GetConfigFile(self,filename,client):
+ if self.handles.has_key(filename):
+ return self.handles[filename].Build(filename,client)
+ raise KeyError, filename
diff --git a/src/GeneratorUtils.py b/src/GeneratorUtils.py
index e69de29bb..69fe86e3f 100644
--- a/src/GeneratorUtils.py
+++ b/src/GeneratorUtils.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python
+# $Id$
+
+from os import listdir, stat
+from stat import ST_MTIME
+
+class FileBacked(object):
+ '''FileBacked is a class that will cache file data and automatically reload it as required from disk.
+ This class is currently READ-ONLY.'''
+
+ def __init__(self,filename):
+ '''Setup initial structures'''
+ self.filename = filename
+ self.mtime = stat(filename)[ST_MTIME]
+ self._data = file(filename).read()
+
+ def getdata(self):
+ mtime = stat(self.filename)[ST_MTIME]
+ if mtime != self.mtime:
+ self._data = file(self.filename).read()
+ self.mtime = mtime
+ return self._data
+
+ def setdata(self,val):
+ pass
+
+ data=property(getdata,setdata)
+
+class DirectoryBacked(object):
+ '''DirectoryBacked caches a complete directory (including proper negative caching)'''
+
+ def __init__(self,path):
+ self.path = path
+ self._entries = {}
+ self.mtime = stat(path)[ST_MTIME]
+ for entry in listdir(path):
+ self._entries[entry] = FileBacked("%s/%s"%(path,entry))
+
+ def GetEntries(self):
+ mtime = stat(self.path)[ST_MTIME]
+ if mtime != self.mtime:
+ current = self._entries.keys()
+ new = listdir(self.path)
+ for key in new:
+ if key not in current:
+ self._entries[key] = FileBacked("%s/%s"%(self.path,key))
+ for key in current:
+ if key not in new:
+ del self._entries[key]
+ return self._entries
+
+ def SetEntries(self,val):
+ pass
+
+ entries = property(GetEntries,SetEntries)
+