various improvements

- servman.cfg moved to home directory
- changed mechanism to retrieve frappy cfg in list
- fixed bin/sea to accept also foreign instruments for gui / cli
This commit is contained in:
l_samenv 2020-11-03 11:30:00 +01:00
parent 61ba9336b8
commit fcd85f1ca4
6 changed files with 112 additions and 34 deletions

View File

@ -129,10 +129,11 @@ class ServiceManager:
result = OrderedDict() result = OrderedDict()
parser = ConfigParser(interpolation=None) parser = ConfigParser(interpolation=None)
parser.optionxform = str parser.optionxform = str
parser.read(expanduser('servman.cfg')) parser.read(expanduser('~/servman.cfg'))
defaults = parser['DEFAULT'] defaults = parser['DEFAULT']
self.commands = {} self.commands = {}
self.revcmd = {} self.revcmd = {}
for ins in parser.sections(): for ins in parser.sections():
section = dict(parser[ins]) section = dict(parser[ins])
command = section.get('%s_command' % self.group) command = section.get('%s_command' % self.group)
@ -140,26 +141,27 @@ class ServiceManager:
if self.group in section: if self.group in section:
self.commands[ins] = command self.commands[ins] = command
services = self.get_services(parser[ins]) services = self.get_services(parser[ins])
env = {k: expanduser(section.get(k)) for k in defaults if k.isupper()} env = {k: expanduser(section.get(k) % dict(ins=ins))
for k in defaults if k.isupper()}
result[ins] = services result[ins] = services
self.env[ins] = env self.env[ins] = env
self.info = result self.info = result
def get_cmdpats(self, groups): #def get_cmdpats(self, groups):
return self.cmdpats # return self.cmdpats
def get_ins_info(self, ins): def get_ins_info(self, ins):
self.get_info() self.get_info()
return self.info[ins] return self.info[ins]
def get_cfg(self, cmd): #def get_cfg(self, service, cmd):
"""return info about running program, if relevant # """return info about running program, if relevant
#
# example for frappy: return cfg
# """
# return ''
example for frappy: return cfg def get_procs(self, groups=None, cfginfo=None):
"""
return ''
def get_procs(self, groups=None):
"""return processes """return processes
result is a dict[ins] of dict[service] of list of tuples (process, cfg) result is a dict[ins] of dict[service] of list of tuples (process, cfg)
@ -190,6 +192,8 @@ class ServiceManager:
gdict = match.groupdict() gdict = match.groupdict()
ins = gdict['ins'] ins = gdict['ins']
serv = gdict['serv'] serv = gdict['serv']
if cfginfo is not None and 'cfg' in gdict:
cfginfo[ins, serv] = gdict['cfg']
result.setdefault(ins, {}).setdefault(serv, []).append(p) result.setdefault(ins, {}).setdefault(serv, []).append(p)
return result return result
@ -335,7 +339,8 @@ class ServiceManager:
def do_list(self, ins=None, *args): def do_list(self, ins=None, *args):
"""info about running services""" """info about running services"""
procs = self.get_procs(self.all) cfginfo = {}
procs = self.get_procs(self.all, cfginfo)
rows = [] rows = []
merged = OrderedDict() merged = OrderedDict()
show_unused = ins == 'all' show_unused = ins == 'all'
@ -361,15 +366,14 @@ class ServiceManager:
if plist: if plist:
if sm == self: if sm == self:
show_ins = True show_ins = True
cfg = sm.get_cfg(' '.join(plist[0].info['cmdline']))
gs = '%s %s' % (group, serv) gs = '%s %s' % (group, serv)
port = str(port or '') port = str(port or '')
run_info.append(('', gs, port, cfg)) run_info.append(('', gs, port, cfginfo.get((ins_i, serv), '')))
if len(plist) > 1: if len(plist) > 1:
rows.append(['', ' WARNING: multiple processes %s' rows.append(['', ' WARNING: multiple processes %s'
% ', '.join(str(p.pid) for p, _ in plist)]) % ', '.join(str(p.pid) for p, _ in plist)])
extra = sm.extra_info(ins_i) extra = sm.extra_info(ins_i)
if extra and run_info: if extra and show_ins:
run_info.append(['', extra]) run_info.append(['', extra])
if show_ins: if show_ins:
rows.extend(run_info) rows.extend(run_info)

17
bin/sea
View File

@ -25,14 +25,19 @@ import os
from os.path import join, abspath, split, dirname, expanduser from os.path import join, abspath, split, dirname, expanduser
import sys import sys
nicos_root = os.environ.get('NICOS_ROOT', expanduser('~/nicos')) #nicos_root = os.environ.get('NICOS_ROOT', expanduser('~/nicos'))
pkg_dir = abspath(join(nicos_root, 'nicos_linse')) #pkg_dir = abspath(join(nicos_root, 'nicos_linse'))
sys.path.insert(1, join(pkg_dir, 'common')) #sys.path.insert(1, join(pkg_dir, 'common'))
from clitools import FrappyManager, NicosManager, SeaManager, run sys.path.insert(1, abspath(join(__file__, '../../..')))
NicosManager(pkg_dir) from servman import run
FrappyManager(pkg_dir) from servman.frappy import FrappyManager
from servman.nicos import NicosManager
from servman.sea import SeaManager
NicosManager()
FrappyManager()
serv = SeaManager() serv = SeaManager()
USAGE = """ USAGE = """

View File

@ -20,16 +20,10 @@
# #
# ***************************************************************************** # *****************************************************************************
import re
from servman import ServiceManager from servman import ServiceManager
class FrappyManager(ServiceManager): class FrappyManager(ServiceManager):
group = 'frappy' group = 'frappy'
services = ('main', 'stick', 'addons') services = ('main', 'stick', 'addons')
def get_cfg(self, cmd):
if cmd:
match = self.cmdpat.match(cmd)
if match:
return match.groupdict().get('cfg')
return ''

View File

@ -233,6 +233,7 @@ class NicosManager(ServiceManager):
env = self.prepare_start(ins)[1] env = self.prepare_start(ins)[1]
os.environ.update(env) os.environ.update(env)
os.chdir(join(os.environ['NICOS_ROOT'], env['NICOS_PACKAGE'])) os.chdir(join(os.environ['NICOS_ROOT'], env['NICOS_PACKAGE']))
sys.path.insert(0, os.environ['NICOS_ROOT'])
def run_client(self, ins, main, app, **kwargs): def run_client(self, ins, main, app, **kwargs):
serverhost = os.environ.get('NICOS_SERVER_HOST', 'localhost') serverhost = os.environ.get('NICOS_SERVER_HOST', 'localhost')
@ -248,8 +249,10 @@ class NicosManager(ServiceManager):
def do_gui(self, ins): def do_gui(self, ins):
self.prepare_client(ins) self.prepare_client(ins)
print(os.getcwd())
from nicos.clients.gui.main import main from nicos.clients.gui.main import main
print('starting nicos gui %s' % ins, expanduser('~/.config/nicos_%s' % ins)) userpath = expanduser('~/.config/nicos_%s' % ins)
self.run_client(ins, main, 'nicos-gui', instance=ins) print('starting nicos gui %s' % ins, userpath)
self.run_client(ins, main, 'nicos-gui', userpath=userpath)

18
sea.py
View File

@ -48,15 +48,25 @@ class SeaManager(ServiceManager):
services = ('sea', 'graph') services = ('sea', 'graph')
def do_cli(self, ins): def do_cli(self, ins):
self.check_running(ins, 'sea')
run_command('six -sea %s' % ins, wait=True)
def do_gui(self, ins):
try: try:
self.check_running(ins, 'sea') self.check_running(ins, 'sea')
except ServiceDown as e: except ServiceDown as e:
print('%s, try to start...' % e) print('%s, try to start...' % e)
self.do_start(ins) self.do_start(ins)
time.sleep(1) # make sure caller did read the message time.sleep(1) # make sure caller did read the message
except KeyError as e: # running on an other machine?
pass
run_command('six -sea %s' % ins, wait=True)
def do_gui(self, ins=''):
try:
self.check_running(ins, 'sea')
except ServiceDown as e:
print('%s, try to start...' % e)
self.do_start(ins)
time.sleep(1) # make sure caller did read the message
except KeyError as e: # running on an other machine?
pass
run_command('SeaClient %s' % ins) run_command('SeaClient %s' % ins)
print('starting sea gui %s' % ins) print('starting sea gui %s' % ins)
time.sleep(5)

62
sicsclient.py Normal file
View File

@ -0,0 +1,62 @@
import socket
def raw_sics_client(hostport):
if ':' in hostport:
host, port = hostport.split(':')
hostport = (host, int(port))
sock = socket.create_connection(hostport, timeout=3)
bbuf = b''
while True:
try:
reply = sock.recv(8192)
# print(reply.decode('latin-1'), end='')
if not reply:
sock.close()
return
except socket.timeout:
sock.close()
return
bbuf += reply
blist = bbuf.split(b'\n')
bbuf = blist.pop()
for bline in blist:
request = yield bline.decode('latin-1')
if request is not None:
sock.sendall(request.encode('latin-1') + b'\n')
def check(sics, command, expected):
reply = sics.send(command)
if reply != expected:
raise ValueError('expected %r but got %r' % (expected, reply))
def sics_coroutine(hostport, login):
sics = raw_sics_client(hostport)
check(sics, None, 'OK')
check(sics, login, 'Login OK')
request = yield
while True:
reply = sics.send('fulltransact %s' % request)
while not reply.startswith('TRANSACTIONSTART'):
reply = next(sics)
reply = next(sics)
result = []
while not reply.startswith('TRANSACTIONFINISHED'):
result.append(reply)
reply = next(sics)
request = yield '\n'.join(result)
def sics_client(hostport, login='Spy 007'):
sics = sics_coroutine(hostport, login)
next(sics) # start generator
return sics
def sics_command(hostport, command, login='Spy 007'):
sics = sics_client(hostport, login)
result = sics.send(command)
sics.close()
return result