diff options
author | Christian Poessinger <christian@poessinger.com> | 2022-12-01 14:20:28 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-01 14:20:28 +0100 |
commit | 33c0d77bfa10c81dfc93c4eca781279df9cf1034 (patch) | |
tree | 274033b3413e383820c665de2b874c929a91524c /python | |
parent | 97f36fe0c1f337d73e5f0af4e2fecefadc3325b4 (diff) | |
parent | 032de023c21d92262243a2abb34bfd4c2009958e (diff) | |
download | vyos-1x-33c0d77bfa10c81dfc93c4eca781279df9cf1034.tar.gz vyos-1x-33c0d77bfa10c81dfc93c4eca781279df9cf1034.zip |
Merge pull request #1684 from jestabro/config-script-dependency
pki: T4847: correct calling of config mode script dependencies from pki.py
Diffstat (limited to 'python')
-rw-r--r-- | python/vyos/configdep.py | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/python/vyos/configdep.py b/python/vyos/configdep.py index ca05cb092..d4b2cc78f 100644 --- a/python/vyos/configdep.py +++ b/python/vyos/configdep.py @@ -15,6 +15,7 @@ import os import json +import typing from inspect import stack from vyos.util import load_as_module @@ -22,7 +23,12 @@ from vyos.defaults import directories from vyos.configsource import VyOSError from vyos import ConfigError -dependent_func = {} +# https://peps.python.org/pep-0484/#forward-references +# for type 'Config' +if typing.TYPE_CHECKING: + from vyos.config import Config + +dependent_func: dict[str, list[typing.Callable]] = {} def canon_name(name: str) -> str: return os.path.splitext(name)[0].replace('-', '_') @@ -34,14 +40,14 @@ def canon_name_of_path(path: str) -> str: def caller_name() -> str: return stack()[-1].filename -def read_dependency_dict(): +def read_dependency_dict() -> dict: path = os.path.join(directories['data'], 'config-mode-dependencies.json') with open(path) as f: d = json.load(f) return d -def get_dependency_dict(config): +def get_dependency_dict(config: 'Config') -> dict: if hasattr(config, 'cached_dependency_dict'): d = getattr(config, 'cached_dependency_dict') else: @@ -49,7 +55,7 @@ def get_dependency_dict(config): setattr(config, 'cached_dependency_dict', d) return d -def run_config_mode_script(script: str, config): +def run_config_mode_script(script: str, config: 'Config'): path = os.path.join(directories['conf_mode'], script) name = canon_name(script) mod = load_as_module(name, path) @@ -63,18 +69,22 @@ def run_config_mode_script(script: str, config): except (VyOSError, ConfigError) as e: raise ConfigError(repr(e)) -def def_closure(target: str, config): +def def_closure(target: str, config: 'Config', + tagnode: typing.Optional[str] = None) -> typing.Callable: script = target + '.py' def func_impl(): + if tagnode: + os.environ['VYOS_TAGNODE_VALUE'] = tagnode run_config_mode_script(script, config) return func_impl -def set_dependents(case, config): +def set_dependents(case: str, config: 'Config', + tagnode: typing.Optional[str] = None): d = get_dependency_dict(config) k = canon_name_of_path(caller_name()) l = dependent_func.setdefault(k, []) for target in d[k][case]: - func = def_closure(target, config) + func = def_closure(target, config, tagnode) l.append(func) def call_dependents(): |