| 1 |
|
|---|
| 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 |
self.noaskname = tempfile.mktemp() |
|---|
| 35 |
try: |
|---|
| 36 |
open(self.noaskname, 'w+').write(noask) |
|---|
| 37 |
self.pkgtool = (self.pkgtool[0] % ("-a %s" % (self.noaskname)), \ |
|---|
| 38 |
self.pkgtool[1]) |
|---|
| 39 |
except: |
|---|
| 40 |
self.pkgtool = (self.pkgtool[0] % (""), self.pkgtool[1]) |
|---|
| 41 |
|
|---|
| 42 |
def RefreshPackages(self): |
|---|
| 43 |
'''Refresh memory hashes of packages''' |
|---|
| 44 |
self.installed = {} |
|---|
| 45 |
|
|---|
| 46 |
lines = self.cmd.run("/usr/bin/pkginfo -x")[1] |
|---|
| 47 |
while lines: |
|---|
| 48 |
version = lines.pop().split()[1] |
|---|
| 49 |
pkg = lines.pop().split()[0] |
|---|
| 50 |
self.installed[pkg] = version |
|---|
| 51 |
|
|---|
| 52 |
def VerifyPackage(self, entry, modlist): |
|---|
| 53 |
'''Verify Package status for entry''' |
|---|
| 54 |
if not entry.get('version'): |
|---|
| 55 |
self.logger.info("Insufficient information of Package %s; cannot Verify" % entry.get('name')) |
|---|
| 56 |
return False |
|---|
| 57 |
cmdrc = self.cmd.run("/usr/bin/pkginfo -q -v \"%s\" %s" % \ |
|---|
| 58 |
(entry.get('version'), entry.get('name')))[0] |
|---|
| 59 |
|
|---|
| 60 |
if cmdrc != 0: |
|---|
| 61 |
if entry.get('name') in self.installed: |
|---|
| 62 |
self.logger.debug("Package %s version incorrect: have %s want %s" \ |
|---|
| 63 |
% (entry.get('name'), self.installed[entry.get('name')], |
|---|
| 64 |
entry.get('version'))) |
|---|
| 65 |
else: |
|---|
| 66 |
self.logger.debug("Package %s not installed" % (entry.get("name"))) |
|---|
| 67 |
else: |
|---|
| 68 |
if self.setup['quick'] or entry.attrib.get('verify', 'true') == 'false': |
|---|
| 69 |
return True |
|---|
| 70 |
(vstat, odata) = self.cmd.run("/usr/sbin/pkgchk -n %s" % (entry.get('name'))) |
|---|
| 71 |
if vstat == 0: |
|---|
| 72 |
return True |
|---|
| 73 |
else: |
|---|
| 74 |
output = [line for line in odata if line[:5] == 'ERROR'] |
|---|
| 75 |
if len([name for name in output if name.split()[-1] not in modlist]): |
|---|
| 76 |
self.logger.debug("Package %s content verification failed" % \ |
|---|
| 77 |
(entry.get('name'))) |
|---|
| 78 |
else: |
|---|
| 79 |
return True |
|---|
| 80 |
return False |
|---|
| 81 |
|
|---|
| 82 |
def RemovePackages(self, packages): |
|---|
| 83 |
'''Remove specified Sysv packages''' |
|---|
| 84 |
names = [pkg.get('name') for pkg in packages] |
|---|
| 85 |
self.logger.info("Removing packages: %s" % (names)) |
|---|
| 86 |
self.cmd.run("/usr/sbin/pkgrm -a %s -n %s" % \ |
|---|
| 87 |
(self.noaskname, names)) |
|---|
| 88 |
self.RefreshPackages() |
|---|
| 89 |
self.extra = self.FindExtraPackages() |
|---|