introduce wildcards for <instance>

This commit is contained in:
2021-12-06 14:39:04 +01:00
parent bb3c72acc9
commit f411460c2c
5 changed files with 71 additions and 28 deletions

47
base.py
View File

@@ -202,6 +202,15 @@ class ServiceManager:
result.setdefault(ins, {}).setdefault(serv, []).append(p)
return result
def wildcard(self, ins):
if ins is None or ins == 'all':
return list(self.info)
pat = re.sub(r'(\.|\*)', '.*', ins)
if pat == ins:
return None
pat = re.compile(pat)
return [k for k in self.info if pat.match(k)]
def check_running(self, ins, service):
self.get_info()
if ins not in self.info:
@@ -215,6 +224,9 @@ class ServiceManager:
def stop(self, ins, service=None):
"""stop service (or all services) of instance <ins>"""
ins_list = self.wildcard(ins)
if ins_list is not None:
return ins_list
procs = self.get_procs()
done = False
services = self.services if service is None else [service]
@@ -247,6 +259,9 @@ class ServiceManager:
def do_stop(self, ins, service=None, *args):
self.get_info()
ins_list = self.wildcard(ins)
if ins_list is not None:
return ins_list
if not self.stop(ins, service):
print('nothing to stop')
@@ -258,6 +273,9 @@ class ServiceManager:
return env.get('%s_ROOT' % gr, ''), env
def do_start(self, ins, service=None, cfg='', restart=False, wait=False, logger=None):
ins_list = self.wildcard(ins)
if ins_list is not None:
return ins_list
if logger is None:
class logger:
@staticmethod
@@ -349,10 +367,15 @@ class ServiceManager:
os.chdir(wd)
def do_restart(self, ins, service=None, cfg=None, logger=None):
ins_list = self.wildcard(ins)
if ins_list is not None:
return ins_list
self.do_start(ins, service, cfg, True, logger=logger)
def do_run(self, ins, service=None, cfg=None):
"""for tests: run and wait"""
if self.wildcard(ins) is not None:
raise UsageError('no wildcards allowed with %s run' % self.group)
if not service:
try:
service, = self.services
@@ -362,17 +385,22 @@ class ServiceManager:
def do_list(self, ins=None, *args):
"""info about running services"""
show_unused = ins == 'all'
if show_unused:
ins = None
instances = self.wildcard(ins)
if instances is None:
ins_set = {ins}
else:
ins_set = set(instances)
cfginfo = {}
procs = self.get_procs(self.all, cfginfo)
rows = []
merged = OrderedDict()
show_unused = ins == 'all'
if show_unused:
ins = None
for group, sm in self.all.items():
sm.get_info()
for ins_i, info_dict in sm.info.items():
if ins is not None and ins != ins_i:
if ins_i not in ins_set:
continue
for serv, port in info_dict.items():
if ins_i not in merged:
@@ -417,18 +445,25 @@ class ServiceManager:
if not callable(method):
raise UsageError('%s is no valid action' % action)
try:
method(*args)
ins_list = method(*args)
except TypeError as e:
errtxt = str(e)
if 'do_%s(' % action in errtxt and 'argument' in errtxt:
raise UsageError(errtxt)
raise
# treat wildcards:
for ins in ins_list or ():
print('\n%s %s %s:' % (action, self.group, ins))
try:
method(ins, *args[1:])
except Exception as e:
print(str(e))
def do_help(self, *args):
if self.main_ins:
usage = self.USAGE.replace(' <instance>', '').replace(' [<instance>]', '') % ''
else:
usage = self.USAGE % ('<instance> is one of %s' % ', '.join(self.info))
usage = self.USAGE % ('<instance> is one of %s' % ', '.join(self.info))
print(usage)
def treat_args(self, argdict, unknown=(), extra=()):