summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/Server/Plugins/GroupPatterns.py68
-rw-r--r--src/lib/Server/Plugins/__init__.py3
2 files changed, 70 insertions, 1 deletions
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']