summaryrefslogtreecommitdiff
path: root/src/validators/watchdog-module
diff options
context:
space:
mode:
authorGrant Slater <github@firefishy.com>2025-11-10 15:16:38 +0000
committerGrant Slater <github@firefishy.com>2026-01-14 15:01:01 +0000
commit88b0c27a8d359d992e97c6043207dd877370295e (patch)
treebfe3985eecb2c7319440029ccaae5a2bc5746e99 /src/validators/watchdog-module
parent0c373c7c9cf0fff573e5acc5642f6af63c311da2 (diff)
downloadvyos-1x-88b0c27a8d359d992e97c6043207dd877370295e.tar.gz
vyos-1x-88b0c27a8d359d992e97c6043207dd877370295e.zip
T7101: Add support for hardware watchdog support via systemd
Diffstat (limited to 'src/validators/watchdog-module')
-rw-r--r--src/validators/watchdog-module66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/validators/watchdog-module b/src/validators/watchdog-module
new file mode 100644
index 000000000..0ae68b46d
--- /dev/null
+++ b/src/validators/watchdog-module
@@ -0,0 +1,66 @@
+#!/usr/bin/env python3
+#
+# 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/>.
+
+import re
+import sys
+
+from vyos.utils.kernel import load_module
+from vyos.utils.process import rc_cmd
+
+
+
+def main() -> int:
+ if len(sys.argv) < 2:
+ # No value to validate
+ return 1
+
+ module = sys.argv[1].strip()
+ if not module:
+ return 1
+
+ # Keep the module name format strict.
+ if not re.fullmatch(r"[a-zA-Z0-9_\-]+", module):
+ return 1
+
+ # Ensure the module exists and is loadable (dry-run).
+ # This does not load the module.
+ try:
+ rc = load_module(module, quiet=True, dry_run=True)
+ except OSError:
+ return 1
+
+ if rc != 0:
+ return 1
+
+ # Validate that the module looks like a watchdog driver.
+ # Use modinfo filename location as the heuristic.
+ rc, out = rc_cmd(["modinfo", "-F", "filename", module])
+ if rc != 0:
+ return 1
+ filename = (out or "").strip().lower()
+
+ # Accept modules located under drivers/watchdog, plus explicit exception for
+ # ipmi_watchdog which lives in drivers/char/ipmi.
+ is_watchdog_driver = (
+ ("/watchdog/" in filename)
+ or filename.endswith("/ipmi_watchdog.ko")
+ )
+
+ return 0 if is_watchdog_driver else 1
+
+
+if __name__ == "__main__":
+ sys.exit(main())