diff options
author | Alexander Sulfrian <alexander@sulfrian.net> | 2013-03-01 03:29:05 +0100 |
---|---|---|
committer | Alexander Sulfrian <alexander@sulfrian.net> | 2013-03-12 03:39:19 +0100 |
commit | 0a289059cab2dfd6005b4e8fe6852221b49efcbe (patch) | |
tree | f7976ba3f9b2e79aa6c76eb0fa1e6ec9e721b7f3 /src | |
parent | 92729db337ea1a4b93bdded48222a9350fa08bcf (diff) | |
download | bcfg2-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).
Diffstat (limited to 'src')
-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/PkgVars.py | 59 |
3 files changed, 62 insertions, 2 deletions
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) |