summaryrefslogtreecommitdiffstats
path: root/src/lib/Bcfg2/Server/Plugins/Rules.py
diff options
context:
space:
mode:
authorSol Jerome <sol.jerome@gmail.com>2012-03-24 11:20:07 -0500
committerSol Jerome <sol.jerome@gmail.com>2012-03-24 11:20:07 -0500
commitdab1d03d81c538966d03fb9318a4588a9e803b44 (patch)
treef51e27fa55887e9fb961766805fe43f0da56c5b9 /src/lib/Bcfg2/Server/Plugins/Rules.py
parent5cd6238df496a3cea178e4596ecd87967cce1ce6 (diff)
downloadbcfg2-dab1d03d81c538966d03fb9318a4588a9e803b44.tar.gz
bcfg2-dab1d03d81c538966d03fb9318a4588a9e803b44.tar.bz2
bcfg2-dab1d03d81c538966d03fb9318a4588a9e803b44.zip
Allow to run directly from a git checkout (#1037)
Signed-off-by: Sol Jerome <sol.jerome@gmail.com>
Diffstat (limited to 'src/lib/Bcfg2/Server/Plugins/Rules.py')
-rw-r--r--src/lib/Bcfg2/Server/Plugins/Rules.py55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/lib/Bcfg2/Server/Plugins/Rules.py b/src/lib/Bcfg2/Server/Plugins/Rules.py
new file mode 100644
index 000000000..b80ef351a
--- /dev/null
+++ b/src/lib/Bcfg2/Server/Plugins/Rules.py
@@ -0,0 +1,55 @@
+"""This generator provides rule-based entry mappings."""
+
+import re
+import Bcfg2.Server.Plugin
+
+class RulesConfig(Bcfg2.Server.Plugin.SimpleConfig):
+ _required = False
+
+class Rules(Bcfg2.Server.Plugin.PrioDir):
+ """This is a generator that handles service assignments."""
+ name = 'Rules'
+ __author__ = 'bcfg-dev@mcs.anl.gov'
+
+ def __init__(self, core, datastore):
+ Bcfg2.Server.Plugin.PrioDir.__init__(self, core, datastore)
+ self.config = RulesConfig(self)
+ self._regex_cache = dict()
+
+ def HandlesEntry(self, entry, metadata):
+ if entry.tag in self.Entries:
+ return self._matches(entry, metadata,
+ self.Entries[entry.tag].keys())
+ return False
+
+ def HandleEntry(self, entry, metadata):
+ return self.BindEntry(entry, metadata)
+
+ def BindEntry(self, entry, metadata):
+ attrs = self.get_attrs(entry, metadata)
+ for key, val in list(attrs.items()):
+ if key not in entry.attrib:
+ entry.attrib[key] = val
+
+ def _matches(self, entry, metadata, rules):
+ if Bcfg2.Server.Plugin.PrioDir._matches(self, entry, metadata, rules):
+ return True
+ elif (entry.tag == "Path" and
+ ((entry.get('name').endswith("/") and
+ entry.get('name').rstrip("/") in rules) or
+ (not entry.get('name').endswith("/") and
+ entry.get('name') + '/' in rules))):
+ # special case for Path tags:
+ # http://trac.mcs.anl.gov/projects/bcfg2/ticket/967
+ return True
+ elif self._regex_enabled:
+ # attempt regular expression matching
+ for rule in rules:
+ if rule not in self._regex_cache:
+ self._regex_cache[rule] = re.compile("%s$" % rule)
+ if self._regex_cache[rule].match(entry.get('name')):
+ return True
+ return False
+
+ def _regex_enabled(self):
+ return self.config.getboolean("rules", "regex", default=False)