From c876d0563bb92e5ce7d037ab6a89eb0e0bd69160 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Fri, 1 Mar 2013 03:29:05 +0100 Subject: Pinning: new pluing to handle the pinnings 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. --- debian/changelog | 6 ++++ schemas/pinning.xsd | 39 +++++++++++++++++++++++ schemas/pkgtype.xsd | 1 - src/lib/Server/Lint/Validate.py | 1 + src/lib/Server/Plugins/Packages/__init__.py | 4 +-- src/lib/Server/Plugins/Pinning.py | 49 +++++++++++++++++++++++++++++ 6 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 schemas/pinning.xsd create mode 100644 src/lib/Server/Plugins/Pinning.py diff --git a/debian/changelog b/debian/changelog index 8f2659589..64d35d2d7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +bcfg2 (1.2.3-8) unstable; urgency=low + + * Pinning: new pluing to handle the pinnings + + -- Alexander Sulfrian Fri, 01 Mar 2013 03:31:39 +0100 + bcfg2 (1.2.3-7) unstable; urgency=low * Packages/Apt: add pin attribute for extra pinning information diff --git a/schemas/pinning.xsd b/schemas/pinning.xsd new file mode 100644 index 000000000..4bef35ed4 --- /dev/null +++ b/schemas/pinning.xsd @@ -0,0 +1,39 @@ + + + + + XML-Schema-Definition für Properties/pinning.xml + Alexander Sulfrian + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/schemas/pkgtype.xsd b/schemas/pkgtype.xsd index 2dceb8419..f35706658 100644 --- a/schemas/pkgtype.xsd +++ b/schemas/pkgtype.xsd @@ -19,7 +19,6 @@ - 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) -- cgit v1.2.3-1-g7c22