improve missing arg handling

- better error messages
- missing instrument is only allowed with 'list'
- missing argument to be replaced with ? in error message
- sea cli may now be given with 'graph' or 'sea' for service
This commit is contained in:
l_samenv
2025-01-21 10:49:54 +01:00
parent fda6e37238
commit 556a7eff9d
3 changed files with 23 additions and 15 deletions

View File

@ -49,7 +49,7 @@ class SewebManager(ServiceManager):
all = NicosManager, FrappyManager, SeaManager, SewebManager all = NicosManager, FrappyManager, SeaManager, SewebManager
KINDS = 'action', 'ins', 'service'
def run(group, arglist): def run(group, arglist):
try: try:
@ -68,7 +68,7 @@ def run(group, arglist):
'service': lambda arg: arg in serv.services, 'service': lambda arg: arg in serv.services,
} }
for kind in 'action', 'ins', 'service': for kind in KINDS:
if arglist and arg_is[kind](arglist[0]): # arg is of expected kind if arglist and arg_is[kind](arglist[0]): # arg is of expected kind
args[kind] = arglist.pop(0) args[kind] = arglist.pop(0)
continue continue
@ -91,8 +91,11 @@ def run(group, arglist):
args.setdefault('ins', serv.main_ins) args.setdefault('ins', serv.main_ins)
if guessed_args: if guessed_args:
args.setdefault('action', 'gui') args.setdefault('action', 'gui')
print('do you mean:\n %s %s %s %s %s' % guessed = [group] + [args.get(k, '') for k in KINDS] + extra
(group, args.get('action', ''), args.get('ins', ''), args.get('service', ''), ' '.join(extra))) while not guessed[-1]:
guessed.pop()
guessed = ' '.join(a or '?' for a in guessed)
print(f'do you mean:\n {guessed}')
else: else:
try: try:
serv.action(args['action'], *serv.treat_args(args, extra + arglist)) serv.action(args['action'], *serv.treat_args(args, extra + arglist))

20
base.py
View File

@ -222,7 +222,7 @@ class ServiceManager:
or None, when no wildcard character in ins or None, when no wildcard character in ins
""" """
if ins is None or ins == 'all': if not ins or ins == 'all':
return list(self.info) return list(self.info)
pat = re.sub(r'(\.|\*)', '.*', ins) pat = re.sub(r'(\.|\*)', '.*', ins)
if pat == ins: if pat == ins:
@ -282,9 +282,9 @@ class ServiceManager:
return done return done
def do_stop(self, ins, service=None, *args): def do_stop(self, ins, service=None, *args):
if not ins:
raise UsageError(f'need instrument or "all" to stop all')
self.get_info() self.get_info()
if ins is None:
raise ValueError('use stop all if you really want to stop all')
ins_list = self.wildcard(ins) ins_list = self.wildcard(ins)
if ins_list is not None: if ins_list is not None:
return ins_list return ins_list
@ -301,6 +301,8 @@ class ServiceManager:
return env.get('%s_ROOT' % gr, ''), env return env.get('%s_ROOT' % gr, ''), env
def do_start(self, ins, service=None, cfg='', restart=False, wait=False, logger=None, opts=''): def do_start(self, ins, service=None, cfg='', restart=False, wait=False, logger=None, opts=''):
if not ins:
raise UsageError(f'need instrument or "all" to start all')
ins_list = self.wildcard(ins) ins_list = self.wildcard(ins)
if ins_list is not None: if ins_list is not None:
return ins_list return ins_list
@ -319,10 +321,10 @@ class ServiceManager:
return return
try: try:
service_ports = self.get_ins_info(ins) service_ports = self.get_ins_info(ins)
except ValueError: except (KeyError, ValueError):
raise ValueError('do not know %r' % ins) raise UsageError('do not know %r' % ins)
if ins in self.remote_hosts: if ins in self.remote_hosts:
raise ValueError('can not start, %s is running on a remote host' % self.group) raise UsageError('can not start, %s is running on a remote host' % self.group)
services = list(service_ports) if service is None else [service] services = list(service_ports) if service is None else [service]
if restart: if restart:
self.stop(ins, service) self.stop(ins, service)
@ -406,8 +408,8 @@ class ServiceManager:
os.chdir(wd) os.chdir(wd)
def do_restart(self, ins, service=None, cfg=None, logger=None): def do_restart(self, ins, service=None, cfg=None, logger=None):
if ins is None: if not ins:
raise UsageError("need instance or 'all' or wildcard") raise UsageError("need instrument or 'all' or wildcard")
ins_list = self.wildcard(ins) ins_list = self.wildcard(ins)
if ins_list is not None: if ins_list is not None:
if cfg is not None: if cfg is not None:
@ -418,7 +420,7 @@ class ServiceManager:
def do_run(self, ins, service=None, cfg=None, opts=''): def do_run(self, ins, service=None, cfg=None, opts=''):
"""for tests: run and wait""" """for tests: run and wait"""
if self.wildcard(ins) is not None: if self.wildcard(ins) is not None:
raise UsageError('no wildcards allowed with %s run' % self.group) raise UsageError('need instrument and service for "%s run"' % self.group)
if not service: if not service:
try: try:
service, = self.services service, = self.services

View File

@ -68,7 +68,7 @@ class SeaManager(ServiceManager):
%(legend)s %(legend)s
""" """
def do_cli(self, ins): def do_cli(self, ins, service=None):
if self.wildcard(ins): if self.wildcard(ins):
raise UsageError('wildcards not allowed in sea cli') raise UsageError('wildcards not allowed in sea cli')
try: try:
@ -78,7 +78,8 @@ class SeaManager(ServiceManager):
print(str(e)) print(str(e))
except KeyError: # running on an other machine? except KeyError: # running on an other machine?
self.do_help() self.do_help()
run_command('six -sea %s' % ins, wait=True) service = service or 'sea'
run_command(f'six -{service} {ins}', wait=True)
def do_gui(self, ins='', *args): def do_gui(self, ins='', *args):
if ins and self.wildcard(ins): if ins and self.wildcard(ins):
@ -196,6 +197,8 @@ class SeaManager(ServiceManager):
argdict['ins'] = arg argdict['ins'] = arg
else: else:
raise UsageError('unknown argument: %s' % arg) raise UsageError('unknown argument: %s' % arg)
else:
print('env variable "InstrumentHostList" is not defined')
result = [argdict.pop('ins', '')] result = [argdict.pop('ins', '')]
service = argdict.pop('service', '') service = argdict.pop('service', '')
if service: if service: