# ***************************************************************************** # # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation; either version 2 of the License, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more # details. # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Software Foundation, Inc., # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Module authors: # Markus Zolliker # # ***************************************************************************** """start/stop/list of services this code is currently used: - from NICOS to start and stop frappy servers - from a script allowing to start/stop/list (and more) multiple frappy and nicos servers """ import sys from servicemanager.base import ServiceManager, ServiceDown, UsageError, get_config from servicemanager.nicosman import NicosManager from servicemanager.seaman import SeaManager from servicemanager.frappyman import FrappyManager, Reconnect, Keep from servicemanager.single import SewebManager, FeederManager #from servicemanager.racks import RackConfig #rack = RackConfig() all = NicosManager, FrappyManager, SeaManager, SewebManager, FeederManager KINDS = 'action', 'ins', 'service' def run(group, arglist): try: parser = get_config() 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) args = {} guessed_args = [] extra = [] 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 KINDS: 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) 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') guessed = [group] + [args.get(k, '') for k in KINDS] + extra while not guessed[-1]: guessed.pop() guessed = ' '.join(a or '?' for a in guessed) print(f'do you mean:\n {guessed}') else: try: serv.action(args['action'], *serv.treat_args(args, extra + arglist)) except AttributeError: raise except UsageError as e: serv.do_help() print('ERROR:', str(e)) sys.exit(1)