[WIP] include SEA info

This commit is contained in:
zolliker 2023-09-11 08:35:38 +02:00
parent a255b9b715
commit 008690fe84
3 changed files with 62 additions and 26 deletions

View File

@ -363,7 +363,6 @@ class ServiceManager:
logger.info('%sstarted: %s', 're' if restart else '', cmd) logger.info('%sstarted: %s', 're' if restart else '', cmd)
break break
else: else:
logger.info(cmd)
logger.error('starting failed: %s', cmd) logger.error('starting failed: %s', cmd)
finally: finally:
os.chdir(wd) os.chdir(wd)

View File

@ -25,7 +25,8 @@ import os
from glob import glob from glob import glob
from os.path import join, isdir, basename, expanduser, exists from os.path import join, isdir, basename, expanduser, exists
from configparser import ConfigParser from configparser import ConfigParser
from servicemanager.base import ServiceManager, ServiceDown, UsageError from .base import ServiceManager, ServiceDown, UsageError
from .seaman import SeaManager
def dummy(*args, **kwds): def dummy(*args, **kwds):
@ -103,6 +104,13 @@ class FrappyManager(ServiceManager):
raise UsageError('no wildcards allowed with %s start' % self.group) raise UsageError('no wildcards allowed with %s start' % self.group)
if cfg and not service and len(self.services) != 1: if cfg and not service and len(self.services) != 1:
raise UsageError('need service to start (one of %s)' % ', '.join(self.services)) raise UsageError('need service to start (one of %s)' % ', '.join(self.services))
if cfg.startswith('~'):
cfg = cfg[1:]
seacfg = SeaManager().guess_frappy_cfg(ins).get(service)
if seacfg:
cfg = seacfg
if not cfg:
return
super().do_start(ins, service, cfg, restart, wait, logger) super().do_start(ins, service, cfg, restart, wait, logger)
def do_restart(self, ins, service=None, cfg=None, logger=None): def do_restart(self, ins, service=None, cfg=None, logger=None):
@ -154,9 +162,17 @@ class FrappyManager(ServiceManager):
init(*nodes) init(*nodes)
interact() interact()
def all_cfg(self, ins, service, by_dir=False): def all_cfg(self, ins, service, details=False):
"""get available cfg files
:param ins: instance
:param service: service nor None for all services
:param details:
True: return a dict of <cfgdir> of <cfg> of <description>
False: return a set of <cfg>
"""
result = {} result = {}
all_cfg = {} all_cfg = set()
if not ins: if not ins:
return {} return {}
namespace = {k: dummy for k in ('Mod', 'Param', 'Command', 'Group')} namespace = {k: dummy for k in ('Mod', 'Param', 'Command', 'Group')}
@ -169,6 +185,7 @@ class FrappyManager(ServiceManager):
cfg_pattern ='*_cfg.py' if exists(join(root, 'frappy')) else '*.cfg' cfg_pattern ='*_cfg.py' if exists(join(root, 'frappy')) else '*.cfg'
for cfgfile in glob(join(cfgdir, cfg_pattern)): for cfgfile in glob(join(cfgdir, cfg_pattern)):
desc = '' desc = ''
if details:
try: try:
if cfgfile.endswith('.py'): if cfgfile.endswith('.py'):
node.description = '' node.description = ''
@ -189,19 +206,19 @@ class FrappyManager(ServiceManager):
pass pass
cfg = basename(cfgfile)[:1-len(cfg_pattern)] cfg = basename(cfgfile)[:1-len(cfg_pattern)]
if cfg not in all_cfg: if cfg not in all_cfg:
all_cfg[cfg] = desc all_cfg.add(cfg)
cfgs[cfg] = desc cfgs[cfg] = desc
return result if by_dir else all_cfg return result if details else all_cfg
def do_listcfg(self, ins='', service='', prt=print): def do_listcfg(self, ins='', service='', prt=print):
if not ins: if not ins:
raise UsageError('missing instance') raise UsageError('missing instance')
if service: if service:
all_cfg = self.all_cfg(ins, service, by_dir=True) all_cfg = self.all_cfg(ins, service, True)
else: else:
all_cfg = {} all_cfg = {}
for service in self.services: for service in self.services:
all_cfg.update(self.all_cfg(ins, service, by_dir=True)) all_cfg.update(self.all_cfg(ins, service, True))
for cfgdir, cfgs in all_cfg.items(): for cfgdir, cfgs in all_cfg.items():
if cfgs: if cfgs:
prt('') prt('')

View File

@ -118,6 +118,8 @@ class SeaManager(ServiceManager):
""" """
if service != 'sea': # ignore when service == 'graph' if service != 'sea': # ignore when service == 'graph'
return '' return ''
if 'sea' not in self.get_procs().get(ins):
return ''
try: try:
searoot = self.env[ins].get('SEA_ROOT', '') searoot = self.env[ins].get('SEA_ROOT', '')
seastatus = join(searoot, ins, 'status', 'seastatus.tcl') seastatus = join(searoot, ins, 'status', 'seastatus.tcl')
@ -172,3 +174,21 @@ class SeaManager(ServiceManager):
else: else:
raise UsageError('unknown argument: %s' % arg) raise UsageError('unknown argument: %s' % arg)
return [argdict.pop('ins', '')] + extra return [argdict.pop('ins', '')] + extra
def guess_frappy_cfg(self, ins):
self.get_info()
cfgs = self.get_cfg(ins, 'sea').split('/')
result = {}
if cfgs[0] and cfgs[0] in self.all_cfg(ins, 'main'):
result['main'] = cfgs[0]
allsticks = self.all_cfg(ins, 'stick')
stick = cfgs[:2][-1]
if stick:
for s in (stick + 'stick', stick):
if s in allsticks:
result['stick'] = s
break
addons = [a for a in cfgs[2:] if a in self.all_cfg(ins, 'addons')]
if addons:
result['addons'] = ','.join(addons)
return result