From 48ab43cff593b9020633004c4393e8bf91b5b88b Mon Sep 17 00:00:00 2001 From: Narayan Desai Date: Tue, 8 Apr 2008 16:42:45 +0000 Subject: Switch SGenshi over to using EntrySet classes as well (SGenshi templates can now be client and group specific, and can use properties internally) git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@4486 ce84e21b-d406-0410-9b95-82705330c041 --- src/lib/Server/Plugins/SGenshi.py | 81 ++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 49 deletions(-) (limited to 'src/lib/Server/Plugins/SGenshi.py') diff --git a/src/lib/Server/Plugins/SGenshi.py b/src/lib/Server/Plugins/SGenshi.py index 76d1dd6bf..469cd493e 100644 --- a/src/lib/Server/Plugins/SGenshi.py +++ b/src/lib/Server/Plugins/SGenshi.py @@ -1,69 +1,52 @@ '''This module implements a templating generator based on Genshi''' __revision__ = '$Revision$' -import Bcfg2.Server.Plugin +import Bcfg2.Server.Plugin, Bcfg2.Server.Plugins.TGenshi import lxml.etree, logging logger = logging.getLogger('Bcfg2.Plugins.SGenshi') -try: - import genshi.template, genshi.core, genshi.template.base -except: - logger.error("Failed to load Genshi; disabling SGenshi") - raise - -def removecomment(stream): - """A genshi filter that removes comments from the stream.""" - for kind, data, pos in stream: - if kind is genshi.core.COMMENT: - continue - yield kind, data, pos - -class TemplateFile(Bcfg2.Server.Plugin.FileBacked): - '''Genshi template file object''' - loader = genshi.template.TemplateLoader(auto_reload=True, - max_cache_size=64) - def HandleEvent(self, _=None): - '''Process FAM/GAMIN event''' - try: - self.template = self.loader.load(self.name, - cls=genshi.template.MarkupTemplate) - except genshi.template.base.TemplateSyntaxError, e: - logger.error("SGenshi: Parse failure due to %s" % (e)) - - def GetValue(self, metadata): - '''Build actual structure contents''' - if not hasattr(self, 'template'): - logger.error("Template data for %s could not be loaded" % self.name) - raise Bcfg2.Server.Plugin.PluginExecutionError - stream = self.template.generate(metadata=metadata).filter(removecomment) +class SGenshiTemplateFile(Bcfg2.Server.Plugins.TGenshi.TemplateFile): + def get_xml_value(self, metadata): + stream = self.template.generate(metadata=metadata, + properties=self.properties).filter( \ + Bcfg2.Server.Plugins.TGenshi.removecomment) data = stream.render('xml') return lxml.etree.XML(data) -class SGenshi(Bcfg2.Server.Plugin.Plugin, - Bcfg2.Server.Plugin.XMLDirectoryBacked): - '''SGenshi is a structure plugin that provides direct plugin access to templated structures''' - __child__ = TemplateFile +class SGenshiEntrySet(Bcfg2.Server.Plugin.EntrySet): + def __init__(self, path, fam): + fpattern = '[A-Za-z]+\.xml' + Bcfg2.Server.Plugin.EntrySet.__init__(self, fpattern, path, + True, SGenshiTemplateFile) + fam.AddMonitor(path, self) + + def HandleEvent(self, event): + if event.filename != self.path: + return self.handle_event(event) + + def BuildStructures(self, metadata): + '''Build SGenshi structures''' + ret = [] + for entry in self.get_matching(metadata): + try: + ret.append(entry.get_xml_value(metadata)) + except Bcfg2.Server.Plugin.PluginExecutionError: + logger.error("SGenshi: Failed to template file %s" % entry.name) + return ret + +class SGenshi(SGenshiEntrySet, Bcfg2.Server.Plugin.Plugin): + '''The SGenshi plugin provides templated structures''' __name__ = 'SGenshi' __version__ = '$Id$' + __author__ = 'bcfg-dev@mcs.anl.gov' def __init__(self, core, datastore): Bcfg2.Server.Plugin.Plugin.__init__(self, core, datastore) try: - Bcfg2.Server.Plugin.XMLDirectoryBacked.__init__(self, - self.data, - self.core.fam) + SGenshiEntrySet.__init__(self, self.data, self.core.fam) except: logger.error("Failed to load SGenshi repository; disabling SGenshi") raise Bcfg2.Server.Plugin.PluginInitError - def BuildStructures(self, metadata): - '''Build SGenshi structures''' - ret = [] - for entry in self.entries.values(): - try: - ret.append(entry.GetValue(metadata)) - except Bcfg2.Server.Plugin.PluginExecutionError: - logger.error("SGenshi: Failed to template file %s" % entry.name) - return ret - + -- cgit v1.2.3-1-g7c22