renamed to 'servicemanager'
the PYTHONPATH should be set to the directory above servicemanager
This commit is contained in:
59
base.py
59
base.py
@ -21,6 +21,7 @@
|
||||
# *****************************************************************************
|
||||
|
||||
|
||||
import sys
|
||||
import json
|
||||
import os
|
||||
from os.path import expanduser
|
||||
@ -65,25 +66,15 @@ def printTable(headers, items, printfunc, minlen=0, rjust=False):
|
||||
printfunc((rfmtstr if rjust else lfmtstr) % (tuple(row) + ('',) * (ncolumns - len(row))))
|
||||
|
||||
|
||||
def run(serv, arglist):
|
||||
arglist = arglist + [''] # add dummy argument
|
||||
action = arglist.pop(0) if hasattr(serv, 'do_' + arglist[0]) else 'gui'
|
||||
instance = arglist.pop(0) if arglist[0] and arglist[0] not in serv.services else None
|
||||
if instance is None and len(serv.info) == 1:
|
||||
instance = list(serv.info)[0]
|
||||
if instance is not None:
|
||||
arglist.insert(0, instance)
|
||||
arglist.pop() # remove dummy argument
|
||||
try:
|
||||
serv.action(action, *arglist)
|
||||
except AttributeError as e:
|
||||
raise
|
||||
print(repr(e))
|
||||
raise ValueError("do not know '%s'" % ' '.join([serv.group, action] + arglist))
|
||||
def get_config():
|
||||
parser = ConfigParser(interpolation=None)
|
||||
parser.optionxform = str
|
||||
parser.read(expanduser('~/servicemanager.cfg'))
|
||||
return parser
|
||||
|
||||
|
||||
class ServiceManager:
|
||||
services = None
|
||||
services = ['SINGLE']
|
||||
need_cfg = False
|
||||
start_dir = None
|
||||
group = None
|
||||
@ -91,6 +82,7 @@ class ServiceManager:
|
||||
virtualenv = None
|
||||
pkg = ''
|
||||
revcmd = {}
|
||||
USAGE = None
|
||||
|
||||
def __init__(self):
|
||||
self.env = {}
|
||||
@ -109,10 +101,11 @@ class ServiceManager:
|
||||
ports = {}
|
||||
nr = '%02d' % int(section[self.group])
|
||||
gr = self.group.upper()
|
||||
singlekey = gr + '_PORT'
|
||||
for service in self.services:
|
||||
sv = '%s_%s' % (gr, service.upper())
|
||||
sv = gr + '_' + service.upper()
|
||||
key = '%s_PORT' % sv
|
||||
port = section.get(key)
|
||||
port = section.get(key) or section.get(singlekey)
|
||||
if port or json.loads(section.get(sv, '0').lower()):
|
||||
# e.g. NICOS_POLLER = True leads to port = 0
|
||||
port = (port or '0').replace('nr', nr)
|
||||
@ -128,24 +121,28 @@ class ServiceManager:
|
||||
if ins is omitted, return a list of above for all ins
|
||||
"""
|
||||
result = OrderedDict()
|
||||
parser = ConfigParser(interpolation=None)
|
||||
parser.optionxform = str
|
||||
parser.read(expanduser('~/servman.cfg'))
|
||||
parser = get_config()
|
||||
defaults = parser['DEFAULT']
|
||||
self.commands = {}
|
||||
# self.revcmd = {}
|
||||
|
||||
def expand_path(pathlist, ins):
|
||||
return ':'.join(expanduser(p % dict(ins=ins)) for p in pathlist.split(':'))
|
||||
def get_subs(section, key, ins, nr):
|
||||
"""get item <key> from section and substitute nr or expand filename"""
|
||||
value = section.get(key)
|
||||
if key.endswith('_PORT'):
|
||||
return value.replace('nr', nr)
|
||||
return ':'.join(expanduser(p % dict(ins=ins)) for p in value.split(':'))
|
||||
|
||||
for ins in parser.sections():
|
||||
section = dict(parser[ins])
|
||||
command = section.get('%s_command' % self.group)
|
||||
self.revcmd[command] = self.group
|
||||
if self.group in section:
|
||||
nr = section.get(self.group)
|
||||
if nr is not None:
|
||||
nr = '%02d' % int(nr)
|
||||
self.commands[ins] = command
|
||||
services = self.get_services(section)
|
||||
env = {k: expand_path(section.get(k), ins) for k in defaults if k.isupper()}
|
||||
env = {k: get_subs(section, k, ins, nr) for k in defaults if k.isupper()}
|
||||
result[ins] = services
|
||||
self.env[ins] = env
|
||||
self.info = result
|
||||
@ -194,7 +191,7 @@ class ServiceManager:
|
||||
if match:
|
||||
gdict = match.groupdict()
|
||||
ins = gdict['ins']
|
||||
serv = gdict['serv']
|
||||
serv = gdict.get('serv', '')
|
||||
if cfginfo is not None and 'cfg' in gdict:
|
||||
cfginfo[ins, serv] = gdict['cfg']
|
||||
result.setdefault(ins, {}).setdefault(serv, []).append(p)
|
||||
@ -264,6 +261,7 @@ class ServiceManager:
|
||||
except ValueError:
|
||||
raise ValueError('do not know %r' % ins)
|
||||
services = list(service_ports) if service is None else [service]
|
||||
print('start', services, service_ports)
|
||||
if restart:
|
||||
self.stop(ins, service)
|
||||
else:
|
||||
@ -280,6 +278,7 @@ class ServiceManager:
|
||||
for service_i in services:
|
||||
port = service_ports[service_i]
|
||||
cmd = self.commands[ins] % dict(ins=ins, serv=service_i, port=port, cfg=cfg, pkg=self.pkg)
|
||||
print('COMMAND', cmd)
|
||||
if '%(cfg)s' in self.commands[ins] and not cfg:
|
||||
cmd = self.stopped[ins].get(service_i)
|
||||
if not cmd:
|
||||
@ -338,8 +337,10 @@ class ServiceManager:
|
||||
def do_restart(self, ins, service=None, cfg=None):
|
||||
self.do_start(ins, service, cfg, True)
|
||||
|
||||
def do_run(self, ins, service, cfg=None):
|
||||
def do_run(self, ins, service=None, cfg=None):
|
||||
"""for tests: run and wait"""
|
||||
if not service:
|
||||
service, = self.services
|
||||
self.do_start(ins, service, cfg, wait=True)
|
||||
|
||||
def do_list(self, ins=None, *args):
|
||||
@ -403,3 +404,7 @@ class ServiceManager:
|
||||
if ' do_%s(' % action in errtxt and 'argument' in errtxt:
|
||||
raise UsageError(errtxt)
|
||||
raise
|
||||
|
||||
def usage(self):
|
||||
print(self.USAGE % ', '.join(self.info))
|
||||
|
||||
|
Reference in New Issue
Block a user