From f7c16272eed2b130e05ee23509cbee35575bc411 Mon Sep 17 00:00:00 2001 From: Narayan Desai Date: Wed, 15 Jul 2009 12:04:19 +0000 Subject: GroupPatterns plugin: initial implementation git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@5327 ce84e21b-d406-0410-9b95-82705330c041 --- src/lib/Server/Plugins/GroupPatterns.py | 68 +++++++++++++++++++++++++++++++++ src/lib/Server/Plugins/__init__.py | 3 +- 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/lib/Server/Plugins/GroupPatterns.py (limited to 'src/lib') diff --git a/src/lib/Server/Plugins/GroupPatterns.py b/src/lib/Server/Plugins/GroupPatterns.py new file mode 100644 index 000000000..1a5d590c1 --- /dev/null +++ b/src/lib/Server/Plugins/GroupPatterns.py @@ -0,0 +1,68 @@ + +import re, lxml.etree +import Bcfg2.Server.Plugin + +class PatternMap(object): + def __init__(self, pattern, groupname): + self.pattern = pattern + self.re = re.compile(pattern) + self.groupname = groupname + + def process(self, name): + match = self.re.match(name) + if not match: + return None + ret = self.groupname + sub = match.groups() + for idx in range(len(sub)): + ret = ret.replace('$%s' % (idx+1), sub[idx]) + return ret + +class PatternFile(Bcfg2.Server.Plugin.SingleXMLFileBacked): + def __init__(self, filename, fam): + Bcfg2.Server.Plugin.SingleXMLFileBacked.__init__(self, filename, fam) + self.patterns = [] + + def Index(self): + self.patterns = [] + try: + parsed = lxml.etree.XML(self.data) + except: + Bcfg2.Server.Plugin.logger.error("Failed to read file %s" % self.name) + return + for entry in parsed.findall('GroupPattern'): + try: + pat = entry.find('NamePattern').text + grp = entry.find('Group').text + self.patterns.append(PatternMap(pat, grp)) + except: + Bcfg2.Server.Plugin.logger.error(\ + "GroupPatterns: Failed to initialize pattern %s" % \ + (entry.get('pattern'))) + + def process_patterns(self, hostname): + ret = [] + for pattern in self.patterns: + try: + gn = pattern.process(hostname) + if gn: + ret.append(gn) + except: + Bcfg2.Server.Plugin.logger.error(\ + "GroupPatterns: Failed to process pattern %s for %s" % \ + (pattern.pattern, hostname), exc_info=1) + return ret + +class GroupPatterns(Bcfg2.Server.Plugin.Plugin, + Bcfg2.Server.Plugin.Connector): + name = "GroupPatterns" + experimental = True + + def __init__(self, core, datastore): + Bcfg2.Server.Plugin.Plugin.__init__(self, core, datastore) + Bcfg2.Server.Plugin.Connector.__init__(self) + self.config = PatternFile(self.data + '/config.xml', + core.fam) + + def get_additional_groups(self, metadata): + return self.config.process_patterns(metadata.hostname) diff --git a/src/lib/Server/Plugins/__init__.py b/src/lib/Server/Plugins/__init__.py index 48b6caffb..a8e7c3f63 100644 --- a/src/lib/Server/Plugins/__init__.py +++ b/src/lib/Server/Plugins/__init__.py @@ -4,4 +4,5 @@ __revision__ = '$Revision$' __all__ = ['Account', 'Base', 'Bundler', 'Cfg', 'Decisions', 'GBundler', 'Git', 'Hostbase', 'Metadata', 'NagiosGen', 'Packages', 'Properties', 'Probes', 'Pkgmgr', 'Rules', 'SSHbase', 'Snapshots' 'Statistics', - 'Svcmgr', 'Svn', 'TCheetah', 'Trigger', 'SGenshi', 'TGenshi', 'Vhost'] + 'Svcmgr', 'Svn', 'TCheetah', 'Trigger', 'SGenshi', 'TGenshi', + 'GroupPatterns'] -- cgit v1.2.3-1-g7c22