| 1 | # This is the bcfg2 support for solaris sysv packages |
|---|
| 2 | '''This provides bcfg2 support for Solaris SYSV packages''' |
|---|
| 3 | __revision__ = '$Revision$' |
|---|
| 4 | |
|---|
| 5 | import tempfile, Bcfg2.Client.Tools, Bcfg2.Client.XML |
|---|
| 6 | |
|---|
| 7 | |
|---|
| 8 | noask = ''' |
|---|
| 9 | mail= |
|---|
| 10 | instance=overwrite |
|---|
| 11 | partial=nocheck |
|---|
| 12 | runlevel=nocheck |
|---|
| 13 | idepend=nocheck |
|---|
| 14 | rdepend=nocheck |
|---|
| 15 | space=ask |
|---|
| 16 | setuid=nocheck |
|---|
| 17 | conflict=nocheck |
|---|
| 18 | action=nocheck |
|---|
| 19 | basedir=default |
|---|
| 20 | ''' |
|---|
| 21 | |
|---|
| 22 | class SYSV(Bcfg2.Client.Tools.PkgTool): |
|---|
| 23 | '''Solaris SYSV package support''' |
|---|
| 24 | __execs__ = ["/usr/sbin/pkgadd", "/usr/bin/pkginfo"] |
|---|
| 25 | __handles__ = [('Package', 'sysv')] |
|---|
| 26 | __req__ = {'Package': ['name', 'version']} |
|---|
| 27 | __ireq__ = {'Package': ['name', 'url', 'version']} |
|---|
| 28 | name = 'SYSV' |
|---|
| 29 | pkgtype = 'sysv' |
|---|
| 30 | pkgtool = ("/usr/sbin/pkgadd %s -n -d %%s", (('%s %s', ['url', 'name']))) |
|---|
| 31 | |
|---|
| 32 | def __init__(self, logger, setup, config): |
|---|
| 33 | Bcfg2.Client.Tools.PkgTool.__init__(self, logger, setup, config) |
|---|
| 34 | # noaskfile needs to live beyond __init__ otherwise file is removed |
|---|
| 35 | self.noaskfile = tempfile.NamedTemporaryFile() |
|---|
| 36 | self.noaskname = self.noaskfile.name |
|---|
| 37 | try: |
|---|
| 38 | self.noaskfile.write(noask) |
|---|
| 39 | # flush admin file contents to disk |
|---|
| 40 | self.noaskfile.flush() |
|---|
| 41 | self.pkgtool = (self.pkgtool[0] % ("-a %s" % (self.noaskname)), \ |
|---|
| 42 | self.pkgtool[1]) |
|---|
| 43 | except: |
|---|
| 44 | self.pkgtool = (self.pkgtool[0] % (""), self.pkgtool[1]) |
|---|
| 45 | |
|---|
| 46 | def RefreshPackages(self): |
|---|
| 47 | '''Refresh memory hashes of packages''' |
|---|
| 48 | self.installed = {} |
|---|
| 49 | # Build list of packages |
|---|
| 50 | lines = self.cmd.run("/usr/bin/pkginfo -x")[1] |
|---|
| 51 | while lines: |
|---|
| 52 | # Splitting on whitespace means that packages with spaces in |
|---|
| 53 | # their version numbers don't work right. Found this with |
|---|
| 54 | # IBM TSM software with package versions like |
|---|
| 55 | # "Version 6 Release 1 Level 0.0" |
|---|
| 56 | # Should probably be done with a regex but this works. |
|---|
| 57 | version = lines.pop().split(') ')[1] |
|---|
| 58 | pkg = lines.pop().split()[0] |
|---|
| 59 | self.installed[pkg] = version |
|---|
| 60 | |
|---|
| 61 | def VerifyPackage(self, entry, modlist): |
|---|
| 62 | '''Verify Package status for entry''' |
|---|
| 63 | if not entry.get('version'): |
|---|
| 64 | self.logger.info("Insufficient information of Package %s; cannot Verify" % entry.get('name')) |
|---|
| 65 | return False |
|---|
| 66 | |
|---|
| 67 | desiredVersion = entry.get('version') |
|---|
| 68 | if desiredVersion == 'any': |
|---|
| 69 | desiredVersion = self.installed.get(entry.get('name'), desiredVersion) |
|---|
| 70 | |
|---|
| 71 | cmdrc = self.cmd.run("/usr/bin/pkginfo -q -v \"%s\" %s" % \ |
|---|
| 72 | (desiredVersion, entry.get('name')))[0] |
|---|
| 73 | |
|---|
| 74 | if cmdrc != 0: |
|---|
| 75 | if entry.get('name') in self.installed: |
|---|
| 76 | self.logger.debug("Package %s version incorrect: have %s want %s" \ |
|---|
| 77 | % (entry.get('name'), self.installed[entry.get('name')], |
|---|
| 78 | desiredVersion)) |
|---|
| 79 | else: |
|---|
| 80 | self.logger.debug("Package %s not installed" % (entry.get("name"))) |
|---|
| 81 | else: |
|---|
| 82 | if self.setup['quick'] or entry.attrib.get('verify', 'true') == 'false': |
|---|
| 83 | return True |
|---|
| 84 | (vstat, odata) = self.cmd.run("/usr/sbin/pkgchk -n %s" % (entry.get('name'))) |
|---|
| 85 | if vstat == 0: |
|---|
| 86 | return True |
|---|
| 87 | else: |
|---|
| 88 | output = [line for line in odata if line[:5] == 'ERROR'] |
|---|
| 89 | if len([name for name in output if name.split()[-1] not in modlist]): |
|---|
| 90 | self.logger.debug("Package %s content verification failed" % \ |
|---|
| 91 | (entry.get('name'))) |
|---|
| 92 | else: |
|---|
| 93 | return True |
|---|
| 94 | return False |
|---|
| 95 | |
|---|
| 96 | def RemovePackages(self, packages): |
|---|
| 97 | '''Remove specified Sysv packages''' |
|---|
| 98 | names = [pkg.get('name') for pkg in packages] |
|---|
| 99 | self.logger.info("Removing packages: %s" % (names)) |
|---|
| 100 | self.cmd.run("/usr/sbin/pkgrm -a %s -n %s" % \ |
|---|
| 101 | (self.noaskname, names)) |
|---|
| 102 | self.RefreshPackages() |
|---|
| 103 | self.extra = self.FindExtraPackages() |
|---|