diff options
| author | Kyrylo Yatsenko <hedrok@gmail.com> | 2025-10-17 13:58:01 +0300 |
|---|---|---|
| committer | Kyrylo Yatsenko <hedrok@gmail.com> | 2025-10-21 19:57:40 +0300 |
| commit | c4632bb6ad6c055fb7fe5a5c055354c6895ba8e5 (patch) | |
| tree | 168bce87c31c814290ec95393c3da4e1ab893a42 /src | |
| parent | 70b7818f75f55de14214b85a12b8ec13d98ff89b (diff) | |
| download | vyos-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-x | src/conf_mode/protocols_static.py | 3 | ||||
| -rwxr-xr-x | src/etc/dhcp/dhclient-enter-hooks.d/98-vyos-static-routes-dhclient-hook | 11 | ||||
| -rwxr-xr-x | src/etc/dhcp/dhclient-exit-hooks.d/98-vyos-static-routes-dhclient-hook | 13 | ||||
| -rwxr-xr-x | src/helpers/vyos-request-configd-update.py | 31 | ||||
| -rwxr-xr-x | src/services/vyos-configd | 3 |
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 |
