summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKyrylo Yatsenko <hedrok@gmail.com>2025-10-17 13:58:01 +0300
committerKyrylo Yatsenko <hedrok@gmail.com>2025-10-21 19:57:40 +0300
commitc4632bb6ad6c055fb7fe5a5c055354c6895ba8e5 (patch)
tree168bce87c31c814290ec95393c3da4e1ab893a42 /src
parent70b7818f75f55de14214b85a12b8ec13d98ff89b (diff)
downloadvyos-1x-c4632bb6ad6c055fb7fe5a5c055354c6895ba8e5.tar.gz
vyos-1x-c4632bb6ad6c055fb7fe5a5c055354c6895ba8e5.zip
T5811: Make static dhcp-interface routes robust
Solves the problem that vyos-configs in FRRender caches configuation and DHCP changes are ignored. * Add src/helpers/vyos-request-configd-update.py that requests vyos-configd to update FRR configuration. * Make dhclient hooks use it instead of calling protocols_static.py * Make FRRender cache not only configuration but also DHCP gateways so that is any of them changes, FRR configuration is updated
Diffstat (limited to 'src')
-rwxr-xr-xsrc/conf_mode/protocols_static.py3
-rwxr-xr-xsrc/etc/dhcp/dhclient-enter-hooks.d/98-vyos-static-routes-dhclient-hook11
-rwxr-xr-xsrc/etc/dhcp/dhclient-exit-hooks.d/98-vyos-static-routes-dhclient-hook13
-rwxr-xr-xsrc/helpers/vyos-request-configd-update.py31
-rwxr-xr-xsrc/services/vyos-configd3
5 files changed, 38 insertions, 23 deletions
diff --git a/src/conf_mode/protocols_static.py b/src/conf_mode/protocols_static.py
index 1db8aa770..6310be13d 100755
--- a/src/conf_mode/protocols_static.py
+++ b/src/conf_mode/protocols_static.py
@@ -30,10 +30,11 @@ from vyos.utils.file import write_file
from vyos.template import render
from vyos import ConfigError
from vyos import airbag
+from vyos import defaults
airbag.enable()
config_file = '/etc/iproute2/rt_tables.d/vyos-static.conf'
-DHCP_HOOK_IFLIST = '/tmp/static_dhcp_interfaces'
+DHCP_HOOK_IFLIST = defaults.static_route_dhcp_interfaces_path
def get_config(config=None):
if config:
diff --git a/src/etc/dhcp/dhclient-enter-hooks.d/98-vyos-static-routes-dhclient-hook b/src/etc/dhcp/dhclient-enter-hooks.d/98-vyos-static-routes-dhclient-hook
index f735b4b29..439a8dd87 100755
--- a/src/etc/dhcp/dhclient-enter-hooks.d/98-vyos-static-routes-dhclient-hook
+++ b/src/etc/dhcp/dhclient-enter-hooks.d/98-vyos-static-routes-dhclient-hook
@@ -28,15 +28,6 @@ fi
# - RELEASE: lease released, remove routes
# - STOP: dhclient stopped, remove routes
if [ "$reason" == "PREINIT" ] || [ "$reason" == "EXPIRE" ] || [ "$reason" == "FAIL" ] || [ "$reason" == "RELEASE" ] || [ "$reason" == "STOP" ]; then
- # Best effort wait for any active commit to finish
- sudo python3 - <<PYEND
-from vyos.utils.commit import wait_for_commit_lock
-
-if __name__ == '__main__':
- wait_for_commit_lock()
- exit(0)
-PYEND
-
# Re-generate static routes config to remove routes that depend on this interface
- sudo /usr/libexec/vyos/conf_mode/protocols_static.py
+ sudo /usr/libexec/vyos/vyos-request-configd-update.py
fi
diff --git a/src/etc/dhcp/dhclient-exit-hooks.d/98-vyos-static-routes-dhclient-hook b/src/etc/dhcp/dhclient-exit-hooks.d/98-vyos-static-routes-dhclient-hook
index f2eef67f3..7038bf25e 100755
--- a/src/etc/dhcp/dhclient-exit-hooks.d/98-vyos-static-routes-dhclient-hook
+++ b/src/etc/dhcp/dhclient-exit-hooks.d/98-vyos-static-routes-dhclient-hook
@@ -35,14 +35,5 @@ elif [ "$reason" != "BOUND" ] && [ "$reason" != "EXPIRE" ] && [ "$reason" != "RE
return 0
fi
-# Best effort wait for any active commit to finish
-sudo python3 - <<PYEND
-from vyos.utils.commit import wait_for_commit_lock
-
-if __name__ == '__main__':
- wait_for_commit_lock()
- exit(0)
-PYEND
-
-# Now re-generate the static routes config
-sudo /usr/libexec/vyos/conf_mode/protocols_static.py
+# Re-generate the static routes config
+sudo /usr/libexec/vyos/vyos-request-configd-update.py
diff --git a/src/helpers/vyos-request-configd-update.py b/src/helpers/vyos-request-configd-update.py
new file mode 100755
index 000000000..55ed0eef9
--- /dev/null
+++ b/src/helpers/vyos-request-configd-update.py
@@ -0,0 +1,31 @@
+#!/usr/bin/env python3
+
+import json
+import zmq
+
+from vyos.utils.commit import wait_for_commit_lock
+from vyos.defaults import vyos_configd_socket_path
+
+context = zmq.Context()
+
+request = {
+ 'type': 'node',
+ 'last': True,
+ 'data': '/usr/libexec/vyos/conf_mode/protocols_static.py',
+}
+request = json.dumps(request)
+
+print("Waiting for commit lock...")
+wait_for_commit_lock()
+
+print("Connecting to vyos-configd server...")
+socket = context.socket(zmq.REQ)
+socket.connect(vyos_configd_socket_path)
+
+print(f"Sending request {request}...")
+socket.send_string(request)
+
+message = socket.recv()
+print(f"Received reply {request} [ {message} ]")
+
+print("All done")
diff --git a/src/services/vyos-configd b/src/services/vyos-configd
index 1a207f876..2f060dc82 100755
--- a/src/services/vyos-configd
+++ b/src/services/vyos-configd
@@ -33,6 +33,7 @@ from enum import Enum
import zmq
from vyos.defaults import directories
+from vyos.defaults import vyos_configd_socket_path
from vyos.utils.boot import boot_configuration_complete
from vyos.configsource import ConfigSourceString
from vyos.configsource import ConfigSourceError
@@ -57,7 +58,7 @@ if debug:
else:
logger.setLevel(logging.INFO)
-SOCKET_PATH = 'ipc:///run/vyos-configd.sock'
+SOCKET_PATH = vyos_configd_socket_path
MAX_MSG_SIZE = 65535
PAD_MSG_SIZE = 6