renamed to 'servicemanager'

the PYTHONPATH should be set to the directory above servicemanager
This commit is contained in:
2021-02-26 14:48:15 +01:00
parent 632beda430
commit 51abcab182
9 changed files with 158 additions and 134 deletions

59
base.py
View File

@ -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))