summaryrefslogtreecommitdiffstats
path: root/src/lib/Bcfg2/Client/Tools/APT.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/Bcfg2/Client/Tools/APT.py')
-rw-r--r--src/lib/Bcfg2/Client/Tools/APT.py36
1 files changed, 33 insertions, 3 deletions
diff --git a/src/lib/Bcfg2/Client/Tools/APT.py b/src/lib/Bcfg2/Client/Tools/APT.py
index 39816403a..3fc0e310d 100644
--- a/src/lib/Bcfg2/Client/Tools/APT.py
+++ b/src/lib/Bcfg2/Client/Tools/APT.py
@@ -26,6 +26,7 @@ class APT(Bcfg2.Client.Tools.Tool):
self.etc_path = setup.get('apt_etc_path', '/etc')
self.debsums = '%s/bin/debsums' % self.install_path
self.aptget = '%s/bin/apt-get' % self.install_path
+ self.aptmark = '%s/bin/apt-mark' % self.install_path
self.dpkg = '%s/bin/dpkg' % self.install_path
self.__execs__ = [self.debsums, self.aptget, self.dpkg]
@@ -69,6 +70,23 @@ class APT(Bcfg2.Client.Tools.Tool):
self.logger.info("Failed to initialize APT cache: %s" % e)
raise Bcfg2.Client.Tools.ToolInstantiationError
self.pkg_cache.update()
+ # mark dependencies as being automatically installed and vice versa
+ mark = []
+ unmark = []
+ try:
+ installed_pkgs = [p.name for p in self.pkg_cache if p.is_installed]
+ except AttributeError:
+ installed_pkgs = [p.name for p in self.pkg_cache if p.isInstalled]
+ for pkg in self.getSupportedEntries():
+ if pkg.get('name') in installed_pkgs:
+ if pkg.get('origin') == 'Packages':
+ mark.append(pkg.get('name'))
+ else:
+ unmark.append(pkg.get('name'))
+ if mark:
+ self.cmd.run("%s markauto %s" % (self.aptmark, (" ".join(mark))))
+ if unmark:
+ self.cmd.run("%s unmarkauto %s" % (self.aptmark, (" ".join(unmark))))
self.pkg_cache = apt.cache.Cache()
if 'req_reinstall_pkgs' in dir(self.pkg_cache):
self._newapi = True
@@ -88,6 +106,11 @@ class APT(Bcfg2.Client.Tools.Tool):
type='deb', version=version) \
for (name, version) in extras]
+ def Inventory(self, states, structures=[]):
+ # reload pkg cache
+ self.pkg_cache.open(None)
+ Bcfg2.Client.Tools.Tool.Inventory(self, states, structures)
+
def VerifyDebsums(self, entry, modlist):
output = \
self.cmd.run("%s -as %s" %
@@ -163,7 +186,7 @@ class APT(Bcfg2.Client.Tools.Tool):
else:
installed_version = pkg.installedVersion
candidate_version = pkg.candidateVersion
- if entry.get('version') == 'auto':
+ if entry.get('version').startswith('auto'):
if self._newapi:
is_upgradable = self.pkg_cache._depcache.is_upgradable(pkg._pkg)
else:
@@ -172,8 +195,10 @@ class APT(Bcfg2.Client.Tools.Tool):
desiredVersion = candidate_version
else:
desiredVersion = installed_version
- elif entry.get('version') == 'any':
+ entry.set('version', "auto: %s" % desiredVersion)
+ elif entry.get('version').startswith('any'):
desiredVersion = installed_version
+ entry.set('version', "any: %s" % desiredVersion)
else:
desiredVersion = entry.get('version')
if desiredVersion != installed_version:
@@ -226,7 +251,7 @@ class APT(Bcfg2.Client.Tools.Tool):
if not self.pkg_cache.has_key(pkg.get('name')):
self.logger.error("APT has no information about package %s" % (pkg.get('name')))
continue
- if pkg.get('version') in ['auto', 'any']:
+ if any([pkg.get('version').startswith(v) for v in ['auto', 'any']]):
if self._newapi:
try:
ipkgs.append("%s=%s" % (pkg.get('name'),
@@ -262,10 +287,15 @@ class APT(Bcfg2.Client.Tools.Tool):
self.logger.error("APT command failed")
self.pkg_cache = apt.cache.Cache()
self.extra = self.FindExtra()
+ mark = []
for package in packages:
states[package] = self.VerifyPackage(package, [], checksums=False)
if states[package]:
self.modified.append(package)
+ if package.get('origin') == 'Packages':
+ mark.append(package.get('name'))
+ if mark:
+ self.cmd.run("%s markauto %s" % (self.aptmark, (" ".join(mark))))
def VerifyPath(self, entry, _):
"""Do nothing here since we only verify Path type=ignore."""