improve commandline argument behaviour

+ allow hprt2 / zebra2
This commit is contained in:
2023-06-05 14:38:14 +02:00
parent fcef9cb142
commit 6130c5b5c5
5 changed files with 48 additions and 38 deletions

View File

@ -39,12 +39,12 @@ class SewebManager(ServiceManager):
USAGE = """
Usage:
seaweb list [<instance>]
seaweb list [instance]
seaweb start <instance>
seaweb restart <instance>
seaweb stop <instance>
<instance> is one of %s
%s
"""
@ -57,37 +57,45 @@ def run(group, arglist):
defaults = parser['DEFAULT']
managers = {cls.group: cls() for cls in all if cls.group + '_command' in defaults}
serv = managers[group]
args = dict(action='gui', ins=serv.main_ins)
ACTION = 1
INS = 2
SERVICE = 2 if serv.main_ins else 3
# args = dict(action='gui', ins=serv.main_ins)
args = {}
guessed_args = []
extra = []
pos = 0
unorder = False
for arg in arglist:
if hasattr(serv, 'do_' + arg):
args['action'] = arg
if pos >= ACTION:
unorder = True
pos = ACTION
elif arg in serv.services:
args['service'] = arg
if pos >= SERVICE:
unorder = True
pos = SERVICE
elif arg in serv.info or arg == 'all' or serv.wildcard(arg):
args['ins'] = arg
if pos >= INS:
unorder = True
pos = INS
arg_is = {
'action': lambda arg: hasattr(serv, 'do_' + arg),
'ins': lambda arg: arg in serv.info or arg == 'all' or serv.wildcard(arg),
'service': lambda arg: arg in serv.services,
}
for kind in 'action', 'ins', 'service':
if arglist and arg_is[kind](arglist[0]): # arg is of expected kind
args[kind] = arglist.pop(0)
continue
if guessed_args and guessed_args[-1][0] == kind: # last arg was skipped
args[kind] = guessed_args.pop()[1]
continue
if not arglist:
break
arg = arglist.pop(0)
for kind, is_kind in arg_is.items():
if is_kind(arg):
guessed_args.append((kind, arg))
break
else:
extra.append(arg)
if unorder:
args.update(guessed_args)
args.setdefault('action', 'gui')
if serv.main_ins:
args.setdefault('ins', serv.main_ins)
if guessed_args:
args.setdefault('action', 'gui')
print('do you mean:\n %s %s %s %s %s' %
(group, args.get('action', ''), args.get('ins', ''), args.get('service', ''), ' '.join(extra)))
else:
else:
try:
serv.action(args['action'], *serv.treat_args(args, extra))
serv.action(args['action'], *serv.treat_args(args, extra + arglist))
except AttributeError:
raise
except UsageError as e: