106 lines
3.5 KiB
Python
106 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
# *****************************************************************************
|
|
#
|
|
# 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 <markus.zolliker@psi.ch>
|
|
#
|
|
# *****************************************************************************
|
|
"""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
|
|
"""
|
|
|
|
from servicemanager.base import ServiceManager, ServiceDown, UsageError, get_config
|
|
from servicemanager.nicosman import NicosManager
|
|
from servicemanager.seaman import SeaManager
|
|
from servicemanager.frappyman import FrappyManager
|
|
|
|
|
|
class SewebManager(ServiceManager):
|
|
group = 'seweb'
|
|
services = ('',)
|
|
USAGE = """
|
|
Usage:
|
|
|
|
seaweb list [instance]
|
|
seaweb start <instance>
|
|
seaweb restart <instance>
|
|
seaweb stop <instance>
|
|
|
|
%s
|
|
"""
|
|
|
|
|
|
all = NicosManager, FrappyManager, SeaManager, SewebManager
|
|
|
|
|
|
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 '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)
|
|
|
|
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:
|
|
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))
|
|
|
|
|