unify do_listcfg and nicos frappy_list()

This commit is contained in:
l_samenv 2023-06-06 16:20:37 +02:00
parent 6130c5b5c5
commit a255b9b715

View File

@ -28,6 +28,17 @@ from configparser import ConfigParser
from servicemanager.base import ServiceManager, ServiceDown, UsageError from servicemanager.base import ServiceManager, ServiceDown, UsageError
def dummy(*args, **kwds):
pass
class Node:
description = ''
def __call__(self, equipment_id, description, *args, **kwds):
self.description = description
class FrappyManager(ServiceManager): class FrappyManager(ServiceManager):
group = 'frappy' group = 'frappy'
services = ('main', 'stick', 'addons') services = ('main', 'stick', 'addons')
@ -146,31 +157,45 @@ class FrappyManager(ServiceManager):
def all_cfg(self, ins, service, by_dir=False): def all_cfg(self, ins, service, by_dir=False):
result = {} result = {}
all_cfg = {} all_cfg = {}
for ins in [ins] if ins else self.info: if not ins:
for service in [service] if service else self.services: return {}
for cfgdir in self.config_dirs(ins, service): namespace = {k: dummy for k in ('Mod', 'Param', 'Command', 'Group')}
result.setdefault(cfgdir, {}) namespace['Node'] = node = Node()
cfgs = result[cfgdir] for service in [service] if service else self.services:
root = self.env[ins].get('FRAPPY_ROOT') for cfgdir in self.config_dirs(ins, service):
cfg_pattern ='*_cfg.py' if exists(join(root, 'frappy')) else '*.cfg' result.setdefault(cfgdir, {})
for cfgfile in glob(join(cfgdir, cfg_pattern)): cfgs = result[cfgdir]
desc = '' root = self.env[ins].get('FRAPPY_ROOT')
try: cfg_pattern ='*_cfg.py' if exists(join(root, 'frappy')) else '*.cfg'
for cfgfile in glob(join(cfgdir, cfg_pattern)):
desc = ''
try:
if cfgfile.endswith('.py'):
node.description = ''
try:
with open(cfgfile, encoding='utf-8') as f:
exec(f.read(), namespace)
except Exception as e:
node.description = repr(e)
desc = node.description
else:
parser = ConfigParser() parser = ConfigParser()
parser.read(cfgfile) parser.read(cfgfile)
for s in parser.sections(): for s in parser.sections():
if s == 'NODE' or s.startswith('node '): if s == 'NODE' or s.startswith('node '):
desc = parser[s].get('description', '').split('\n')[0] desc = parser[s].get('description', '').split('\n')[0]
break break
except Exception: except Exception:
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[cfg] = desc
cfgs[cfg] = desc cfgs[cfg] = desc
return result if by_dir else all_cfg return result if by_dir else all_cfg
def do_listcfg(self, ins='', service=''): def do_listcfg(self, ins='', service='', prt=print):
if not ins:
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, by_dir=True)
else: else:
@ -179,10 +204,11 @@ class FrappyManager(ServiceManager):
all_cfg.update(self.all_cfg(ins, service, by_dir=True)) all_cfg.update(self.all_cfg(ins, service, by_dir=True))
for cfgdir, cfgs in all_cfg.items(): for cfgdir, cfgs in all_cfg.items():
if cfgs: if cfgs:
print('\n--- %s:\n' % cfgdir) prt('')
prt('--- %s:' % cfgdir)
keylen = max(len(k) for k in cfgs) keylen = max(len(k) for k in cfgs)
for cfg, desc in cfgs.items(): for cfg, desc in cfgs.items():
print('%s %s' % (cfg.ljust(keylen), desc)) prt('%s %s' % (cfg.ljust(keylen), desc))
def treat_args(self, argdict, unknown=(), extra=()): def treat_args(self, argdict, unknown=(), extra=()):
if len(unknown) == 1: if len(unknown) == 1: