summaryrefslogtreecommitdiff
path: root/src/etc
diff options
context:
space:
mode:
authorMatthew Kobayashi <matthew@kobayashi.au>2025-10-02 13:15:03 +1000
committerKyrylo Yatsenko <hedrok@gmail.com>2025-10-21 19:57:40 +0300
commit70b7818f75f55de14214b85a12b8ec13d98ff89b (patch)
tree1da8eb1813602f444da9404dcedb00f2c2c3bffc /src/etc
parent2de4e9df6382edbb4b2af6148ef267854fa7ebbf (diff)
downloadvyos-1x-70b7818f75f55de14214b85a12b8ec13d98ff89b.tar.gz
vyos-1x-70b7818f75f55de14214b85a12b8ec13d98ff89b.zip
T3680: protocols: add dhclient hooks for dhcp-interface static routes
Diffstat (limited to 'src/etc')
-rwxr-xr-xsrc/etc/dhcp/dhclient-enter-hooks.d/98-vyos-static-routes-dhclient-hook42
-rwxr-xr-xsrc/etc/dhcp/dhclient-exit-hooks.d/97-run-user-hooks (renamed from src/etc/dhcp/dhclient-exit-hooks.d/98-run-user-hooks)0
-rwxr-xr-xsrc/etc/dhcp/dhclient-exit-hooks.d/98-vyos-static-routes-dhclient-hook48
3 files changed, 90 insertions, 0 deletions
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
new file mode 100755
index 000000000..f735b4b29
--- /dev/null
+++ b/src/etc/dhcp/dhclient-enter-hooks.d/98-vyos-static-routes-dhclient-hook
@@ -0,0 +1,42 @@
+#!/bin/bash
+#
+# Copyright VyOS maintainers and contributors <maintainers@vyos.io>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or later as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+DHCP_HOOK_IFLIST="/tmp/static_dhcp_interfaces"
+
+# Only run if there are static routes with dhcp-interface configured
+if ! { [ -f $DHCP_HOOK_IFLIST ] && grep -qw $interface $DHCP_HOOK_IFLIST; }; then
+ return 0
+fi
+
+# Handle interface state changes that require static route regeneration
+# - PREINIT: interface is about to be configured, cleanup old routes
+# - EXPIRE: lease has expired, remove routes
+# - FAIL: DHCP failed, remove routes
+# - 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
+fi
diff --git a/src/etc/dhcp/dhclient-exit-hooks.d/98-run-user-hooks b/src/etc/dhcp/dhclient-exit-hooks.d/97-run-user-hooks
index 910b586f0..910b586f0 100755
--- a/src/etc/dhcp/dhclient-exit-hooks.d/98-run-user-hooks
+++ b/src/etc/dhcp/dhclient-exit-hooks.d/97-run-user-hooks
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
new file mode 100755
index 000000000..f2eef67f3
--- /dev/null
+++ b/src/etc/dhcp/dhclient-exit-hooks.d/98-vyos-static-routes-dhclient-hook
@@ -0,0 +1,48 @@
+#!/bin/bash
+#
+# Copyright VyOS maintainers and contributors <maintainers@vyos.io>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or later as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+DHCP_HOOK_IFLIST="/tmp/static_dhcp_interfaces"
+
+# Only run if there are static routes with dhcp-interface configured
+if ! { [ -f $DHCP_HOOK_IFLIST ] && grep -qw $interface $DHCP_HOOK_IFLIST; }; then
+ return 0
+fi
+
+# Re-generate the config on the following events:
+# - BOUND: always re-generate
+# - RENEW: re-generate if the IP address changed
+# - REBIND: re-generate if the IP address changed
+# - EXPIRE: always re-generate (route should be removed)
+# - RELEASE: always re-generate (route should be removed)
+if [ "$reason" == "RENEW" ] || [ "$reason" == "REBIND" ]; then
+ if [ "$old_routers" == "$new_routers" ]; then
+ return 0
+ fi
+elif [ "$reason" != "BOUND" ] && [ "$reason" != "EXPIRE" ] && [ "$reason" != "RELEASE" ]; then
+ 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