diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/Server/Core.py | 14 | ||||
-rw-r--r-- | src/lib/Server/Plugins/Bundler.py | 2 | ||||
-rw-r--r-- | src/lib/Server/Plugins/GBundler.py | 38 | ||||
-rw-r--r-- | src/lib/Server/Plugins/SGenshi.py | 3 | ||||
-rw-r--r-- | src/lib/Server/Plugins/__init__.py | 4 |
5 files changed, 52 insertions, 9 deletions
diff --git a/src/lib/Server/Core.py b/src/lib/Server/Core.py index a99af4aa9..74839c25e 100644 --- a/src/lib/Server/Core.py +++ b/src/lib/Server/Core.py @@ -1,5 +1,5 @@ '''Bcfg2.Server.Core provides the runtime support for bcfg2 modules''' -__revision__ = '$Revision: 5014 $' +__revision__ = '$Revision$' from ConfigParser import ConfigParser, NoSectionError, NoOptionError c = ConfigParser() @@ -117,9 +117,15 @@ class Core(object): def GetStructures(self, metadata): '''Get all structures for client specified by metadata''' - return reduce(lambda x, y:x+y, - [struct.BuildStructures(metadata) for struct \ - in self.structures], []) + structures = reduce(lambda x, y:x+y, + [struct.BuildStructures(metadata) for struct \ + in self.structures], []) + sbundles = [b.get('name') for b in structures if b.tag == 'Bundle'] + missing = [b for b in metadata.bundles if b not in sbundles] + if missing: + logger.error("Client %s configuration missing bundles: %s" \ + % (metadata.hostname, ':'.join(missing))) + return structures def BindStructure(self, structure, metadata): '''Bind a complete structure''' diff --git a/src/lib/Server/Plugins/Bundler.py b/src/lib/Server/Plugins/Bundler.py index fe73ab453..8c89d041f 100644 --- a/src/lib/Server/Plugins/Bundler.py +++ b/src/lib/Server/Plugins/Bundler.py @@ -26,8 +26,6 @@ class Bundler(Bcfg2.Server.Plugin.Plugin, bundleset = [] for bundlename in metadata.bundles: if not ("%s.xml" % bundlename) in self.entries: - self.logger.error("Client %s requested nonexistent bundle %s" % \ - (metadata.hostname, bundlename)) continue bundle = lxml.etree.Element('Bundle', name=bundlename) [bundle.append(copy.deepcopy(item)) diff --git a/src/lib/Server/Plugins/GBundler.py b/src/lib/Server/Plugins/GBundler.py new file mode 100644 index 000000000..309f04b3e --- /dev/null +++ b/src/lib/Server/Plugins/GBundler.py @@ -0,0 +1,38 @@ + +import logging, re +import SGenshi + +pattern = '(.*/)?(\S+)\.xml(\.((H_(?P<hostname>\S+))|' +pattern += '(G(?P<prio>\d+)_(?P<group>\S+))))?$' + +matcher = re.compile(pattern) + +logger = logging.getLogger('GBundler') + +class GBundlerEntrySet(SGenshi.SGenshiEntrySet): + def BuildStructures(self, metadata): + '''Build SGenshi structures''' + ret = [] + found = [] + build = [] + matching = self.get_matching(metadata) + matching.sort(lambda x,y: cmp(x.specific, y.specific)) + for entry in matching[:]: + rem = matcher.match(entry.name) + bname = rem.group(2) + if bname in metadata.bundles and bname not in found: + found.append(bname) + build.append(entry) + + for entry in build: + try: + ret.append(entry.get_xml_value(metadata)) + except genshi.template.TemplateError, terror: + logger.error('Genshi template error: %s' % terror) + logger.error("GBundler: Failed to template file %s" % entry.name) + return ret + +class GBundler(GBundlerEntrySet, SGenshi.SGenshi): + name = 'GBundler' + __version__ = '$Revision: $' + diff --git a/src/lib/Server/Plugins/SGenshi.py b/src/lib/Server/Plugins/SGenshi.py index a4b811f21..e7e0b94b8 100644 --- a/src/lib/Server/Plugins/SGenshi.py +++ b/src/lib/Server/Plugins/SGenshi.py @@ -58,7 +58,8 @@ class SGenshi(SGenshiEntrySet, try: SGenshiEntrySet.__init__(self, self.data, self.core.fam, core.encoding) except: - logger.error("Failed to load SGenshi repository; disabling SGenshi") + logger.error("Failed to load %s repository; disabling %s" \ + % (self.name, self.name)) raise Bcfg2.Server.Plugin.PluginInitError diff --git a/src/lib/Server/Plugins/__init__.py b/src/lib/Server/Plugins/__init__.py index ffab21b9a..22b16a7a0 100644 --- a/src/lib/Server/Plugins/__init__.py +++ b/src/lib/Server/Plugins/__init__.py @@ -1,7 +1,7 @@ '''imports for Bcfg2.Server.Plugins''' __revision__ = '$Revision$' -__all__ = ['Account', 'Base', 'Bundler', 'Cfg', 'Decisions', 'Hostbase', - 'Metadata', 'NagiosGen', 'Probes', +__all__ = ['Account', 'Base', 'Bundler', 'Cfg', 'Decisions', 'GBundler', + 'Hostbase', 'Metadata', 'NagiosGen', 'Probes', 'Pkgmgr', 'Rules', 'SSHbase', 'Statistics', 'Svcmgr', 'TCheetah', 'SGenshi', 'TGenshi', 'Vhost'] |