summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@vyos.io>2025-04-14 17:58:49 -0500
committerJohn Estabrook <jestabro@vyos.io>2025-05-22 13:26:48 -0500
commit23b67254ed4a3a7d382a95f409338db431cc3556 (patch)
treeb228d238c240582429d600250f09983e0cd9cf87 /python
parent5328e901c1384a9ee0ea95f4d7bcb048bfa94316 (diff)
downloadvyos-1x-23b67254ed4a3a7d382a95f409338db431cc3556.tar.gz
vyos-1x-23b67254ed4a3a7d382a95f409338db431cc3556.zip
T7365: add POSIX-type lock to vyconf_session.commit for compatibility
We maintain compatibility with the legacy commit lock file until all other references are resolved; this requires a POSIX-type lock instead of the BSD-type lock of vyos.utils.locking.
Diffstat (limited to 'python')
-rw-r--r--python/vyos/utils/commit.py37
-rw-r--r--python/vyos/vyconf_session.py11
2 files changed, 47 insertions, 1 deletions
diff --git a/python/vyos/utils/commit.py b/python/vyos/utils/commit.py
index 2b014c939..9167c78d2 100644
--- a/python/vyos/utils/commit.py
+++ b/python/vyos/utils/commit.py
@@ -15,6 +15,8 @@
# pylint: disable=import-outside-toplevel
+from typing import IO
+
def commit_in_progress():
"""Not to be used in normal op mode scripts!"""
@@ -64,3 +66,38 @@ def wait_for_commit_lock():
# Very synchronous approach to multiprocessing
while commit_in_progress():
sleep(1)
+
+
+# For transitional compatibility with the legacy commit locking mechanism,
+# we require a lockf/fcntl (POSIX-type) lock, hence the following in place
+# of vyos.utils.locking
+
+
+def acquire_commit_lock_file() -> tuple[IO, str]:
+ import fcntl
+ from pathlib import Path
+ from vyos.defaults import commit_lock
+
+ try:
+ # pylint: disable=consider-using-with
+ lock_fd = Path(commit_lock).open('w')
+ except IOError as e:
+ out = f'Critical error opening commit lock file {e}'
+ return None, out
+
+ try:
+ fcntl.lockf(lock_fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
+ return lock_fd, ''
+ except IOError:
+ out = 'Configuration system locked by another commit in progress'
+ lock_fd.close()
+ return None, out
+
+
+def release_commit_lock_file(file_descr):
+ import fcntl
+
+ if file_descr is None:
+ return
+ fcntl.lockf(file_descr, fcntl.LOCK_UN)
+ file_descr.close()
diff --git a/python/vyos/vyconf_session.py b/python/vyos/vyconf_session.py
index 077952a9f..4250f0cfb 100644
--- a/python/vyos/vyconf_session.py
+++ b/python/vyos/vyconf_session.py
@@ -26,6 +26,9 @@ from vyos.migrate import ConfigMigrate
from vyos.migrate import ConfigMigrateError
from vyos.component_version import append_system_version
from vyos.utils.session import in_config_session
+from vyos.proto.vyconf_proto import Errnum
+from vyos.utils.commit import acquire_commit_lock_file
+from vyos.utils.commit import release_commit_lock_file
class VyconfSessionError(Exception):
@@ -138,8 +141,14 @@ class VyconfSession:
@raise_exception
@config_mode
def commit(self) -> tuple[str, int]:
+ lock_fd, out = acquire_commit_lock_file()
+ if lock_fd is None:
+ return out, Errnum.COMMIT_IN_PROGRESS
+
out = vyconf_client.send_request('commit', token=self.__token)
- return output(out), out.status
+ release_commit_lock_file(lock_fd)
+
+ return self.output(out), out.status
@raise_exception
@config_mode