summaryrefslogtreecommitdiffstats
path: root/src/lib/Server
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/Server')
-rw-r--r--src/lib/Server/Plugins/Bundler.py51
-rw-r--r--src/lib/Server/Plugins/SGenshi.py1
-rw-r--r--src/lib/Server/Plugins/TGenshi.py5
3 files changed, 48 insertions, 9 deletions
diff --git a/src/lib/Server/Plugins/Bundler.py b/src/lib/Server/Plugins/Bundler.py
index 8c89d041f..e0e2ad7f0 100644
--- a/src/lib/Server/Plugins/Bundler.py
+++ b/src/lib/Server/Plugins/Bundler.py
@@ -1,7 +1,21 @@
'''This provides bundle clauses with translation functionality'''
__revision__ = '$Revision$'
-import copy, lxml.etree, Bcfg2.Server.Plugin
+import copy, lxml.etree, Bcfg2.Server.Plugin, re
+
+try:
+ import Bcfg2.Server.Plugins.SGenshi
+ import genshi.template
+ have_genshi = True
+except:
+ have_genshi = False
+
+class BundleFile(Bcfg2.Server.Plugin.StructFile):
+ def get_xml_value(self, metadata):
+ bundlename = self.name.split('/')[-1][:-4]
+ bundle = lxml.etree.Element('Bundle', name=bundlename)
+ [bundle.append(copy.deepcopy(item)) for item in self.Match(metadata)]
+ return bundle
class Bundler(Bcfg2.Server.Plugin.Plugin,
Bcfg2.Server.Plugin.Structure,
@@ -10,26 +24,49 @@ class Bundler(Bcfg2.Server.Plugin.Plugin,
name = 'Bundler'
__version__ = '$Id$'
__author__ = 'bcfg-dev@mcs.anl.gov'
- __child__ = Bcfg2.Server.Plugin.StructFile
+ patterns = re.compile('^(?P<name>.*)\.(xml|genshi)$')
def __init__(self, core, datastore):
Bcfg2.Server.Plugin.Plugin.__init__(self, core, datastore)
Bcfg2.Server.Plugin.Structure.__init__(self)
+ self.encoding = core.encoding
+ self.__child__ = self.template_dispatch
try:
Bcfg2.Server.Plugin.XMLDirectoryBacked.__init__(self, self.data, self.core.fam)
except OSError:
self.logger.error("Failed to load Bundle repository")
raise Bcfg2.Server.Plugin.PluginInitError
+ def template_dispatch(self, name):
+ if name.endswith('.xml'):
+ return BundleFile(name)
+ elif name.endswith('.genshi'):
+ if have_genshi:
+ spec = Bcfg2.Server.Plugin.Specificity()
+ return Bcfg2.Server.Plugins.SGenshi.SGenshiTemplateFile(name,
+ spec,
+ self.encoding)
+
def BuildStructures(self, metadata):
'''Build all structures for client (metadata)'''
bundleset = []
for bundlename in metadata.bundles:
- if not ("%s.xml" % bundlename) in self.entries:
+ entries = [item for (key, item) in self.entries.iteritems() if \
+ self.patterns.match(key).group('name') == bundlename]
+ if len(entries) == 0:
continue
- bundle = lxml.etree.Element('Bundle', name=bundlename)
- [bundle.append(copy.deepcopy(item))
- for item in self.entries["%s.xml" % (bundlename)].Match(metadata)]
- bundleset.append(bundle)
+ elif len(entries) == 1:
+ try:
+ bundleset.append(entries[0].get_xml_value(metadata))
+ except genshi.template.TemplateError, t:
+ self.logger.error("Bundler: Failed to template genshi bundle %s" \
+ % (bundlename))
+ self.logger.error(t)
+ except:
+ self.logger.error("Bundler: Unexpected bundler error for %s" \
+ % (bundlename), exc_info=1)
+ else:
+ self.logger.error("Got multiple matches for bundle %s" \
+ % (bundlename))
return bundleset
diff --git a/src/lib/Server/Plugins/SGenshi.py b/src/lib/Server/Plugins/SGenshi.py
index 4f3490dac..44791212f 100644
--- a/src/lib/Server/Plugins/SGenshi.py
+++ b/src/lib/Server/Plugins/SGenshi.py
@@ -47,6 +47,7 @@ class SGenshi(SGenshiEntrySet,
name = 'SGenshi'
__version__ = '$Id$'
__author__ = 'bcfg-dev@mcs.anl.gov'
+ deprecated = True
def __init__(self, core, datastore):
Bcfg2.Server.Plugin.Plugin.__init__(self, core, datastore)
diff --git a/src/lib/Server/Plugins/TGenshi.py b/src/lib/Server/Plugins/TGenshi.py
index 102c95fc2..a28f5d08a 100644
--- a/src/lib/Server/Plugins/TGenshi.py
+++ b/src/lib/Server/Plugins/TGenshi.py
@@ -42,10 +42,11 @@ class TemplateFile:
self.template_cls = NewTextTemplate
else:
self.template_cls = MarkupTemplate
+ self.HandleEvent = self.handle_event
- def handle_event(self, event):
+ def handle_event(self, event=None):
'''Handle all fs events for this template'''
- if event.code2str() == 'deleted':
+ if event and event.code2str() == 'deleted':
return
try:
loader = TemplateLoader()