daemon: Use a master script to start node services.

This helps starting services with dependencies by running service
start commands serially.
This commit is contained in:
Tom Goff 2015-08-31 11:31:57 -04:00
parent 002f9aee76
commit 15adf81954

View file

@ -217,6 +217,7 @@ class CoreServices(ConfigurableManager):
''' '''
services = sorted(node.services, services = sorted(node.services,
key=lambda service: service._startindex) key=lambda service: service._startindex)
script = '#!/bin/sh\n\n'
for s in services: for s in services:
if len(str(s._starttime)) > 0: if len(str(s._starttime)) > 0:
try: try:
@ -227,15 +228,17 @@ class CoreServices(ConfigurableManager):
continue continue
except ValueError: except ValueError:
pass pass
self.bootnodeservice(node, s, services) script += self.bootnodeservice(node, s, services)
filename = 'start-all-services.sh'
node.nodefile(filename, script)
node.cmd(('/bin/sh', filename), wait = False)
def bootnodeservice(self, node, s, services): def bootnodeservice(self, node, s, services):
''' Start a service on a node. Create private dirs, generate config ''' Start a service on a node. Create private dirs, generate config
files, and execute startup commands. files, and execute startup commands.
''' '''
if s._custom: if s._custom:
self.bootnodecustomservice(node, s, services) return self.bootnodecustomservice(node, s, services)
return
if node.verbose: if node.verbose:
node.info("starting service %s (%s)" % (s._name, s._startindex)) node.info("starting service %s (%s)" % (s._name, s._startindex))
for d in s._dirs: for d in s._dirs:
@ -247,12 +250,10 @@ class CoreServices(ConfigurableManager):
for filename in s.getconfigfilenames(node.objid, services): for filename in s.getconfigfilenames(node.objid, services):
cfg = s.generateconfig(node, filename, services) cfg = s.generateconfig(node, filename, services)
node.nodefile(filename, cfg) node.nodefile(filename, cfg)
for cmd in s.getstartup(node, services): startup = '\n'.join(s.getstartup(node, services))
try: if startup:
# NOTE: this wait=False can be problematic! startup += '\n'
node.cmd(shlex.split(cmd), wait = False) return startup
except Exception, e:
node.warn("error starting command %s: %s" % (cmd, e))
def bootnodecustomservice(self, node, s, services): def bootnodecustomservice(self, node, s, services):
''' Start a custom service on a node. Create private dirs, use supplied ''' Start a custom service on a node. Create private dirs, use supplied
@ -283,14 +284,11 @@ class CoreServices(ConfigurableManager):
"error copying service file '%s': %s" % (filename, e)) "error copying service file '%s': %s" % (filename, e))
continue continue
node.nodefile(filename, cfg) node.nodefile(filename, cfg)
startup = '\n'.join(s._startup)
for cmd in s._startup: if startup:
try: startup += '\n'
# NOTE: this wait=False can be problematic! return startup
node.cmd(shlex.split(cmd), wait = False)
except Exception, e:
node.warn("error starting command %s: %s" % (cmd, e))
def copyservicefile(self, node, filename, cfg): def copyservicefile(self, node, filename, cfg):
''' Given a configured service filename and config, determine if the ''' Given a configured service filename and config, determine if the
config references an existing file that should be copied. config references an existing file that should be copied.