summaryrefslogtreecommitdiffstats
path: root/src/lib/Client/Solaris.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/Client/Solaris.py')
-rw-r--r--src/lib/Client/Solaris.py263
1 files changed, 0 insertions, 263 deletions
diff --git a/src/lib/Client/Solaris.py b/src/lib/Client/Solaris.py
deleted file mode 100644
index ab60a0a04..000000000
--- a/src/lib/Client/Solaris.py
+++ /dev/null
@@ -1,263 +0,0 @@
-# This is the bcfg2 support for solaris
-'''This provides bcfg2 support for Solaris'''
-__revision__ = '$Revision$'
-
-import os
-from glob import glob
-from os import stat, unlink
-from re import compile as regcompile
-from tempfile import mktemp
-
-from Bcfg2.Client.Toolset import Toolset
-
-noask = '''
-mail=
-instance=overwrite
-partial=nocheck
-runlevel=nocheck
-idepend=nocheck
-rdepend=nocheck
-space=ask
-setuid=nocheck
-conflict=nocheck
-action=nocheck
-basedir=default
-'''
-
-class ToolsetImpl(Toolset):
- '''This class implelements support for SYSV/blastware/encap packages
- and standard SMF services'''
- pkgtool = {'sysv':("/usr/sbin/pkgadd %s -d %%s -n %%%%s", (("%s", ["name"]))),
- 'blast':("/opt/csw/bin/pkg-get install %s", ("%s", ["name"])),
- 'encap':("/local/sbin/epkg -l -f -q %s", ("%s", ["url"]))}
- splitter = regcompile('.*/(?P<name>[\w-]+)\-(?P<version>[\w\.-]+)')
- ptypes = {}
- __name__ = 'Solaris'
-
- def __init__(self, cfg, setup):
- Toolset.__init__(self, cfg, setup)
- self.extra_services = []
- self.snames = {}
- self.noaskname = mktemp()
- try:
- open(self.noaskname, 'w+').write(noask)
- self.pkgtool['sysv'] = (self.pkgtool['sysv'][0] % ("-a %s" % (self.noaskname)), self.pkgtool['sysv'][1])
- except:
- self.pkgtool['sysv'] = (self.pkgtool['sysv'][0] % (""), self.pkgtool['sysv'][1])
- try:
- stat("/opt/csw/bin/pkg-get")
- self.saferun("/opt/csw/bin/pkg-get -U > /dev/null")
- except OSError:
- pass
- self.Refresh()
- for pkg in [cpkg for cpkg in self.cfg.findall(".//Package") if not cpkg.attrib.has_key('type')]:
- pkg.set('type', 'sysv')
- for pkg in [cpkg for cpkg in self.cfg.findall(".//Package") if cpkg.get('type') == 'sysv']:
- if pkg.attrib.has_key('url'):
- pkg.set('url', '/'.join(pkg.get('url').split('/')[:-1]))
- pkg.set('type', "sysv-%s" % (pkg.get('url')))
- if not self.pkgtool.has_key(pkg.get('type')):
- self.pkgtool[pkg.get('type')] = (self.pkgtool['sysv'][0] % (pkg.get('url')),
- self.pkgtool['sysv'][1])
-
- def Refresh(self):
- '''Refresh memory hashes of packages'''
- self.installed = {}
- self.ptypes = {}
- # Build list of packages
- lines = self.saferun("/usr/bin/pkginfo -x")[1]
- while lines:
- version = lines.pop().split()[1]
- pkg = lines.pop().split()[0]
- self.installed[pkg] = version
- self.ptypes[pkg] = 'sysv'
- # try to find encap packages
- for pkg in glob("/local/encap/*"):
- match = self.splitter.match(pkg)
- if match:
- self.installed[match.group('name')] = match.group('version')
- self.ptypes[match.group('name')] = 'encap'
- else:
- print "Failed to split name %s" % pkg
- #print self.installed.keys()
-
- def VerifyService(self, entry):
- '''Verify Service status for entry'''
- if not entry.attrib.has_key('FMRI'):
- name = self.saferun("/usr/bin/svcs -H -o FMRI %s 2>/dev/null" % entry.get('name'))[1]
- if name:
- entry.set('FMRI', name[0])
- else:
- self.logger.info('Failed to locate FMRI for service %s' % entry.get('name'))
- return False
- if entry.get('FMRI').startswith('lrc'):
- filename = entry.get('FMRI').split('/')[-1]
- # this is a legacy service
- gname = "/etc/rc*.d/%s" % filename
- files = glob(gname.replace('_', '.'))
- if files:
- self.logger.debug("Matched %s with %s" % \
- (entry.get("FMRI"), ":".join(files)))
- return entry.get('status') == 'on'
- else:
- self.logger.debug("No service matching %s" % (entry.get("FMRI")))
- return entry.get('status') == 'off'
- try:
- srvdata = self.saferun("/usr/bin/svcs -H -o STA %s" % entry.attrib['name'])[1][0].split()
- except IndexError:
- # Ocurrs when no lines are returned (service not installed)
- return False
-
- if entry.get('status') == 'on':
- return srvdata[0] == 'ON'
- else:
- return srvdata[0] in ['OFF', 'UN', 'MNT', 'DIS', 'DGD']
-
- def InstallService(self, entry):
- '''Install Service entry'''
- if not entry.attrib.has_key('status'):
- self.logger.info('Insufficient information for Service %s; cannot Install' % entry.get('name'))
- return False
- if not entry.attrib.has_key('FMRI'):
- name = self.saferun("/usr/bin/svcs -H -o FMRI %s 2>/dev/null" % entry.get('name'))[1]
- if name:
- entry.set('FMRI', name[0])
- else:
- self.logger.info('Failed to locate FMRI for service %s' % entry.get('name'))
- return False
- self.logger.info("Installing Service %s" % (entry.get('name')))
- if entry.attrib['status'] == 'off':
- if self.setup['dryrun']:
- print "Disabling Service %s" % (entry.get('name'))
- else:
- if entry.get("FMRI").startswith('lrc'):
- try:
- loc = entry.get("FMRI")[4:].replace('_', '.')
- self.logger.debug("Renaming file %s to %s" % \
- (loc, loc.replace('/S', '/DISABLED.S')))
- os.rename(loc, loc.replace('/S', '/DISABLED.S'))
- return True
- except OSError:
- self.logger.error("Failed to rename init script %s" % (loc))
- return False
- cmdrc = self.saferun("/usr/sbin/svcadm disable -r %s" % (entry.attrib['FMRI']))[0]
- else:
- if self.setup['dryrun']:
- print "Enabling Service %s" % (entry.attrib['name'])
- else:
- if entry.get('FMRI').startswith('lrc'):
- loc = entry.get("FMRI")[4:].replace('_', ',')
- try:
- stat(loc.replace('/S', '/Disabled.'))
- self.logger.debug("Renaming file %s to %s" % \
- (loc.replace('/S', '/DISABLED.S'), loc))
- os.rename(loc.replace('/S', '/DISABLED.S'), loc)
- cmdrc = 0
- except:
- self.logger.debug("Failed to rename %s to %s" \
- % (loc.replace('/S', '/DISABLED.S'), loc))
- cmdrc = 1
- else:
- cmdrc = self.saferun("/usr/sbin/svcadm enable -r %s" % (entry.attrib['FMRI']))[0]
- return cmdrc == 0
-
- def VerifyPackage(self, entry, modlist):
- '''Verify Package status for entry'''
- if not entry.get('version'):
- self.logger.info("Insufficient information of Package %s; cannot Verify" % entry.get('name'))
- return False
- if entry.get('type') in ['sysv', 'blast'] or entry.get('type')[:4] == 'sysv':
- cmdrc = self.saferun("/usr/bin/pkginfo -q -v \"%s\" %s" % (entry.get('version'), entry.get('name')))[0]
- elif entry.get('type') in ['encap']:
- cmdrc = self.saferun("/local/sbin/epkg -q -S -k %s-%s >/dev/null" %
- (entry.get('name'), entry.get('version')))[0]
- if cmdrc != 0:
- self.logger.debug("Package %s version incorrect" % entry.get('name'))
- else:
- if self.setup['quick'] or entry.get('type') == 'encap' or \
- entry.attrib.get('verify', 'true') == 'false':
- return True
- (vstat, odata) = self.saferun("/usr/sbin/pkgchk -n %s" % (entry.get('name')))
- if vstat == 0:
- return True
- else:
- output = [line for line in odata if line[:5] == 'ERROR']
- if len([name for name in output if name.split()[-1] not in modlist]):
- self.logger.debug("Package %s content verification failed" % \
- (entry.get('name')))
- else:
- return True
- return False
-
- def Inventory(self):
- '''Do standard inventory plus debian extra service check'''
- Toolset.Inventory(self)
- allsrv = [name for name, version in [ srvc.strip().split() for srvc in
- self.saferun("/usr/bin/svcs -a -H -o FMRI,STATE")[1] ]
- if version != 'disabled']
- csrv = self.cfg.findall(".//Service")
- # need to build a service name map. services map to a fullname if they are already installed
- for srv in csrv:
- name = self.saferun("/usr/bin/svcs -H -o FMRI %s 2>/dev/null" % srv.get('name'))[1]
- if name:
- srv.set('FMRI', name[0])
- else:
- self.logger.info("Failed to locate FMRI for service %s" % srv.get('name'))
- #nsrv = [ r for r in [ popen("/usr/bin/svcs -H -o FMRI %s " % s).read().strip() for s in csrv ] if r ]
- [allsrv.remove(svc.get('FMRI')) for svc in csrv if
- svc.get('status') == 'on' and svc.get("FMRI") in allsrv]
- self.extra_services = allsrv
-
- def HandleExtra(self):
- '''Deal with extra configuration detected'''
- if len(self.pkgwork) > 0:
- if self.setup['remove'] in ['all', 'packages']:
- self.logger.info("Removing packages: %s" % (self.pkgwork['remove']))
- sysvrmpkgs = [pkg for pkg in self.pkgwork['remove'] if self.ptypes[pkg] == 'sysv']
- enrmpkgs = [pkg for pkg in self.pkgwork['remove'] if self.ptypes[pkg] == 'encap']
- if sysvrmpkgs:
- if not self.saferun("/usr/sbin/pkgrm -a %s -n %s" % \
- (self.noaskname, " ".join(sysvrmpkgs)))[0]:
- [self.pkgwork['remove'].remove(pkg) for pkg in sysvrmpkgs]
- if enrmpkgs:
- if not self.saferun("/local/sbin/epkg -l -q -r %s" % " ".join(enrmpkgs))[0]:
- [self.pkgwork['remove'].remove(pkg) for pkg in enrmpkgs]
- else:
- self.logger.info("Need to remove packages: %s" % (self.pkgwork['remove']))
- if len(self.extra_services) > 0:
- self.logger.info("Here")
- self.logger.info('removal mode is: %s' % (self.setup))
- if self.setup['remove'] in ['all', 'services']:
- self.logger.info("Removing services: %s" % (self.extra_services))
- for service in [svc for svc in self.extra_services if not svc.startswith('lrc:')]:
- if not self.saferun("/usr/sbin/svcadm disable %s" % service)[0]:
- self.extra_services.remove(service)
- for svc in [svc for svc in self.extra_services if svc.startswith('lrc:')]:
- loc = svc[4:].replace('_', '.')
- self.logger.info("Renaming file %s to %s" % \
- (loc, loc.replace('/S', '/DISABLED.S')))
- try:
- os.rename(loc, loc.replace('/S', '/DISABLED.S'))
- self.extra_services.remove(svc)
- except OSError:
- self.logger.error("Failed to rename %s" % loc)
-
- else:
- self.logger.info("Need to remove services: %s" % (self.extra_services))
-
- def Install(self):
- '''Local install method handling noaskfiles'''
- Toolset.Install(self)
- try:
- unlink(self.noaskname)
- except:
- pass
-
- def RestartService(self, service):
- '''Restart a service'''
- if service.get("FMRI").startswith('lrc'):
- Toolset.RestartService(self, service)
- else:
- if service.get('status') == 'on':
- self.logger.debug("Restarting service %s" % (service.get("FMRI")))
- self.saferun("svcadm restart %s" % (service.get("FMRI")))