improve commandline argument behaviour
+ allow hprt2 / zebra2
This commit is contained in:
62
__init__.py
62
__init__.py
@ -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:
|
||||
|
Reference in New Issue
Block a user