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.py158
1 files changed, 59 insertions, 99 deletions
diff --git a/src/lib/Bcfg2/Client/Tools/APT.py b/src/lib/Bcfg2/Client/Tools/APT.py
index 1d9b0dd70..abc76ef1c 100644
--- a/src/lib/Bcfg2/Client/Tools/APT.py
+++ b/src/lib/Bcfg2/Client/Tools/APT.py
@@ -5,28 +5,36 @@ import sys
import apt.cache
+import Bcfg2.Options
import Bcfg2.Client.Tools
class APT(Bcfg2.Client.Tools.Tool):
- """The Debian toolset implements package and service operations and
- inherits the rest from Toolset.Toolset.
+ """The Debian toolset implements package and service operations
+ and inherits the rest from Tools.Tool."""
+
+ options = Bcfg2.Client.Tools.Tool.options + [
+ Bcfg2.Options.PathOption(
+ cf=('APT', 'install_path'),
+ default='/usr', dest='apt_install_path',
+ help='Apt tools install path'),
+ Bcfg2.Options.PathOption(
+ cf=('APT', 'var_path'), default='/var', dest='apt_var_path',
+ help='Apt tools var path'),
+ Bcfg2.Options.PathOption(
+ cf=('APT', 'etc_path'), default='/etc', dest='apt_etc_path',
+ help='System etc path')]
- """
- name = 'APT'
__execs__ = []
__handles__ = [('Package', 'deb'), ('Path', 'ignore')]
__req__ = {'Package': ['name', 'version'], 'Path': ['type']}
- def __init__(self, logger, setup, config):
- Bcfg2.Client.Tools.Tool.__init__(self, logger, setup, config)
+ def __init__(self, config):
+ Bcfg2.Client.Tools.Tool.__init__(self, config)
- self.install_path = setup.get('apt_install_path', '/usr')
- self.var_path = setup.get('apt_var_path', '/var')
- 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.dpkg = '%s/bin/dpkg' % self.install_path
+ self.debsums = '%s/bin/debsums' % Bcfg2.Options.setup.apt_install_path
+ self.aptget = '%s/bin/apt-get' % Bcfg2.Options.setup.apt_install_path
+ self.dpkg = '%s/bin/dpkg' % Bcfg2.Options.setup.apt_install_path
self.__execs__ = [self.debsums, self.aptget, self.dpkg]
path_entries = os.environ['PATH'].split(':')
@@ -38,7 +46,7 @@ class APT(Bcfg2.Client.Tools.Tool):
'-o DPkg::Options::=--force-confmiss ' + \
'--reinstall ' + \
'--force-yes '
- if not self.setup['debug']:
+ if not Bcfg2.Options.setup.debug:
self.pkgcmd += '-q=2 '
self.pkgcmd += '-y install %s'
self.ignores = [entry.get('name') for struct in config
@@ -46,22 +54,25 @@ class APT(Bcfg2.Client.Tools.Tool):
if entry.tag == 'Path' and
entry.get('type') == 'ignore']
self.__important__ = self.__important__ + [
- "%s/cache/debconf/config.dat" % self.var_path,
- "%s/cache/debconf/templates.dat" % self.var_path,
+ "%s/cache/debconf/config.dat" % Bcfg2.Options.setup.apt_var_path,
+ "%s/cache/debconf/templates.dat" %
+ Bcfg2.Options.setup.apt_var_path,
'/etc/passwd', '/etc/group',
- '%s/apt/apt.conf' % self.etc_path,
- '%s/dpkg/dpkg.cfg' % self.etc_path] + \
- [entry.get('name') for struct in config for entry in struct
+ '%s/apt/apt.conf' % Bcfg2.Options.setup.apt_etc_path,
+ '%s/dpkg/dpkg.cfg' % Bcfg2.Options.setup.apt_etc_path] + \
+ [entry.get('name') for struct in config
+ for entry in struct
if (entry.tag == 'Path' and
entry.get('name').startswith(
- '%s/apt/sources.list' % self.etc_path))]
+ '%s/apt/sources.list' %
+ Bcfg2.Options.setup.apt_etc_path))]
self.nonexistent = [entry.get('name') for struct in config
for entry in struct
if (entry.tag == 'Path' and
entry.get('type') == 'nonexistent')]
os.environ["DEBIAN_FRONTEND"] = 'noninteractive'
self.actions = {}
- if self.setup['kevlar'] and not self.setup['dryrun']:
+ if Bcfg2.Options.setup.kevlar and not Bcfg2.Options.setup.dry_run:
self.cmd.run("%s --force-confold --configure --pending" %
self.dpkg)
self.cmd.run("%s clean" % self.aptget)
@@ -77,22 +88,14 @@ class APT(Bcfg2.Client.Tools.Tool):
err = sys.exc_info()[1]
self.logger.info("Failed to update APT cache: %s" % err)
self.pkg_cache = apt.cache.Cache()
- if 'req_reinstall_pkgs' in dir(self.pkg_cache):
- self._newapi = True
- else:
- self._newapi = False
def FindExtra(self):
"""Find extra packages."""
packages = [entry.get('name') for entry in self.getSupportedEntries()]
- if self._newapi:
- extras = [(p.name, p.installed.version) for p in self.pkg_cache
- if p.is_installed and p.name not in packages]
- else:
- extras = [(p.name, p.installedVersion) for p in self.pkg_cache
- if p.isInstalled and p.name not in packages]
- return [Bcfg2.Client.XML.Element('Package', name=name,
- type='deb', version=version)
+ extras = [(p.name, p.installed.version) for p in self.pkg_cache
+ if p.is_installed and p.name not in packages]
+ return [Bcfg2.Client.XML.Element('Package', name=name, type='deb',
+ current_version=version)
for (name, version) in extras]
def VerifyDebsums(self, entry, modlist):
@@ -155,34 +158,17 @@ class APT(Bcfg2.Client.Tools.Tool):
(entry.attrib['name']))
return False
pkgname = entry.get('name')
- if self.pkg_cache.has_key(pkgname): # noqa
- if self._newapi:
- is_installed = self.pkg_cache[pkgname].is_installed
- else:
- is_installed = self.pkg_cache[pkgname].isInstalled
- if not self.pkg_cache.has_key(pkgname) or not is_installed: # noqa
+ if pkgname not in self.pkg_cache or \
+ not self.pkg_cache[pkgname].is_installed:
self.logger.info("Package %s not installed" % (entry.get('name')))
entry.set('current_exists', 'false')
return False
pkg = self.pkg_cache[pkgname]
- if self._newapi:
- installed_version = pkg.installed.version
- candidate_version = pkg.candidate.version
- else:
- installed_version = pkg.installedVersion
- candidate_version = pkg.candidateVersion
+ installed_version = pkg.installed.version
if entry.get('version') == 'auto':
- # pylint: disable=W0212
- if self._newapi:
- is_upgradable = self.pkg_cache._depcache.is_upgradable(
- pkg._pkg)
- else:
- is_upgradable = self.pkg_cache._depcache.IsUpgradable(
- pkg._pkg)
- # pylint: enable=W0212
- if is_upgradable:
- desired_version = candidate_version
+ if pkg.is_upgradable:
+ desired_version = pkg.candidate.version
else:
desired_version = installed_version
elif entry.get('version') == 'any':
@@ -197,7 +183,7 @@ class APT(Bcfg2.Client.Tools.Tool):
return False
else:
# version matches
- if not self.setup['quick'] \
+ if not Bcfg2.Options.setup.quick \
and entry.get('verify', 'true') == 'true' \
and checksums:
pkgsums = self.VerifyDebsums(entry, modlist)
@@ -212,68 +198,40 @@ class APT(Bcfg2.Client.Tools.Tool):
self.logger.info('Removing packages:')
self.logger.info(pkgnames)
for pkg in pkgnames.split(" "):
- try:
- if self._newapi:
- self.pkg_cache[pkg].mark_delete(purge=True)
- else:
- self.pkg_cache[pkg].markDelete(purge=True)
- except: # pylint: disable=W0702
- if self._newapi:
- self.pkg_cache[pkg].mark_delete()
- else:
- self.pkg_cache[pkg].markDelete()
- try:
- self.pkg_cache.commit()
- except SystemExit:
- # thank you python-apt 0.6
- pass
+ self.pkg_cache[pkg].mark_delete(purge=True)
+ self.pkg_cache.commit()
self.pkg_cache = apt.cache.Cache()
self.modified += packages
self.extra = self.FindExtra()
- def Install(self, packages, states):
+ def Install(self, packages):
# it looks like you can't install arbitrary versions of software
# out of the pkg cache, we will still need to call apt-get
ipkgs = []
bad_pkgs = []
for pkg in packages:
- if not self.pkg_cache.has_key(pkg.get('name')): # noqa
+ pkgname = pkg.get('name')
+ if pkgname not in self.pkg_cache:
self.logger.error("APT has no information about package %s"
- % (pkg.get('name')))
+ % pkgname)
continue
if pkg.get('version') in ['auto', 'any']:
- if self._newapi:
- try:
- ipkgs.append("%s=%s" % (
- pkg.get('name'),
- self.pkg_cache[pkg.get('name')].candidate.version))
- except AttributeError:
- self.logger.error("Failed to find %s in apt package "
- "cache" % pkg.get('name'))
- continue
- else:
+ try:
ipkgs.append("%s=%s" % (
- pkg.get('name'),
- self.pkg_cache[pkg.get('name')].candidateVersion))
+ pkgname,
+ self.pkg_cache[pkgname].candidate.version))
+ except AttributeError:
+ self.logger.error("Failed to find %s in apt package "
+ "cache" % pkgname)
continue
- # pylint: disable=W0212
- if self._newapi:
- avail_vers = [
- x.ver_str for x in
- self.pkg_cache[pkg.get('name')]._pkg.version_list]
- else:
- avail_vers = [
- x.VerStr for x in
- self.pkg_cache[pkg.get('name')]._pkg.VersionList]
- # pylint: enable=W0212
+ avail_vers = self.pkg_cache[pkgname].versions.keys()
if pkg.get('version') in avail_vers:
- ipkgs.append("%s=%s" % (pkg.get('name'), pkg.get('version')))
+ ipkgs.append("%s=%s" % (pkgname, pkg.get('version')))
continue
else:
self.logger.error("Package %s: desired version %s not in %s"
- % (pkg.get('name'), pkg.get('version'),
- avail_vers))
- bad_pkgs.append(pkg.get('name'))
+ % (pkgname, pkg.get('version'), avail_vers))
+ bad_pkgs.append(pkgname)
if bad_pkgs:
self.logger.error("Cannot find correct versions of packages:")
self.logger.error(bad_pkgs)
@@ -283,10 +241,12 @@ class APT(Bcfg2.Client.Tools.Tool):
self.logger.error("APT command failed")
self.pkg_cache = apt.cache.Cache()
self.extra = self.FindExtra()
+ states = dict()
for package in packages:
states[package] = self.VerifyPackage(package, [], checksums=False)
if states[package]:
self.modified.append(package)
+ return states
def VerifyPath(self, entry, _): # pylint: disable=W0613
"""Do nothing here since we only verify Path type=ignore."""