1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
import sys
import logging
import Bcfg2.Server.Plugin
from Bcfg2.Server.Plugins.Cfg import CfgGenerator
logger = logging.getLogger(__name__)
try:
import genshi.core
from genshi.template import TemplateLoader, NewTextTemplate
have_genshi = True
except ImportError:
TemplateLoader = None
have_genshi = False
# snipped from TGenshi
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 CfgGenshiGenerator(CfgGenerator):
__extensions__ = ['genshi']
__loader_cls__ = TemplateLoader
def __init__(self, fname, spec, encoding):
CfgGenerator.__init__(self, fname, spec, encoding)
if not have_genshi:
msg = "Cfg: Genshi is not available: %s" % fname
logger.error(msg)
raise Bcfg2.Server.Plugin.PluginExecutionError(msg)
self.loader = self.__loader_cls__()
self.template = None
@classmethod
def ignore(cls, event, basename=None):
return (event.filename.endswith(".genshi_include") or
CfgGenerator.ignore(event, basename=basename))
def get_data(self, entry, metadata):
fname = entry.get('realname', entry.get('name'))
stream = \
self.template.generate(name=fname,
metadata=metadata,
path=self.name).filter(removecomment)
try:
return stream.render('text', encoding=self.encoding,
strip_whitespace=False)
except TypeError:
return stream.render('text', encoding=self.encoding)
def handle_event(self, event):
if event.code2str() == 'deleted':
return
CfgGenerator.handle_event(self, event)
try:
self.template = self.loader.load(self.name, cls=NewTextTemplate,
encoding=self.encoding)
except Exception:
msg = "Cfg: Could not load template %s: %s" % (self.name,
sys.exc_info()[1])
logger.error(msg)
raise Bcfg2.Server.Plugin.PluginExecutionError(msg)
|