~ubuntu-branches/ubuntu/hardy/bcfg2/hardy-updates

« back to all changes in this revision

Viewing changes to src/lib/Client/Tools/RPM.py

  • Committer: Bazaar Package Importer
  • Author(s): Sami Haahtinen
  • Date: 2006-11-16 22:39:16 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20061116223916-8dtn3t86cz58vg2x
Tags: 0.8.6.1-1
* New Upstream Release
* Replaced faulty if clause in bcfg2.postrm (Closes: #398772)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
'''Bcfg2 Support for RPMS'''
 
2
 
 
3
__revision__ = '$Revision: 2412 $'
 
4
 
 
5
import Bcfg2.Client.Tools, time
 
6
 
 
7
class RPM(Bcfg2.Client.Tools.PkgTool):
 
8
    '''Support for RPM packages'''
 
9
    __name__ = 'RPM'
 
10
    __execs__ = ['/bin/rpm']
 
11
    __handles__ = [('Package', 'rpm')]
 
12
    __req__ = {'Package': ['name', 'version', 'url']}
 
13
    pkgtype = 'rpm'
 
14
    pkgtool = ("rpm --oldpackage --replacepkgs --quiet -U %s", ("%s", ["url"]))
 
15
 
 
16
    def RefreshPackages(self, level=0):
 
17
        '''Cache package states'''
 
18
        self.installed = {}
 
19
        if level > 5:
 
20
            return
 
21
        for line in self.cmd.run("rpm -qa --qf '%{NAME} %{VERSION}-%{RELEASE}\n'")[1]:
 
22
            try:
 
23
                (name, version) = line.split()
 
24
                self.installed[name] = version
 
25
            except ValueError:
 
26
                if line == '':
 
27
                    continue
 
28
                self.logger.error("Failed to access RPM db; retrying after 30s")
 
29
                time.sleep(30)
 
30
                return self.RefreshPackages(level + 1)
 
31
 
 
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')))
 
36
            return False
 
37
        rpm_options = []
 
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]
 
46
                    while info:
 
47
                        arch = info.pop().split()[2]
 
48
                        if arch in archs:
 
49
                            archs.remove(arch)
 
50
                        else:
 
51
                            self.logger.error("Got pkg install for Package %s: arch %s" % (entry.get('name'), arch))
 
52
                            return False
 
53
                    if archs:
 
54
                        self.logger.error("Package %s not installed for arch: %s" % (entry.get('name'), archs))
 
55
                        return False
 
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')))
 
59
                    return True
 
60
            else:
 
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')])
 
64
                return False
 
65
        else:
 
66
            self.logger.debug("Package %s: not installed" % (entry.get('name')))
 
67
            entry.set('current_exists', 'false')
 
68
            return False
 
69
 
 
70
        (vstat, output) = self.cmd.run("rpm --verify -q %s %s-%s" % (" ".join(rpm_options), entry.get('name'), entry.get('version')))
 
71
        if vstat != 0:
 
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'))
 
74
                return False
 
75
        return True
 
76
 
 
77
    def RemovePackages(self, entries):
 
78
        '''Remove specified entries'''
 
79
        pkgnames = " ".join([entry[2] for entry in entries])
 
80
        if len(pkgnames) > 0:
 
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()