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 | |
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.
-rw-r--r-- | debian/changelog | 6 | ||||
-rw-r--r-- | schemas/pinning.xsd | 39 | ||||
-rw-r--r-- | schemas/pkgtype.xsd | 1 | ||||
-rw-r--r-- | src/lib/Server/Lint/Validate.py | 1 | ||||
-rw-r--r-- | src/lib/Server/Plugins/Packages/__init__.py | 4 | ||||
-rw-r--r-- | src/lib/Server/Plugins/Pinning.py | 49 |
6 files changed, 97 insertions, 3 deletions
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 <alex@spline.inf.fu-berlin.de> 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 @@ +<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema' + xmlns:py="http://genshi.edgewall.org/"> + + <xsd:annotation> + <xsd:documentation> + XML-Schema-Definition für Properties/pinning.xml + Alexander Sulfrian + </xsd:documentation> + </xsd:annotation> + + <xsd:import namespace="http://genshi.edgewall.org/" + schemaLocation="genshi.xsd"/> + + <xsd:complexType name='packageType'> + <xsd:attribute type='xsd:string' name='name'/> + <xsd:attribute type='xsd:string' name='src'/> + <xsd:attributeGroup ref="py:genshiAttrs"/> + </xsd:complexType> + + <xsd:complexType name='containerType'> + <xsd:choice maxOccurs='unbounded'> + <xsd:element name='Package' type='packageType'/> + <xsd:element name='Client' type='containerType'/> + <xsd:element name='Group' type='containerType'/> + </xsd:choice> + <xsd:attribute name='name' type='xsd:string' use='required'/> + <xsd:attribute name='negate' type='xsd:boolean'/> + </xsd:complexType> + + <xsd:complexType name='propertiesType'> + <xsd:choice minOccurs='0' maxOccurs='unbounded'> + <xsd:element name='Package' type='packageType'/> + <xsd:element name='Client' type='containerType'/> + <xsd:element name='Group' type='containerType'/> + </xsd:choice> + </xsd:complexType> + + <xsd:element name='Properties' type='propertiesType'/> +</xsd:schema> 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 @@ <xsd:attribute type="xsd:string" name="verify" use="optional"/> <xsd:attribute type="PackageGroupTypeEnum" name="type" use="optional"/> - <xsd:attribute type="xsd:string" name="src" use="optional"/> <xsd:attribute type="xsd:boolean" name="recommended" use="optional"/> <xsd:attributeGroup ref="py:genshiAttrs"/> </xsd:complexType> 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) |