From 4c391ed39c51172cbb8f2de6732d6fe4e3a8b125 Mon Sep 17 00:00:00 2001 From: John Estabrook Date: Tue, 21 Oct 2025 19:14:12 -0500 Subject: T7910: add keyword extant, for use by teardown script The standalone script teardown-config-session.py is called on CLI config-mode exit, to close the persistent vyconf config session. Instead of injecting the config-mode env var into the external script to indicate a non-ephemeral session, add keyword 'extant' to find existing session. --- python/vyos/vyconf_session.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'python') diff --git a/python/vyos/vyconf_session.py b/python/vyos/vyconf_session.py index 1e113c2ad..225765f0b 100644 --- a/python/vyos/vyconf_session.py +++ b/python/vyos/vyconf_session.py @@ -49,7 +49,11 @@ def new_session(pid: int, sudo_user: str, user: str): class VyconfSession: def __init__( - self, token: str = None, pid: int = None, on_error: Type[Exception] = None + self, + token: str = None, + pid: int = None, + extant=False, + on_error: Type[Exception] = None, ): self.pid = pid if pid else os.getpid() self.sudo_user = os.environ.get('SUDO_USER', None) @@ -60,7 +64,9 @@ class VyconfSession: match token: case None: # config-mode sessions are persistent, and managed by caller (CLI or ConfigSession) - # op-mode sessions are ephemeral: a new session on init; teardown in finalizer + # + # op-mode sessions are ephemeral, unless forced with extant=True: + # --- open a new session on init; teardown in finalizer if self.in_config_session: out = vyconf_client.send_request( 'session_of_pid', client_pid=self.pid @@ -75,14 +81,22 @@ class VyconfSession: else: self.__token = out.output else: - self.__token = new_session(self.pid, self.sudo_user, self.user) + if not extant: + self.__token = new_session(self.pid, self.sudo_user, self.user) + else: + out = vyconf_client.send_request( + 'session_of_pid', client_pid=self.pid + ) + if out.output is None: + raise ValueError(f'No existing session for pid {self.pid}') + self.__token = out.output case _: out = vyconf_client.send_request('session_exists', token=token) if out.status: raise ValueError(f'No existing session for token: {token}') self.__token = token - if not self.in_config_session: + if not self.in_config_session and not extant: self._finalizer = weakref.finalize(self, self._teardown, self.__token) self.on_error = on_error -- cgit v1.2.3