From 154c97c06501ef66e0a103644731ed53d1096fc3 Mon Sep 17 00:00:00 2001 From: Narayan Desai Date: Fri, 23 Jan 2009 02:57:34 +0000 Subject: Simplify service configuration; make all services use common restart framework git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@5040 ce84e21b-d406-0410-9b95-82705330c041 --- src/lib/Client/Tools/Chkconfig.py | 5 +++- src/lib/Client/Tools/DebInit.py | 20 ++----------- src/lib/Client/Tools/FreeBSDInit.py | 20 ++----------- src/lib/Client/Tools/SMF.py | 33 ++++++++------------- src/lib/Client/Tools/__init__.py | 59 +++++++++++++++++++++++++++---------- 5 files changed, 64 insertions(+), 73 deletions(-) (limited to 'src/lib/Client') diff --git a/src/lib/Client/Tools/Chkconfig.py b/src/lib/Client/Tools/Chkconfig.py index ae3beaecb..5f867ee2d 100644 --- a/src/lib/Client/Tools/Chkconfig.py +++ b/src/lib/Client/Tools/Chkconfig.py @@ -13,6 +13,9 @@ class Chkconfig(Bcfg2.Client.Tools.SvcTool): __handles__ = [('Service', 'chkconfig')] __req__ = {'Service': ['name', 'status']} + def get_svc_command(self, service, action): + return "/sbin/service %s %s" % (service.get('name'), action) + def VerifyService(self, entry, _): '''Verify Service status for entry''' try: @@ -44,7 +47,7 @@ class Chkconfig(Bcfg2.Client.Tools.SvcTool): else: status = (len(onlevels) == 0) - if entry.get('supervised', 'false') == 'true': + if entry.get('mode', 'default') == 'supervised': pstatus, pout = self.cmd.run('/sbin/service %s status' % \ entry.get('name')) if pstatus: diff --git a/src/lib/Client/Tools/DebInit.py b/src/lib/Client/Tools/DebInit.py index b18c11cd5..cd5b7c784 100644 --- a/src/lib/Client/Tools/DebInit.py +++ b/src/lib/Client/Tools/DebInit.py @@ -7,10 +7,9 @@ import Bcfg2.Client.Tools class DebInit(Bcfg2.Client.Tools.SvcTool): '''Debian Service Support for Bcfg2''' name = 'DebInit' - __execs__ = ['/usr/sbin/update-rc.d'] + __execs__ = ['/usr/sbin/update-rc.d', '/usr/sbin/invoke-rc.d'] __handles__ = [('Service', 'deb')] __req__ = {'Service': ['name', 'status']} - __svcrestart__ = 'restart' svcre = re.compile("/etc/.*/(?P[SK])(?P\d+)(?P\S+)") # implement entry (Verify|Install) ops @@ -94,18 +93,5 @@ class DebInit(Bcfg2.Client.Tools.SvcTool): # Extra services need to be reflected in the config return - def BundleUpdated(self, bundle, states): - '''The Bundle has been updated''' - for entry in bundle: - if self.handlesEntry(entry): - command = "/usr/sbin/invoke-rc.d %s" % entry.get('name') - if entry.get('status') == 'on' and not self.setup['build']: - self.logger.debug('Restarting service %s' % entry.get('name')) - rc = self.cmd.run('%s %s' % (command, \ - entry.get('reload', self.__svcrestart__)))[0] - else: - self.logger.debug('Stopping service %s' % entry.get('name')) - rc = self.cmd.run('%s stop' % command)[0] - if rc: - self.logger.error("Failed to restart service %s" % (entry.get('name'))) - + def get_svc_command(self, service, action): + return '/usr/sbin/invoke-rc.d %s %s' % (service.get('name'), action) diff --git a/src/lib/Client/Tools/FreeBSDInit.py b/src/lib/Client/Tools/FreeBSDInit.py index 4f5131fb5..5837cff37 100644 --- a/src/lib/Client/Tools/FreeBSDInit.py +++ b/src/lib/Client/Tools/FreeBSDInit.py @@ -12,25 +12,9 @@ class FreeBSDInit(Bcfg2.Client.Tools.SvcTool): name = 'FreeBSDInit' __handles__ = [('Service', 'freebsd')] __req__ = {'Service': ['name', 'status']} - __svcrestart__ = 'restart' def VerifyService(self, entry, _): return True - def BundleUpdated(self, bundle, states): - '''The Bundle has been updated''' - for entry in bundle: - if self.handlesEntry(entry): - command = "/usr/local/etc/rc.d/%s" % entry.get('name') - if entry.get('status') == 'on' and not self.setup['build']: - self.logger.debug('Restarting service %s' % \ - entry.get('name')) - rc = self.cmd.run('%s %s' % (command, \ - entry.get('reload', self.__svcrestart__)))[0] - else: - self.logger.debug('Stopping service %s' % entry.get('name')) - rc = self.cmd.run('%s stop' % command)[0] - if rc: - self.logger.error("Failed to restart service %s" % \ - (entry.get('name'))) - + def get_svc_command(self, service, action): + return "/usr/local/etc/rc.d/%s %s" % (service.get('name'), action) diff --git a/src/lib/Client/Tools/SMF.py b/src/lib/Client/Tools/SMF.py index 399418986..bbe9a3055 100644 --- a/src/lib/Client/Tools/SMF.py +++ b/src/lib/Client/Tools/SMF.py @@ -4,7 +4,7 @@ __revision__ = '$Revision$' import glob, os import Bcfg2.Client.Tools -class SMF(Bcfg2.Client.Tools.Tool): +class SMF(Bcfg2.Client.Tools.SvcTool): '''Support for Solaris SMF Services''' __handles__ = [('Service', 'smf')] __execs__ = ['/usr/sbin/svcadm', '/usr/bin/svcs'] @@ -12,6 +12,17 @@ class SMF(Bcfg2.Client.Tools.Tool): __req__ = {'Service':['name', 'status']} __ireq__ = {'Service': ['name', 'status', 'FMRI']} + def get_svc_command(self, service, action): + if service.get('type') == 'lrc': + return Bcfg2.Client.Tools.SvcTool.get_svc_command(self, + service, action) + if action == 'stop': + return "/usr/sbin/svcadm disable %s" % (service.get('FMRI')) + elif action == 'restart': + return "/usr/sbin/svcadm restart %s" % (service.get('FMRI')) + elif action == 'start': + return "/usr/sbin/svcadm enable %s" % (service.get('FMRI')) + def GetFMRI(self, entry): '''Perform FMRI resolution for service''' if not 'FMRI' in entry.attrib: @@ -114,23 +125,3 @@ class SMF(Bcfg2.Client.Tools.Tool): if svc.get("FMRI") in allsrv] return [Bcfg2.Client.XML.Element("Service", type='smf', name=name) \ for name in allsrv] - - def BundleUpdated(self, bundle, states): - '''Restart smf services''' - for entry in [entry for entry in bundle if self.handlesEntry(entry)]: - if not self.canInstall(entry): - self.logger.error("Insufficient information to restart service %s" % \ - (entry.get('name'))) - else: - if entry.get("FMRI").startswith('lrc'): - if entry.get('status') == 'on': - self.logger.info("Restarting smf/lrc service %s"%(entry.get("name"))) - self.cmd.run("/etc/init.d/%s %s" % (entry.get('name'), - entry.get('reload', 'reload'))) - else: - if entry.get('status') == 'on': - self.logger.info("Restarting smf service %s" % (entry.get("FMRI"))) - self.cmd.run("/usr/sbin/svcadm restart %s" % (entry.get("FMRI"))) - else: - self.cmd.run("/usr/sbin/svcadm disable %s" % (entry.get("FMRI"))) - diff --git a/src/lib/Client/Tools/__init__.py b/src/lib/Client/Tools/__init__.py index a827e7924..d44356f9b 100644 --- a/src/lib/Client/Tools/__init__.py +++ b/src/lib/Client/Tools/__init__.py @@ -272,7 +272,8 @@ class PkgTool(Tool): def FindExtraPackages(self): '''Find extra packages''' packages = [entry.get('name') for entry in self.getSupportedEntries()] - extras = [data for data in self.installed.iteritems() if data[0] not in packages] + extras = [data for data in self.installed.iteritems() \ + if data[0] not in packages] return [Bcfg2.Client.XML.Element('Package', name=name, \ type=self.pkgtype, version=version) \ for (name, version) in extras] @@ -280,21 +281,47 @@ class PkgTool(Tool): class SvcTool(Tool): '''This class defines basic Service behavior''' name = 'SvcTool' - __svcrestart__ = 'reload' + + def get_svc_command(self, service, action): + '''Return the basename of the command used to start/stop services''' + return '/etc/init.d/%s %s' % (service.get('name'), action) + + def start_service(self, service): + self.logger.debug('Starting service %s' % service.get('name')) + return self.cmd.run(self.get_svc_command(service, 'start'))[0] + + def stop_service(self, service): + self.logger.debug('Stopping service %s' % service.get('name')) + return self.cmd.run(self.get_svc_command(service, 'stop'))[0] + + def restart_service(self, service): + self.logger.debug('Restarting service %s' % service.get('name')) + restart_target = 'restart' + if service.get('mode', 'default') == 'custom': + restart_target = service.get('custom', 'restart') + return self.cmd.run(self.get_svc_command(service, restart_target))[0] + + def check_service(self, service): + # not supported for this driver + return 0 def BundleUpdated(self, bundle, states): '''The Bundle has been updated''' - for entry in bundle: - if self.handlesEntry(entry): - rc = 0 - if entry.get('status') == 'on' and not self.setup['build']: - self.logger.debug('Restarting service %s' % entry.get('name')) - rc = self.cmd.run('/etc/init.d/%s %s' % \ - (entry.get('name'), entry.get('reload', self.__svcrestart__)))[0] - elif not self.setup['build']: - self.logger.debug('Stopping service %s' % entry.get('name')) - rc = self.cmd.run('/etc/init.d/%s stop' % \ - (entry.get('name')))[0] - if rc: - self.logger.error("Failed to restart service %s" % \ - (entry.get('name'))) + if self.setup['servicemode'] == 'disabled': + return + + for entry in [ent for ent in bundle if self.handlesEntry(ent)]: + if entry.get('mode', 'default') == 'manual': + continue + # need to handle servicemode = (build|default) + # need to handle mode = (default|supervised|custom) + if entry.get('status') == 'on': + if self.setup['servicemode'] == 'build': + rc = self.stop_service(entry) + else: + rc = self.restart_service(entry) + else: + rc = self.stop_service(entry) + if rc: + self.logger.error("Failed to manipulate service %s" % \ + (entry.get('name'))) -- cgit v1.2.3-1-g7c22