diff options
author | Alexander Sulfrian <alexander@sulfrian.net> | 2013-03-01 03:29:05 +0100 |
---|---|---|
committer | Alexander Sulfrian <alexander@sulfrian.net> | 2013-03-01 04:10:01 +0100 |
commit | c876d0563bb92e5ce7d037ab6a89eb0e0bd69160 (patch) | |
tree | 1688502c44b53c200514b0293ec7ce5231b22ad7 /src/lib/Server/Plugins | |
parent | 61bf996fd094b954b967829411121b9ef5922526 (diff) | |
download | bcfg2-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/lib/Server/Plugins')
-rw-r--r-- | src/lib/Server/Plugins/Packages/__init__.py | 4 | ||||
-rw-r--r-- | src/lib/Server/Plugins/Pinning.py | 49 |
2 files changed, 51 insertions, 2 deletions
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) |