From 9d3a445882c99a7d5a7aa929dc00abe1b9b20d88 Mon Sep 17 00:00:00 2001 From: Sol Jerome Date: Tue, 17 Apr 2012 13:35:37 -0500 Subject: Packages: Add Essential packages to specification (#1084) Signed-off-by: Sol Jerome --- doc/server/plugins/generators/packages.txt | 23 ++++++++++++++-------- src/lib/Bcfg2/Server/Plugins/Packages/Apt.py | 8 +++++--- .../Bcfg2/Server/Plugins/Packages/Collection.py | 6 ++++++ src/lib/Bcfg2/Server/Plugins/Packages/Source.py | 1 + src/lib/Bcfg2/Server/Plugins/Packages/__init__.py | 4 +++- 5 files changed, 30 insertions(+), 12 deletions(-) diff --git a/doc/server/plugins/generators/packages.txt b/doc/server/plugins/generators/packages.txt index e4035053a..2bc3dab31 100644 --- a/doc/server/plugins/generators/packages.txt +++ b/doc/server/plugins/generators/packages.txt @@ -205,14 +205,13 @@ something like this:: .. versionadded:: 1.1.0 - The default behavior of the Packages plugin is to not make - any assumptions about which packages you want to have added - automatically. For that reason, neither **Recommended** nor - **Suggested** packages are added as dependencies by default. You - will notice that the default behavior for apt is to add Recommended - packages as dependencies. You can configure the Packages plugin to - add recommended packages by adding the ``recommended`` attribute, - e.g.: + The default behavior of the Packages plugin is to not make any + assumptions about which packages you want to have added automatically + [#f1]_. For that reason, neither **Recommended** nor **Suggested** + packages are added as dependencies by default. You will notice + that the default behavior for apt is to add Recommended packages as + dependencies. You can configure the Packages plugin to add recommended + packages by adding the ``recommended`` attribute, e.g.: .. code-block:: xml @@ -221,6 +220,14 @@ something like this:: .. warning:: You must regenerate the Packages cache when adding or removing the recommended attribute. + .. [#f1] Bcfg2 will by default add **Essential** packages to the + client specification. You can disable this behavior by + setting the ``essential`` attribute to *false*: + + .. code-block:: xml + + + Yum sources can be similarly specified:: diff --git a/src/lib/Bcfg2/Server/Plugins/Packages/Apt.py b/src/lib/Bcfg2/Server/Plugins/Packages/Apt.py index f76bf7fa1..cbe2b4f2c 100644 --- a/src/lib/Bcfg2/Server/Plugins/Packages/Apt.py +++ b/src/lib/Bcfg2/Server/Plugins/Packages/Apt.py @@ -12,6 +12,7 @@ class AptCollection(Collection): class AptSource(Source): basegroups = ['apt', 'debian', 'ubuntu', 'nexenta'] ptype = 'deb' + essentialpkgs = set() def __init__(self, basepath, xsource, config): Source.__init__(self, basepath, xsource, config) @@ -50,10 +51,9 @@ class AptSource(Source): def read_files(self): bdeps = dict() bprov = dict() + depfnames = ['Depends', 'Pre-Depends'] if self.recommended: - depfnames = ['Depends', 'Pre-Depends', 'Recommends'] - else: - depfnames = ['Depends', 'Pre-Depends'] + depfnames.append('Recommends') for fname in self.files: if not self.rawurl: barch = [x @@ -77,6 +77,8 @@ class AptSource(Source): pkgname = words[1].strip().rstrip() self.pkgnames.add(pkgname) bdeps[barch][pkgname] = [] + elif words[0] == 'Essential' and self.essential: + self.essentialpkgs.add(pkgname) elif words[0] in depfnames: vindex = 0 for dep in words[1].split(','): diff --git a/src/lib/Bcfg2/Server/Plugins/Packages/Collection.py b/src/lib/Bcfg2/Server/Plugins/Packages/Collection.py index 59c50fe8b..959dac03b 100644 --- a/src/lib/Bcfg2/Server/Plugins/Packages/Collection.py +++ b/src/lib/Bcfg2/Server/Plugins/Packages/Collection.py @@ -97,6 +97,12 @@ class Collection(Bcfg2.Server.Plugin.Debuggable): return source.get_deps(self.metadata, package) return [] + def get_essential(self): + essential = set() + for source in self.sources: + essential |= source.essentialpkgs + return essential + def get_provides(self, package): for source in self.sources: providers = source.get_provides(self.metadata, package) diff --git a/src/lib/Bcfg2/Server/Plugins/Packages/Source.py b/src/lib/Bcfg2/Server/Plugins/Packages/Source.py index b33fde60a..5394a4bbd 100644 --- a/src/lib/Bcfg2/Server/Plugins/Packages/Source.py +++ b/src/lib/Bcfg2/Server/Plugins/Packages/Source.py @@ -54,6 +54,7 @@ class Source(Bcfg2.Server.Plugin.Debuggable): self.gpgkeys = [el.text for el in xsource.findall("GPGKey")] + self.essential = xsource.get('essential', 'true').lower() == 'true' self.recommended = xsource.get('recommended', 'false').lower() == 'true' self.rawurl = xsource.get('rawurl', '') diff --git a/src/lib/Bcfg2/Server/Plugins/Packages/__init__.py b/src/lib/Bcfg2/Server/Plugins/Packages/__init__.py index 0d5e7d50f..e4793a28d 100644 --- a/src/lib/Bcfg2/Server/Plugins/Packages/__init__.py +++ b/src/lib/Bcfg2/Server/Plugins/Packages/__init__.py @@ -146,6 +146,8 @@ class Packages(Bcfg2.Server.Plugin.Plugin, initial = set() # base is the set of initial packages with groups expanded base = set() + # essential pkgs are those marked as such by the distribution + essential = collection.get_essential() to_remove = [] for struct in structures: for pkg in struct.xpath('//Package | //BoundPackage'): @@ -167,7 +169,7 @@ class Packages(Bcfg2.Server.Plugin.Plugin, else: self.logger.error("Packages: Malformed Package: %s" % lxml.etree.tostring(pkg)) - base.update(initial) + base.update(initial | essential) for el in to_remove: el.getparent().remove(el) -- cgit v1.2.3-1-g7c22