summaryrefslogtreecommitdiff
path: root/src/activation-scripts
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@vyos.io>2026-04-20 15:48:43 -0500
committerGitHub <noreply@github.com>2026-04-20 15:48:43 -0500
commit1d81dd0c6190d9fd36d01014f3b0a2d4bb91a919 (patch)
tree5b6f8c71cf87fba1eef54a1c27cb96f2819b26b9 /src/activation-scripts
parent67b68bd9893ad3a39af53ceee856ce5c61ed0638 (diff)
parent61a7a19562088250c87cf11b798c84dc470a6c7d (diff)
downloadvyos-1x-1d81dd0c6190d9fd36d01014f3b0a2d4bb91a919.tar.gz
vyos-1x-1d81dd0c6190d9fd36d01014f3b0a2d4bb91a919.zip
Merge pull request #5096 from jestabro/extend-activation-system
T8445: T8335: Extend config activation system
Diffstat (limited to 'src/activation-scripts')
-rw-r--r--src/activation-scripts/00-first-installed-boot.py35
-rw-r--r--src/activation-scripts/01-set-config-path-hint.py35
-rw-r--r--[-rwxr-xr-x]src/activation-scripts/20-ethernet-offload.py (renamed from src/activation-scripts/20-ethernet_offload.py)20
-rw-r--r--src/activation-scripts/example.py42
4 files changed, 126 insertions, 6 deletions
diff --git a/src/activation-scripts/00-first-installed-boot.py b/src/activation-scripts/00-first-installed-boot.py
new file mode 100644
index 000000000..ca02c2642
--- /dev/null
+++ b/src/activation-scripts/00-first-installed-boot.py
@@ -0,0 +1,35 @@
+# Copyright (C) VyOS Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+
+from vyos.configtree import ConfigTree
+from vyos.system.image import is_live_boot
+from vyos.utils.activate import set_activation
+from vyos.utils.activate import set_first_installed_boot
+from vyos.utils.activate import is_first_installed_boot
+
+
+def pre_condition() -> bool:
+ return not is_live_boot()
+
+
+def activate(_config: ConfigTree) -> None:
+ pass
+
+
+def post_condition() -> None:
+ set_first_installed_boot()
+ if is_first_installed_boot():
+ set_activation(__file__, 'never')
diff --git a/src/activation-scripts/01-set-config-path-hint.py b/src/activation-scripts/01-set-config-path-hint.py
new file mode 100644
index 000000000..3146a7905
--- /dev/null
+++ b/src/activation-scripts/01-set-config-path-hint.py
@@ -0,0 +1,35 @@
+# Copyright (C) VyOS Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+
+from vyos.configtree import ConfigTree
+from vyos.system.image import is_live_boot
+from vyos.utils.activate import set_activation
+from vyos.utils.activate import set_config_path_hint
+from vyos.utils.activate import is_first_installed_boot
+
+
+def pre_condition() -> bool:
+ return not is_live_boot()
+
+
+def activate(_config: ConfigTree) -> None:
+ pass
+
+
+def post_condition() -> None:
+ if is_first_installed_boot():
+ set_config_path_hint()
+ set_activation(__file__, 'never')
diff --git a/src/activation-scripts/20-ethernet_offload.py b/src/activation-scripts/20-ethernet-offload.py
index bc1e9f202..9f61f6d8f 100755..100644
--- a/src/activation-scripts/20-ethernet_offload.py
+++ b/src/activation-scripts/20-ethernet-offload.py
@@ -22,9 +22,12 @@
from vyos.ethtool import Ethtool
from vyos.configtree import ConfigTree
-from vyos.system.image import is_live_boot
+from vyos.utils.activate import set_activation
+from vyos.utils.activate import is_first_installed_boot
+
def activate(config: ConfigTree):
+ # pylint: disable=too-many-branches
base = ['interfaces', 'ethernet']
if not config.exists(base):
@@ -39,7 +42,7 @@ def activate(config: ConfigTree):
enabled, fixed = eth.get_generic_receive_offload()
if configured and fixed:
config.delete(base + [ifname, 'offload', 'gro'])
- elif is_live_boot() and enabled and not fixed:
+ elif enabled and not fixed:
config.set(base + [ifname, 'offload', 'gro'])
# If GSO is enabled by the Kernel - we reflect this on the CLI. If GSO is
@@ -48,7 +51,7 @@ def activate(config: ConfigTree):
enabled, fixed = eth.get_generic_segmentation_offload()
if configured and fixed:
config.delete(base + [ifname, 'offload', 'gso'])
- elif is_live_boot() and enabled and not fixed:
+ elif enabled and not fixed:
config.set(base + [ifname, 'offload', 'gso'])
# If LRO is enabled by the Kernel - we reflect this on the CLI. If LRO is
@@ -57,7 +60,7 @@ def activate(config: ConfigTree):
enabled, fixed = eth.get_large_receive_offload()
if configured and fixed:
config.delete(base + [ifname, 'offload', 'lro'])
- elif is_live_boot() and enabled and not fixed:
+ elif enabled and not fixed:
config.set(base + [ifname, 'offload', 'lro'])
# If SG is enabled by the Kernel - we reflect this on the CLI. If SG is
@@ -66,7 +69,7 @@ def activate(config: ConfigTree):
enabled, fixed = eth.get_scatter_gather()
if configured and fixed:
config.delete(base + [ifname, 'offload', 'sg'])
- elif is_live_boot() and enabled and not fixed:
+ elif enabled and not fixed:
config.set(base + [ifname, 'offload', 'sg'])
# If TSO is enabled by the Kernel - we reflect this on the CLI. If TSO is
@@ -75,7 +78,7 @@ def activate(config: ConfigTree):
enabled, fixed = eth.get_tcp_segmentation_offload()
if configured and fixed:
config.delete(base + [ifname, 'offload', 'tso'])
- elif is_live_boot() and enabled and not fixed:
+ elif enabled and not fixed:
config.set(base + [ifname, 'offload', 'tso'])
# Remove deprecated UDP fragmentation offloading option
@@ -104,3 +107,8 @@ def activate(config: ConfigTree):
if config.exists(flow_control_path):
if not eth.check_flow_control():
config.delete(flow_control_path)
+
+
+def post_condition() -> None:
+ if is_first_installed_boot():
+ set_activation(__file__, 'off')
diff --git a/src/activation-scripts/example.py b/src/activation-scripts/example.py
new file mode 100644
index 000000000..74beedf80
--- /dev/null
+++ b/src/activation-scripts/example.py
@@ -0,0 +1,42 @@
+# Copyright VyOS maintainers and contributors <maintainers@vyos.io>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+
+from vyos.configtree import ConfigTree
+
+
+# pylint: disable=anomalous-backslash-in-string,pointless-string-statement
+"""Activation scripts must be named '^\\d+\\-.+.py$' to be included by the
+activation script runner. They are run in ascending order of prefix."""
+
+
+def pre_condition() -> bool:
+ """This function is not required.
+ If not present, or pre_condition returns True, the function activate
+ will be called on the config."""
+
+
+def activate(_config: ConfigTree) -> None:
+ """This function is expected.
+ If not present, the script is ignored. The function itself can be a
+ no-op."""
+
+
+def post_condition() -> None:
+ """This function is not required.
+ If present, and application of 'activate' succeeds, post_condition will
+ be called.
+ Commonly used to set activation 'off' for the script, after first run on
+ an installed system."""