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:
parent
61ba9336b8
commit
fcd85f1ca4
34
__init__.py
34
__init__.py
@ -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
17
bin/sea
@ -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 = """
|
||||||
|
@ -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 ''
|
|
||||||
|
7
nicos.py
7
nicos.py
@ -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
18
sea.py
@ -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
62
sicsclient.py
Normal 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
|
Loading…
x
Reference in New Issue
Block a user