root/trunk/bcfg2/src/lib/Client/Tools/SYSV.py

Revision 5483, 4.0 KB (checked in by desai, 6 weeks ago)

SYSV fixes: (Resolves Ticket #762) (Patch from ITS Systems Team)

  • Flush noaskfile changes to disk
  • Handle package names better
  • Property svn:keywords set to Revision Id
Line 
1# This is the bcfg2 support for solaris sysv packages
2'''This provides bcfg2 support for Solaris SYSV packages'''
3__revision__ = '$Revision$'
4
5import tempfile, Bcfg2.Client.Tools, Bcfg2.Client.XML
6
7
8noask = '''
9mail=
10instance=overwrite
11partial=nocheck
12runlevel=nocheck
13idepend=nocheck
14rdepend=nocheck
15space=ask
16setuid=nocheck
17conflict=nocheck
18action=nocheck
19basedir=default
20'''
21
22class 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()
Note: See TracBrowser for help on using the browser.