summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2013-03-01 03:29:05 +0100
committerAlexander Sulfrian <alexander@sulfrian.net>2013-03-01 04:10:01 +0100
commitc876d0563bb92e5ce7d037ab6a89eb0e0bd69160 (patch)
tree1688502c44b53c200514b0293ec7ce5231b22ad7 /src
parent61bf996fd094b954b967829411121b9ef5922526 (diff)
downloadbcfg2-c876d0563bb92e5ce7d037ab6a89eb0e0bd69160.tar.gz
bcfg2-c876d0563bb92e5ce7d037ab6a89eb0e0bd69160.tar.bz2
bcfg2-c876d0563bb92e5ce7d037ab6a89eb0e0bd69160.zip
Pinning: new pluing to handle the pinningsdebian/1.2.3-8
The pinnings of packages to a specific source are now handled with a specific plugin. This has the advantage that genshi templates could be generated out of the configured pinnings.
Diffstat (limited to 'src')
-rw-r--r--src/lib/Server/Lint/Validate.py1
-rw-r--r--src/lib/Server/Plugins/Packages/__init__.py4
-rw-r--r--src/lib/Server/Plugins/Pinning.py49
3 files changed, 52 insertions, 2 deletions
diff --git a/src/lib/Server/Lint/Validate.py b/src/lib/Server/Lint/Validate.py
index 50c3956a4..a70a6c795 100644
--- a/src/lib/Server/Lint/Validate.py
+++ b/src/lib/Server/Lint/Validate.py
@@ -30,6 +30,7 @@ class Validate(Bcfg2.Server.Lint.ServerlessPlugin):
"%s/GroupPatterns/config.xml":"%s/grouppatterns.xsd",
"%s/NagiosGen/config.xml":"%s/nagiosgen.xsd",
"%s/FileProbes/config.xml":"%s/fileprobes.xsd",
+ "%s/Pinning/*.xml":"%s/pinning.xsd",
}
self.filelists = {}
diff --git a/src/lib/Server/Plugins/Packages/__init__.py b/src/lib/Server/Plugins/Packages/__init__.py
index e94b79c6d..7bb97b9ee 100644
--- a/src/lib/Server/Plugins/Packages/__init__.py
+++ b/src/lib/Server/Plugins/Packages/__init__.py
@@ -152,13 +152,13 @@ class Packages(Bcfg2.Server.Plugin.Plugin,
pinned_src = dict()
recommended = dict()
to_remove = []
+ if hasattr(metadata, 'Pinning'):
+ pinned_src = metadata.Pinning
for struct in structures:
for pkg in struct.xpath('//Package | //BoundPackage'):
if pkg.get("name"):
initial.add(pkg.get("name"))
- if pkg.get("src"):
- pinned_src[pkg.get("name")] = pkg.get("src")
if pkg.get("recommended"):
recommended[pkg.get("name")] = pkg.get("recommended")
elif pkg.get("group"):
diff --git a/src/lib/Server/Plugins/Pinning.py b/src/lib/Server/Plugins/Pinning.py
new file mode 100644
index 000000000..474ece41b
--- /dev/null
+++ b/src/lib/Server/Plugins/Pinning.py
@@ -0,0 +1,49 @@
+import os
+import re
+import sys
+import copy
+import logging
+import lxml.etree
+import Bcfg2.Server.Plugin
+
+logger = logging.getLogger('Bcfg2.Plugins.Pinnings')
+
+class PinningFile(Bcfg2.Server.Plugin.StructFile):
+ """Class for pinning files."""
+ def get_additional_data(self, meta):
+ data = self.Match(meta)
+ results = {}
+ for d in data:
+ name = d.get('name', '')
+ src = d.get('src', '')
+ results[name] = src
+ return results
+
+class PinDirectoryBacked(Bcfg2.Server.Plugin.DirectoryBacked):
+ __child__ = PinningFile
+ patterns = re.compile(r'.*\.xml$')
+
+ def get_additional_data(self, meta):
+ results = {}
+ for files in self.entries:
+ results.update(self.entries[files].get_additional_data(meta))
+ return results
+
+class Pinning(Bcfg2.Server.Plugin.Plugin,
+ Bcfg2.Server.Plugin.Connector):
+ name = 'Pinning'
+ version = '$Revision$'
+
+ def __init__(self, core, datastore):
+ Bcfg2.Server.Plugin.Plugin.__init__(self, core, datastore)
+ Bcfg2.Server.Plugin.Connector.__init__(self)
+ try:
+ self.store = PinDirectoryBacked(self.data, core.fam)
+ except OSError:
+ e = sys.exc_info()[1]
+ self.logger.error("Error while creating Pinning store: %s %s" %
+ (e.strerror, e.filename))
+ raise Bcfg2.Server.Plugin.PluginInitError
+
+ def get_additional_data(self, meta):
+ return self.store.get_additional_data(meta)