1
'''Bcfg2 Support for RPMS'''
3
__revision__ = '$Revision: 2412 $'
5
import Bcfg2.Client.Tools, time
7
class RPM(Bcfg2.Client.Tools.PkgTool):
8
'''Support for RPM packages'''
10
__execs__ = ['/bin/rpm']
11
__handles__ = [('Package', 'rpm')]
12
__req__ = {'Package': ['name', 'version', 'url']}
14
pkgtool = ("rpm --oldpackage --replacepkgs --quiet -U %s", ("%s", ["url"]))
16
def RefreshPackages(self, level=0):
17
'''Cache package states'''
21
for line in self.cmd.run("rpm -qa --qf '%{NAME} %{VERSION}-%{RELEASE}\n'")[1]:
23
(name, version) = line.split()
24
self.installed[name] = version
28
self.logger.error("Failed to access RPM db; retrying after 30s")
30
return self.RefreshPackages(level + 1)
32
def VerifyPackage(self, entry, modlist):
33
'''Verify Package status for entry'''
34
if not entry.get('version'):
35
self.logger.error("Can't install package %s, not enough data." % (entry.get('name')))
38
if entry.get('verify', 'false') == 'nomtime':
39
self.logger.debug("Skipping mtime verification for package %s" % (entry.get('name')))
40
rpm_options.append("--nomtime")
41
if self.installed.has_key(entry.get('name')):
42
if entry.get('version') == self.installed[entry.get('name')]:
43
if entry.get('multiarch'):
44
archs = entry.get('multiarch').split()
45
info = self.cmd.run('rpm -q %s --qf "%%{NAME} %%{VERSION}-%%{RELEASE} %%{ARCH}\n"' % (entry.get('name')))[1]
47
arch = info.pop().split()[2]
51
self.logger.error("Got pkg install for Package %s: arch %s" % (entry.get('name'), arch))
54
self.logger.error("Package %s not installed for arch: %s" % (entry.get('name'), archs))
56
if (self.setup['quick'] or (entry.get('verify', 'true') == 'false')) or entry.get('multiarch'):
57
if entry.get('verify', 'true') == 'false':
58
self.logger.debug("Skipping checksum verification for package %s" % (entry.get('name')))
61
self.logger.debug("Package %s: wrong version installed. want %s have %s" %
62
(entry.get('name'), entry.get('version'), self.installed[entry.get('name')]))
63
entry.set('current_version', self.installed[entry.get('name')])
66
self.logger.debug("Package %s: not installed" % (entry.get('name')))
67
entry.set('current_exists', 'false')
70
(vstat, output) = self.cmd.run("rpm --verify -q %s %s-%s" % (" ".join(rpm_options), entry.get('name'), entry.get('version')))
72
if [name for name in output if name.split()[-1] not in modlist]:
73
self.logger.debug("Package %s content verification failed" % entry.get('name'))
77
def RemovePackages(self, entries):
78
'''Remove specified entries'''
79
pkgnames = " ".join([entry[2] for entry in entries])
81
self.logger.info("Removing packages: %s" % pkgnames)
82
self.cmd.run("rpm --quiet -e --allmatches %s" % " ".join(pkgnames))
83
self.RefreshPackages()
84
self.extra = self.FindExtraPackages()