summaryrefslogtreecommitdiff
path: root/src/helpers
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@vyos.io>2026-04-20 15:48:43 -0500
committerGitHub <noreply@github.com>2026-04-20 15:48:43 -0500
commit1d81dd0c6190d9fd36d01014f3b0a2d4bb91a919 (patch)
tree5b6f8c71cf87fba1eef54a1c27cb96f2819b26b9 /src/helpers
parent67b68bd9893ad3a39af53ceee856ce5c61ed0638 (diff)
parent61a7a19562088250c87cf11b798c84dc470a6c7d (diff)
downloadvyos-1x-1d81dd0c6190d9fd36d01014f3b0a2d4bb91a919.tar.gz
vyos-1x-1d81dd0c6190d9fd36d01014f3b0a2d4bb91a919.zip
Merge pull request #5096 from jestabro/extend-activation-system
T8445: T8335: Extend config activation system
Diffstat (limited to 'src/helpers')
-rwxr-xr-xsrc/helpers/run-config-activation.py89
1 files changed, 67 insertions, 22 deletions
diff --git a/src/helpers/run-config-activation.py b/src/helpers/run-config-activation.py
index f20adff1e..7e7a6571e 100755
--- a/src/helpers/run-config-activation.py
+++ b/src/helpers/run-config-activation.py
@@ -14,20 +14,33 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-import re
+
+import sys
import logging
+
from pathlib import Path
from argparse import ArgumentParser
from vyos.compose_config import ComposeConfig
from vyos.compose_config import ComposeConfigError
+from vyos.utils.activate import refresh_activation_list
+from vyos.utils.activate import get_activation_scripts
+from vyos.utils.activate import get_activation
+from vyos.utils.activate import set_activation
+from vyos.utils.activate import is_active
+from vyos.utils.system import load_as_module
+from vyos.utils.func import FalseCallable
from vyos.defaults import directories
+from vyos.defaults import activation_list
+
parser = ArgumentParser()
-parser.add_argument('config_file', type=str,
- help="configuration file to modify with system-specific settings")
-parser.add_argument('--test-script', type=str,
- help="test effect of named script")
+parser.add_argument(
+ 'config_file',
+ type=str,
+ help='configuration file to modify with system-specific settings',
+)
+parser.add_argument('--test-script', type=str, help='test effect of named script')
args = parser.parse_args()
@@ -40,6 +53,7 @@ formatter = logging.Formatter('%(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)
+
if 'vyos-activate-debug' in Path('/proc/cmdline').read_text():
print(f'\nactivate-debug enabled: file {checkpoint_file}_* on error')
debug = checkpoint_file
@@ -48,36 +62,67 @@ else:
debug = None
logger.setLevel(logging.INFO)
-def sort_key(s: Path):
- s = s.stem
- pre, rem = re.match(r'(\d*)(?:-)?(.+)', s).groups()
- return int(pre or 0), rem
def file_ext(file_name: str) -> str:
- """Return an identifier from file name for checkpoint file extension.
- """
+ """Return an identifier from file name for checkpoint file extension."""
return Path(file_name).stem
+
+refresh_activation_list()
+
+if not Path(activation_list).exists():
+ logger.error('Missing config activation list!')
+ sys.exit(1)
+
script_dir = Path(directories['activate'])
if args.test_script:
- script_list = [script_dir.joinpath(args.test_script)]
+ script_list = [script_dir.joinpath(args.test_script).stem]
else:
- script_list = sorted(script_dir.glob('*.py'), key=sort_key)
+ script_list = list(get_activation_scripts())
config_file = args.config_file
config_str = Path(config_file).read_text()
compose = ComposeConfig(config_str, checkpoint_file=debug)
+false_call = FalseCallable()
+
+update_config = False
for file in script_list:
- file = file.as_posix()
+ if not is_active(file):
+ continue
+
logger.info(f'calling {file}')
- try:
- compose.apply_file(file, func_name='activate')
- except ComposeConfigError as e:
- if debug:
- compose.write(f'{compose.checkpoint_file}_{file_ext(file)}')
- logger.error(f'config-activation error in {file}: {e}')
-
-compose.write(config_file, with_version=True)
+
+ mod_name = Path(file).stem.replace('-', '_')
+ mod = load_as_module(mod_name, script_dir.joinpath(f'{file}.py').as_posix())
+
+ pre_condition = getattr(mod, 'pre_condition', false_call)
+ post_condition = getattr(mod, 'post_condition', false_call)
+ activate = getattr(mod, 'activate', false_call)
+
+ if not activate:
+ logger.error(f'missing activate function in {file}')
+ continue
+
+ if not pre_condition or pre_condition():
+ try:
+ compose.apply_func(activate)
+ except ComposeConfigError as e:
+ if debug:
+ compose.write(f'{compose.checkpoint_file}_{file_ext(file)}')
+ logger.error(f'config-activation error in {file}: {e}')
+ update_config = False
+ break
+
+ if post_condition:
+ post_condition()
+
+ if get_activation(file) == 'once':
+ set_activation(file, 'off')
+
+ update_config = True
+
+if update_config:
+ compose.write(config_file, with_version=True)