[Buildroot] [PATCH 1/1] package/watchdogd: new package

Joachim Wiberg troglobit at gmail.com
Sun Oct 10 15:49:41 UTC 2021


This patch adds support for watchdogd, a watchdog daemon with built-in
process supervisor[1] as well as support for monitoring memory & file
descriptor leaks, and CPU load average.  When a monitored resource
reaches a high watermark, a warning message is logged and when critical
level is reached, the cause is saved and the system is rebooted.  On
reboot the reset cause can be retrieved to help locate the culprit.

Support for SysV init script in this patch, and systemd unit file is
installed from the one bundled with the package.  Both files supoort
additional command line options in /etc/default/watchdogd.

The Config.in is slightly big, but allows for disabling or adjusting
the poll interval for each resource monitor.

For more information, see https://github.com/troglobit/watchdogd

[1]: processes must have their main loop instrumented for supervision.

Signed-off-by: Joachim Wiberg <troglobit at gmail.com>
---
 DEVELOPERS                       |  1 +
 package/Config.in                |  1 +
 package/watchdogd/Config.in      | 69 ++++++++++++++++++++++++++++++++
 package/watchdogd/S01watchdogd   | 47 ++++++++++++++++++++++
 package/watchdogd/watchdogd.hash |  5 +++
 package/watchdogd/watchdogd.mk   | 55 +++++++++++++++++++++++++
 6 files changed, 178 insertions(+)
 create mode 100644 package/watchdogd/Config.in
 create mode 100755 package/watchdogd/S01watchdogd
 create mode 100644 package/watchdogd/watchdogd.hash
 create mode 100644 package/watchdogd/watchdogd.mk

diff --git a/DEVELOPERS b/DEVELOPERS
index 7ebfc9234b..cf68b94685 100644
--- a/DEVELOPERS
+++ b/DEVELOPERS
@@ -1335,6 +1335,7 @@ F:	package/mg/
 F:	package/netcalc/
 F:	package/ssdp-responder/
 F:	package/sysklogd/
+F:	package/watchdogd/
 
 N:	Joao Pinto <jpinto at synopsys.com>
 F:	board/synopsys/vdk/
diff --git a/package/Config.in b/package/Config.in
index 9fed0ab4cb..167a6339c1 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -2540,6 +2540,7 @@ menu "System tools"
 	source "package/unscd/Config.in"
 	source "package/util-linux/Config.in"
 	source "package/watchdog/Config.in"
+	source "package/watchdogd/Config.in"
 	source "package/xdg-dbus-proxy/Config.in"
 	source "package/xen/Config.in"
 	source "package/xvisor/Config.in"
diff --git a/package/watchdogd/Config.in b/package/watchdogd/Config.in
new file mode 100644
index 0000000000..48abbac8fa
--- /dev/null
+++ b/package/watchdogd/Config.in
@@ -0,0 +1,69 @@
+config BR2_PACKAGE_WATCHDOGD
+	bool "watchdogd"
+	depends on BR2_USE_MMU # fork()
+	select BR2_PACKAGE_LIBCONFUSE
+	select BR2_PACKAGE_LIBITE
+	select BR2_PACKAGE_LIBUEV
+	help
+	  Extended version of uClinux-dist watchdogd.  Monitors loadavg,
+	  file descriptors and memory leaks, and capable of supervising
+	  your processes main loop using an instrumentation API.
+
+	  A reset reason is saved for power loss, CPU overload, or any
+	  of the monitored conditions (above).	The full capabilities
+	  are limited by the kernel watchdog driver, but even the basic
+	  "softdog" driver is supported.  See /etc/watchdogd.conf for
+	  details, and try watchdogctl for system status and available
+	  commands.
+
+	  https://github.com/troglobit/watchdogd/
+
+if BR2_PACKAGE_WATCHDOGD
+
+config BR2_PACKAGE_WATCHDOGD_TEST_SUITE
+	bool "Enable watchdogctl test cases"
+	default y
+	help
+	  The watchdogctl program comes with a suite of tests built-in.
+	  They can be used to verify correct operation of watchdogd and
+	  the kernel watchdog driver.
+
+	  Default: enabled
+
+config BR2_PACKAGE_WATCHDOGD_GENERIC_POLL
+	int "Generic script monitor poll interval (sec)"
+	default "300"
+	help
+	  Poll interval for generic script monitor, in seconds.  A value
+	  of zero (0) disables the monitor.
+
+	  Default: 300 seconds
+
+config BR2_PACKAGE_WATCHDOGD_LOADAVG_POLL
+	int "CPU load average monitor poll interval (sec)"
+	default "300"
+	help
+	  Poll interval for CPU load average monitor, in seconds.  A
+	  value of zero (0) disables the monitor.
+
+	  Default: 300 seconds
+
+config BR2_PACKAGE_WATCHDOGD_FILENR_POLL
+	int "File descriptor leak monitor poll interval (sec)"
+	default "300"
+	help
+	  Poll interval for file descriptor leak monitor, in seconds.  A
+	  value of zero (0) disables the monitor.
+
+	  Default: 300 seconds
+
+config BR2_PACKAGE_WATCHDOGD_MEMINFO_POLL
+	int "Memory leak monitor poll interval (sec)"
+	default "300"
+	help
+	  Poll interval for memory leak monitor, in seconds.  A value of
+	  zero (0) disables the monitor.
+
+	  Default: 300 seconds
+
+endif
diff --git a/package/watchdogd/S01watchdogd b/package/watchdogd/S01watchdogd
new file mode 100755
index 0000000000..df57b8ad7a
--- /dev/null
+++ b/package/watchdogd/S01watchdogd
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+DAEMON="watchdogd"
+PIDFILE="/var/run/$DAEMON.pid"
+
+# shellcheck source=/dev/null
+[ -r "/etc/default/$DAEMON" ] && . "/etc/default/$DAEMON"
+
+cmd()
+{
+    start-stop-daemon -q -p "$PIDFILE" -x "/usr/sbin/$DAEMON" "$@"
+    status=$?
+    if [ $status -eq 0 ]; then
+	echo "OK"
+    else
+	echo "FAIL"
+    fi
+    return $status
+}
+
+case "$1" in
+    start)
+	printf 'Starting %s: ' "$DAEMON"
+	# shellcheck disable=SC2086 # we need the word splitting
+	cmd -S -- $SMCROUTED_ARGS
+	;;
+
+    stop)
+	printf 'Stopping %s: ' "$DAEMON"
+	cmd -K
+	;;
+
+    restart)
+	$0 stop
+	sleep 1
+	$0 start
+	;;
+
+    reload)
+	printf 'Reloading %s: ' "$DAEMON"
+	cmd -K -s HUP
+	;;
+
+    *)
+	echo "Usage: $0 {start|stop|restart|reload}"
+	exit 1
+esac
diff --git a/package/watchdogd/watchdogd.hash b/package/watchdogd/watchdogd.hash
new file mode 100644
index 0000000000..7c1acf0820
--- /dev/null
+++ b/package/watchdogd/watchdogd.hash
@@ -0,0 +1,5 @@
+# Upstream .sha256 from GitHub
+sha256 f36fdea9b323534a704c4c23d9af8050480bca4bdad89cdb50d26fcac316d172  watchdogd-3.4.tar.gz
+
+# Locally calculated
+sha256 fd685e20931174308c45a26418a7ce34d66704c4e4b92ab1d8299deb255cd676  LICENSE
diff --git a/package/watchdogd/watchdogd.mk b/package/watchdogd/watchdogd.mk
new file mode 100644
index 0000000000..3ac297ee5a
--- /dev/null
+++ b/package/watchdogd/watchdogd.mk
@@ -0,0 +1,55 @@
+################################################################################
+#
+# watchdogd
+#
+################################################################################
+
+WATCHDOGD_VERSION = 3.4
+WATCHDOGD_SITE = https://github.com/troglobit/watchdogd/releases/download/$(WATCHDOGD_VERSION)
+WATCHDOGD_LICENSE = ISC
+WATCHDOGD_LICENSE_FILES = LICENSE
+WATCHDOGD_CPE_ID_VENDOR = troglobit
+WATCHDOGD_DEPENDENCIES = host-pkgconf libconfuse libite libuev
+WATCHDOGD_CONF_OPTS = --disable-compat --disable-examples --disable-test-mode
+
+ifneq ($(BR2_PACKAGE_WATCHDOGD_TEST_SUITE),y)
+WATCHDOGD_CONF_OPTS += --disable-builtin-tests
+else
+WATCHDOGD_CONF_OPTS += --enable-builtin-tests
+endif
+
+ifeq ($(BR2_PACKAGE_WATCHDOGD_GENERIC_POLL),0)
+WATCHDOGD_CONF_OPTS += --without-generic
+else
+WATCHDOGD_CONF_OPTS += --with-generic=$(BR2_PACKAGE_WATCHDOGD_GENERIC_POLL)
+endif
+
+ifeq ($(BR2_PACKAGE_WATCHDOGD_LOADAVG_POLL),0)
+WATCHDOGD_CONF_OPTS += --without-loadavg
+else
+WATCHDOGD_CONF_OPTS += --with-loadavg=$(BR2_PACKAGE_WATCHDOGD_LOADAVG_POLL)
+endif
+
+ifeq ($(BR2_PACKAGE_WATCHDOGD_FILENR_POLL),0)
+WATCHDOGD_CONF_OPTS += --without-filenr
+else
+WATCHDOGD_CONF_OPTS += --with-filenr=$(BR2_PACKAGE_WATCHDOGD_FILENR_POLL)
+endif
+
+ifeq ($(BR2_PACKAGE_WATCHDOGD_MEMINFO_POLL),0)
+WATCHDOGD_CONF_OPTS += --without-meminfo
+else
+WATCHDOGD_CONF_OPTS += --with-meminfo=$(BR2_PACKAGE_WATCHDOGD_MEMINFO_POLL)
+endif
+
+define WATCHDOGD_INSTALL_INIT_SYSV
+	$(INSTALL) -D -m 0755 package/watchdogd/S01watchdogd \
+		$(TARGET_DIR)/etc/init.d/S01watchdogd
+endef
+
+define WATCHDOGD_INSTALL_INIT_SYSTEMD
+	$(INSTALL) -D -m 644 $(WATCHDOGD_PKGDIR)/watchdogd.service \
+		$(TARGET_DIR)/usr/lib/systemd/system/watchdogd.service
+endef
+
+$(eval $(autotools-package))
-- 
2.25.1



More information about the buildroot mailing list