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