diff options
author | Chris St. Pierre <chris.a.st.pierre@gmail.com> | 2012-06-19 11:24:00 -0400 |
---|---|---|
committer | Chris St. Pierre <chris.a.st.pierre@gmail.com> | 2012-06-19 11:24:00 -0400 |
commit | 869934179f21858b10d4de60d11d3644afcfad74 (patch) | |
tree | 071cfc8f44fbb5048404acf2ccec198f11399274 /src/lib/Bcfg2/Server/Plugin.py | |
parent | e3131034dd00c61ed5ca4f6a38f74250f0ac5726 (diff) | |
parent | 16a38827b5bb374da6caaf103f9363a45262f745 (diff) | |
download | bcfg2-869934179f21858b10d4de60d11d3644afcfad74.tar.gz bcfg2-869934179f21858b10d4de60d11d3644afcfad74.tar.bz2 bcfg2-869934179f21858b10d4de60d11d3644afcfad74.zip |
merged maint
Diffstat (limited to 'src/lib/Bcfg2/Server/Plugin.py')
-rw-r--r-- | src/lib/Bcfg2/Server/Plugin.py | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/src/lib/Bcfg2/Server/Plugin.py b/src/lib/Bcfg2/Server/Plugin.py index a68a9e80e..fb5e115a9 100644 --- a/src/lib/Bcfg2/Server/Plugin.py +++ b/src/lib/Bcfg2/Server/Plugin.py @@ -9,10 +9,9 @@ import posixpath import re import sys import threading +import Bcfg2.Server from Bcfg2.Bcfg2Py3k import ConfigParser -from lxml.etree import XML, XMLSyntaxError - import Bcfg2.Options # py3k compatibility @@ -55,6 +54,19 @@ info_regex = re.compile( \ 'perms:(\s)*(?P<perms>\w+)|' + 'sensitive:(\s)*(?P<sensitive>\S+)|') +def bind_info(entry, metadata, infoxml=None, default=default_file_metadata): + for attr, val in list(default.items()): + entry.set(attr, val) + if infoxml: + mdata = dict() + infoxml.pnode.Match(metadata, mdata, entry=entry) + if 'Info' not in mdata: + msg = "Failed to set metadata for file %s" % entry.get('name') + logger.error(msg) + raise PluginExecutionError(msg) + for attr, val in list(mdata['Info'][None].items()): + entry.set(attr, val) + class PluginInitError(Exception): """Error raised in cases of Plugin initialization errors.""" @@ -265,7 +277,9 @@ class ThreadedStatistics(Statistics, if self.terminate.isSet(): return False - self.work_queue.put_nowait((metadata, lxml.etree.fromstring(pdata))) + self.work_queue.put_nowait((metadata, + lxml.etree.XML(pdata, + parser=Bcfg2.Server.XMLParser))) except Full: self.logger.warning("Queue.Full: Failed to load queue data") break @@ -284,7 +298,7 @@ class ThreadedStatistics(Statistics, def run(self): if not self.load(): return - while not self.terminate.isSet(): + while not self.terminate.isSet() and self.work_queue != None: try: (xdata, client) = self.work_queue.get(block=True, timeout=2) except Empty: @@ -294,7 +308,7 @@ class ThreadedStatistics(Statistics, self.logger.error("ThreadedStatistics: %s" % e) continue self.handle_statistic(xdata, client) - if not self.work_queue.empty(): + if self.work_queue != None and not self.work_queue.empty(): self.save() def process_statistics(self, metadata, data): @@ -583,8 +597,9 @@ class XMLFileBacked(FileBacked): def Index(self): """Build local data structures.""" try: - self.xdata = XML(self.data) - except XMLSyntaxError: + self.xdata = lxml.etree.XML(self.data, + parser=Bcfg2.Server.XMLParser) + except lxml.etree.XMLSyntaxError: logger.error("Failed to parse %s" % (self.name)) return self.entries = self.xdata.getchildren() @@ -635,7 +650,8 @@ class SingleXMLFileBacked(XMLFileBacked): def Index(self): """Build local data structures.""" try: - self.xdata = lxml.etree.XML(self.data, base_url=self.name) + self.xdata = lxml.etree.XML(self.data, base_url=self.name, + parser=Bcfg2.Server.XMLParser) except lxml.etree.XMLSyntaxError: err = sys.exc_info()[1] logger.error("Failed to parse %s: %s" % (self.name, err)) @@ -793,7 +809,7 @@ class XMLSrc(XMLFileBacked): return self.items = {} try: - xdata = lxml.etree.XML(data) + xdata = lxml.etree.XML(data, parser=Bcfg2.Server.XMLParser) except lxml.etree.XMLSyntaxError: logger.error("Failed to parse file %s" % (self.name)) return @@ -1118,18 +1134,7 @@ class EntrySet(Debuggable): return cmp(x.specific.prio, y.specific.prio) def bind_info_to_entry(self, entry, metadata): - # first set defaults from global metadata/:info - for key in self.metadata: - entry.set(key, self.metadata[key]) - if self.infoxml: - mdata = {} - self.infoxml.pnode.Match(metadata, mdata, entry=entry) - if 'Info' not in mdata: - logger.error("Failed to set metadata for file %s" % \ - (entry.get('name'))) - raise PluginExecutionError - [entry.attrib.__setitem__(key, value) \ - for (key, value) in list(mdata['Info'][None].items())] + bind_info(entry, metadata, infoxml=self.infoxml, default=self.metadata) def bind_entry(self, entry, metadata): """Return the appropriate interpreted template from the set of available templates.""" |