summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2013-03-01 03:29:05 +0100
committerAlexander Sulfrian <alexander@sulfrian.net>2013-03-12 03:39:19 +0100
commit0a289059cab2dfd6005b4e8fe6852221b49efcbe (patch)
treef7976ba3f9b2e79aa6c76eb0fa1e6ec9e721b7f3
parent92729db337ea1a4b93bdded48222a9350fa08bcf (diff)
downloadbcfg2-0a289059cab2dfd6005b4e8fe6852221b49efcbe.tar.gz
bcfg2-0a289059cab2dfd6005b4e8fe6852221b49efcbe.tar.bz2
bcfg2-0a289059cab2dfd6005b4e8fe6852221b49efcbe.zip
Plugins/PkgVars: new plugin to set various vars per package
This plugins allows the setting of varius flags per package. It should be used f.e. to specify pinnings for debian packages or use flags and keywords for gentoo packages (needs to be implemented by future Portage plugin).
-rw-r--r--debian/changelog6
-rw-r--r--schemas/pkgtype.xsd1
-rw-r--r--schemas/pkgvars.xsd43
-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/PkgVars.py59
6 files changed, 111 insertions, 3 deletions
diff --git a/debian/changelog b/debian/changelog
index 509726730..f35a4cfba 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+bcfg2 (1.2.3-11) UNRELEASED; urgency=low
+
+ * Plugins/PkgVars: new plugin to set various vars per package
+
+ -- Alexander Sulfrian <alex@spline.inf.fu-berlin.de> Fri, 01 Mar 2013 20:52:30 +0100
+
bcfg2 (1.2.3-9) unstable; urgency=low
* Packages/Apt: add name property to additional_data
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/schemas/pkgvars.xsd b/schemas/pkgvars.xsd
new file mode 100644
index 000000000..dbd02726d
--- /dev/null
+++ b/schemas/pkgvars.xsd
@@ -0,0 +1,43 @@
+<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 PkgVars/*.xml
+ Alexander Sulfrian
+ </xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:import namespace="http://genshi.edgewall.org/"
+ schemaLocation="genshi.xsd"/>
+
+ <xsd:complexType name='pkgVarType'>
+ <xsd:attribute type='xsd:string' name='name'/>
+
+ <xsd:attribute type='xsd:string' name='pin'/>
+ <xsd:attribute type='xsd:string' name='use'/>
+ <xsd:attribute type='xsd:string' name='keywords'/>
+
+ <xsd:attributeGroup ref="py:genshiAttrs"/>
+ </xsd:complexType>
+
+ <xsd:complexType name='containerType'>
+ <xsd:choice maxOccurs='unbounded'>
+ <xsd:element name='Package' type='pkgVarType'/>
+ <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='pkgVarsType'>
+ <xsd:choice minOccurs='0' maxOccurs='unbounded'>
+ <xsd:element name='Package' type='pkgVarType'/>
+ <xsd:element name='Client' type='containerType'/>
+ <xsd:element name='Group' type='containerType'/>
+ </xsd:choice>
+ </xsd:complexType>
+
+ <xsd:element name='PkgVars' type='pkgVarsType'/>
+</xsd:schema>
diff --git a/src/lib/Server/Lint/Validate.py b/src/lib/Server/Lint/Validate.py
index 50c3956a4..24f2b149d 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/PkgVars/*.xml":"%s/pkgvars.xsd",
}
self.filelists = {}
diff --git a/src/lib/Server/Plugins/Packages/__init__.py b/src/lib/Server/Plugins/Packages/__init__.py
index e94b79c6d..427393ea0 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, 'PkgVars'):
+ pinned_src = metadata.PkgVars['pin']
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/PkgVars.py b/src/lib/Server/Plugins/PkgVars.py
new file mode 100644
index 000000000..2bf1b158a
--- /dev/null
+++ b/src/lib/Server/Plugins/PkgVars.py
@@ -0,0 +1,59 @@
+import os
+import re
+import sys
+import copy
+import logging
+import lxml.etree
+import Bcfg2.Server.Plugin
+
+logger = logging.getLogger('Bcfg2.Plugins.PkgVars')
+vars = ['pin', 'use', 'keywords']
+
+class PkgVarsFile(Bcfg2.Server.Plugin.StructFile):
+ def get_additional_data(self, meta):
+ data = self.Match(meta)
+ results = {}
+ for d in data:
+ name = d.get('name', '')
+
+ for v in vars:
+ value = d.get(v, None)
+ if value:
+ results[v][name] = value
+
+ return results
+
+class PkgVarsDirectoryBacked(Bcfg2.Server.Plugin.DirectoryBacked):
+ __child__ = PkgVarsFile
+ patterns = re.compile(r'.*\.xml$')
+
+ def get_additional_data(self, meta):
+ results = {}
+ for v in vars:
+ results[v] = {}
+
+ for files in self.entries:
+ new = self.entries[files].get_additional_data(meta)
+ for x in vars:
+ results[x].update(new[x])
+
+ return results
+
+class PkgVars(Bcfg2.Server.Plugin.Plugin,
+ Bcfg2.Server.Plugin.Connector):
+ name = 'PkgVars'
+ version = '$Revision$'
+
+ def __init__(self, core, datastore):
+ Bcfg2.Server.Plugin.Plugin.__init__(self, core, datastore)
+ Bcfg2.Server.Plugin.Connector.__init__(self)
+ try:
+ self.store = PkgVarsDirectoryBacked(self.data, core.fam)
+ except OSError:
+ e = sys.exc_info()[1]
+ self.logger.error("Error while creating PkgVars 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)