From da1065ef071514f97d6bfbe104bd1040503da4aa Mon Sep 17 00:00:00 2001 From: Narayan Desai Date: Thu, 15 Jan 2009 03:11:16 +0000 Subject: add GBundler plugin (like SGenshi, but works like Bundler) git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@5025 ce84e21b-d406-0410-9b95-82705330c041 --- src/lib/Server/Core.py | 14 ++++++++++---- src/lib/Server/Plugins/Bundler.py | 2 -- src/lib/Server/Plugins/GBundler.py | 38 ++++++++++++++++++++++++++++++++++++++ src/lib/Server/Plugins/SGenshi.py | 3 ++- src/lib/Server/Plugins/__init__.py | 4 ++-- 5 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 src/lib/Server/Plugins/GBundler.py (limited to 'src') 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\S+))|' +pattern += '(G(?P\d+)_(?P\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'] -- cgit v1.2.3-1-g7c22