[Buildroot] [PATCH v2 1/1] package/ledmon: new package

Maksim Kiselev bigunclemax at gmail.com
Sun Aug 20 09:58:33 UTC 2023


Enclosure LED Utilities

ledmon and ledctl are userspace tools designed to control storage
enclosure LEDs. The user must have root privileges to use these tools.

These tools use the SGPIO and SES-2 protocols to monitor and control LEDs.
They been verified to work with Intel(R) storage controllers (i.e. the
Intel(R) AHCI controller) and have not been tested with storage controllers of
other vendors (especially SAS/SCSI controllers).

For backplane enclosures attached to ISCI controllers, support is limited to
Intel(R) Intelligent Backplanes.

Signed-off-by: Maksim Kiselev <bigunclemax at gmail.com>
---
 DEVELOPERS                                    |   3 +
 package/Config.in                             |   1 +
 ...nstandard-on_exit-function-by-atexit.patch | 223 ++++++++++++++++++
 ...-Fix-unknown-type-name-ssize_t-error.patch |  44 ++++
 .../ledmon/0003-Add-disable-doc-option.patch  |  63 +++++
 package/ledmon/Config.in                      |  15 ++
 package/ledmon/ledmon.hash                    |   3 +
 package/ledmon/ledmon.mk                      |  18 ++
 8 files changed, 370 insertions(+)
 create mode 100644 package/ledmon/0001-Replace-nonstandard-on_exit-function-by-atexit.patch
 create mode 100644 package/ledmon/0002-Fix-unknown-type-name-ssize_t-error.patch
 create mode 100644 package/ledmon/0003-Add-disable-doc-option.patch
 create mode 100644 package/ledmon/Config.in
 create mode 100644 package/ledmon/ledmon.hash
 create mode 100644 package/ledmon/ledmon.mk

diff --git a/DEVELOPERS b/DEVELOPERS
index 69ab723c0c..df19028d9f 100644
--- a/DEVELOPERS
+++ b/DEVELOPERS
@@ -2123,6 +2123,9 @@ F:	package/python-txaio/
 F:	package/python-ujson/
 F:	package/python-wsaccel/
 
+N:	Maksim Kiselev <bigunclemax at gmail.com>
+F:	package/ledmon/
+
 N:	Max Filippov <jcmvbkbc at gmail.com>
 F:	arch/Config.in.xtensa
 
diff --git a/package/Config.in b/package/Config.in
index 15b1866630..0378566305 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -527,6 +527,7 @@ endmenu
 	source "package/iucode-tool/Config.in"
 	source "package/kbd/Config.in"
 	source "package/lcdproc/Config.in"
+	source "package/ledmon/Config.in"
 	source "package/libiec61850/Config.in"
 	source "package/libmanette/Config.in"
 	source "package/libubootenv/Config.in"
diff --git a/package/ledmon/0001-Replace-nonstandard-on_exit-function-by-atexit.patch b/package/ledmon/0001-Replace-nonstandard-on_exit-function-by-atexit.patch
new file mode 100644
index 0000000000..82669d3666
--- /dev/null
+++ b/package/ledmon/0001-Replace-nonstandard-on_exit-function-by-atexit.patch
@@ -0,0 +1,223 @@
+From e57ad4c71cce734de7f8aa75e84fce97bc148c2b Mon Sep 17 00:00:00 2001
+From: Maksim Kiselev <bigunclemax at gmail.com>
+Date: Mon, 15 May 2023 14:46:56 +0300
+Subject: [PATCH 1/2] Replace nonstandard on_exit() function by atexit()
+
+on_exit() is not portable and not available on the C libraries musl
+and uClibc.
+
+So let's replace it with standard atexit() function.
+
+Upstream: https://github.com/intel/ledmon/pull/139
+
+Signed-off-by: Maksim Kiselev <bigunclemax at gmail.com>
+---
+ src/ledctl.c | 12 ++++-------
+ src/ledmon.c | 59 +++++++++++++++++++++++++++-------------------------
+ 2 files changed, 35 insertions(+), 36 deletions(-)
+
+diff --git a/src/ledctl.c b/src/ledctl.c
+index 7a89a24..10fd57a 100644
+--- a/src/ledctl.c
++++ b/src/ledctl.c
+@@ -214,15 +214,11 @@ static void ibpi_state_fini(struct ibpi_state *p)
+  *
+  * This is internal function of ledctl utility. The function cleans up a memory
+  * allocated for the application and closes all opened handles. This function is
+- * design to be registered as on_exit() handler function.
+- *
+- * @param[in]      status         exit status of the ledctl application.
+- * @param[in]      ignored        function ignores this argument.
++ * design to be registered as atexit() handler function.
+  *
+  * @return The function does not return a value.
+  */
+-static void _ledctl_fini(int status __attribute__ ((unused)),
+-			 void *ignore __attribute__ ((unused)))
++static void _ledctl_fini(void)
+ {
+ 	sysfs_reset();
+ 	list_erase(&ibpi_list);
+@@ -948,7 +944,7 @@ static char *ledctl_strstatus(ledctl_status_code_t s)
+  * @brief Application's entry point.
+  *
+  * This is the entry point of ledctl utility. This function does all the work.
+- * It allocates and initializes all used structures. Registers on_exit()
++ * It allocates and initializes all used structures. Registers atexit()
+  * handlers.
+  * Then the function parses command line options and commands given and scans
+  * sysfs tree for controllers, block devices and RAID devices. If no error is
+@@ -983,7 +979,7 @@ int main(int argc, char *argv[])
+ 	status = _init_ledctl_conf();
+ 	if (status != LEDCTL_STATUS_SUCCESS)
+ 		return status;
+-	if (on_exit(_ledctl_fini, progname))
++	if (atexit(_ledctl_fini))
+ 		exit(LEDCTL_STATUS_ONEXIT_ERROR);
+ 	slot_request_init(&slot_req);
+ 	status = _cmdline_parse(argc, argv, &slot_req);
+diff --git a/src/ledmon.c b/src/ledmon.c
+index 6f52fd6..1329295 100644
+--- a/src/ledmon.c
++++ b/src/ledmon.c
+@@ -57,6 +57,19 @@
+ #include "utils.h"
+ #include "vmdssd.h"
+ 
++/**
++ * This macro is the alternative way to get exit status
++ * in atexit() callback function
++ */
++#define EXIT(x) ((exit)(exit_status = (x)))
++
++static int exit_status;
++
++/**
++ * Flag to print exit status
++ */
++static int ignore;
++
+ /**
+  * @brief List of active block devices.
+  *
+@@ -151,20 +164,16 @@ static int possible_params_size = ARRAY_SIZE(possible_params);
+  *
+  * This is internal function of monitor service. It is used to finalize daemon
+  * process i.e. free allocated memory, unlock and remove pidfile and close log
+- * file and syslog. The function is registered as on_exit() handler.
+- *
+- * @param[in]     status          The function ignores this parameter.
+- * @param[in]     program_name    The name of the binary file. This argument
+- *                                is passed via on_exit() function.
++ * file and syslog. The function is registered as atexit() handler.
+  *
+  * @return The function does not return a value.
+  */
+-static void _ledmon_fini(int __attribute__ ((unused)) status, void *program_name)
++static void _ledmon_fini(void)
+ {
+ 	sysfs_reset();
+ 	list_erase(&ledmon_block_list);
+ 	log_close();
+-	pidfile_remove(program_name);
++	pidfile_remove(progname);
+ }
+ 
+ typedef enum {
+@@ -207,30 +216,25 @@ static char *ledmon_strstatus(ledmon_status_code_t s)
+  *
+  * This is internal function of monitor service. It is used to report an exit
+  * status of the monitor service. The message is logged in to syslog and to log
+- * file. The function is registered as on_exit() hander.
+- *
+- * @param[in]     status            Status given in the last call to exit()
+- *                                  function.
+- * @param[in]     arg               Argument passed to on_exit().
++ * file. The function is registered as atexit() handler.
+  *
+  * @return The function does not return a value.
+  */
+-static void _ledmon_status(int status, void *arg)
++static void _ledmon_status(void)
+ {
+ 	int log_level;
+ 	char message[4096];
+-	int ignore = *((int *)arg);
+ 
+ 	if (ignore)
+ 		return;
+ 
+-	if (status == LEDMON_STATUS_SUCCESS)
++	if (exit_status == LEDMON_STATUS_SUCCESS)
+ 		log_level = LOG_LEVEL_INFO;
+ 	else
+ 		log_level = LOG_LEVEL_ERROR;
+ 
+ 	snprintf(message, sizeof(message), "exit status is %s.",
+-		 ledmon_strstatus(status));
++		 ledmon_strstatus(exit_status));
+ 
+ 	if (get_log_fd() >= 0)
+ 		_log(log_level, message);
+@@ -364,10 +368,10 @@ static ledmon_status_code_t _cmdline_parse_non_daemonise(int argc, char *argv[])
+ 			break;
+ 		case 'h':
+ 			_ledmon_help();
+-			exit(EXIT_SUCCESS);
++			EXIT(EXIT_SUCCESS);
+ 		case 'v':
+ 			_ledmon_version();
+-			exit(EXIT_SUCCESS);
++			EXIT(EXIT_SUCCESS);
+ 		case ':':
+ 		case '?':
+ 			return LEDMON_STATUS_CMDLINE_ERROR;
+@@ -890,14 +894,13 @@ static void _close_parent_fds(void)
+ int main(int argc, char *argv[])
+ {
+ 	ledmon_status_code_t status = LEDMON_STATUS_SUCCESS;
+-	static int ignore;
+ 
+ 	setup_options(&longopt, &shortopt, possible_params,
+ 			possible_params_size);
+ 	set_invocation_name(argv[0]);
+ 	openlog(progname, LOG_PID | LOG_PERROR, LOG_DAEMON);
+ 
+-	if (on_exit(_ledmon_status, &ignore))
++	if (atexit(_ledmon_status))
+ 		return LEDMON_STATUS_ONEXIT_ERROR;
+ 
+ 	if (_cmdline_parse_non_daemonise(argc, argv) != LEDMON_STATUS_SUCCESS)
+@@ -935,18 +938,18 @@ int main(int argc, char *argv[])
+ 
+ 		if (pid < 0) {
+ 			log_debug("main(): fork() failed (errno=%d).", errno);
+-			exit(EXIT_FAILURE);
++			EXIT(EXIT_FAILURE);
+ 		}
+ 		if (pid > 0) {
+ 			ignore = 1; /* parent: don't print exit status */
+-			exit(EXIT_SUCCESS);
++			EXIT(EXIT_SUCCESS);
+ 		}
+ 
+ 		pid_t sid = setsid();
+ 
+ 		if (sid < 0) {
+ 			log_debug("main(): setsid() failed (errno=%d).", errno);
+-			exit(EXIT_FAILURE);
++			EXIT(EXIT_FAILURE);
+ 		}
+ 
+ 		_close_parent_fds();
+@@ -960,16 +963,16 @@ int main(int argc, char *argv[])
+ 
+ 	if (chdir("/") < 0) {
+ 		log_debug("main(): chdir() failed (errno=%d).", errno);
+-		exit(EXIT_FAILURE);
++		EXIT(EXIT_FAILURE);
+ 	}
+ 	if (pidfile_create(progname)) {
+ 		log_debug("main(): pidfile_creat() failed.");
+-		exit(EXIT_FAILURE);
++		EXIT(EXIT_FAILURE);
+ 	}
+ 	_ledmon_setup_signals();
+ 
+-	if (on_exit(_ledmon_fini, progname))
+-		exit(LEDMON_STATUS_ONEXIT_ERROR);
++	if (atexit(_ledmon_fini))
++		EXIT(LEDMON_STATUS_ONEXIT_ERROR);
+ 	list_init(&ledmon_block_list, (item_free_t)block_device_fini);
+ 	sysfs_init();
+ 	log_info("monitor service has been started...");
+@@ -987,5 +990,5 @@ int main(int argc, char *argv[])
+ 	}
+ 	ledmon_remove_shared_conf();
+ 	stop_udev_monitor();
+-	exit(EXIT_SUCCESS);
++	EXIT(EXIT_SUCCESS);
+ }
+-- 
+2.39.2
+
diff --git a/package/ledmon/0002-Fix-unknown-type-name-ssize_t-error.patch b/package/ledmon/0002-Fix-unknown-type-name-ssize_t-error.patch
new file mode 100644
index 0000000000..037e06d2bb
--- /dev/null
+++ b/package/ledmon/0002-Fix-unknown-type-name-ssize_t-error.patch
@@ -0,0 +1,44 @@
+From b9f454cd29b6b5a0927b3c1e98807d54ffacd73e Mon Sep 17 00:00:00 2001
+From: Maksim Kiselev <bigunclemax at gmail.com>
+Date: Mon, 15 May 2023 19:29:45 +0300
+Subject: [PATCH 2/2] Fix unknown type name ‘ssize_t’ error
+
+This error occurs for builds with musl libc.
+Move include <sys/types.h> to utils header to
+resolve this issue.
+
+Upstream: https://github.com/intel/ledmon/pull/139
+
+Signed-off-by: Maksim Kiselev <bigunclemax at gmail.com>
+---
+ src/utils.c | 1 -
+ src/utils.h | 1 +
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/utils.c b/src/utils.c
+index 86b9593..0b83d5a 100644
+--- a/src/utils.c
++++ b/src/utils.c
+@@ -33,7 +33,6 @@
+ #include <string.h>
+ #include <sys/stat.h>
+ #include <sys/time.h>
+-#include <sys/types.h>
+ #include <time.h>
+ #include <unistd.h>
+ #include <assert.h>
+diff --git a/src/utils.h b/src/utils.h
+index 5d590b9..d02da8f 100644
+--- a/src/utils.h
++++ b/src/utils.h
+@@ -22,6 +22,7 @@
+ #define _UTILS_H_INCLUDED_
+ 
+ #include <getopt.h>
++#include <sys/types.h>
+ #include "config_file.h"
+ #include "stdlib.h"
+ #include "stdint.h"
+-- 
+2.39.2
+
diff --git a/package/ledmon/0003-Add-disable-doc-option.patch b/package/ledmon/0003-Add-disable-doc-option.patch
new file mode 100644
index 0000000000..ab7a242289
--- /dev/null
+++ b/package/ledmon/0003-Add-disable-doc-option.patch
@@ -0,0 +1,63 @@
+From 141628519d227b59be3977b16ebaab0feb22b295 Mon Sep 17 00:00:00 2001
+From: Maksim Kiselev <bigunclemax at gmail.com>
+Date: Sun, 20 Aug 2023 11:35:57 +0300
+Subject: [PATCH] Add '--disable-doc' option
+
+Introduce a configure option to disable documentation installation
+in case if it is not required.
+
+Upstream: https://github.com/intel/ledmon/pull/154
+
+Signed-off-by: Maksim Kiselev <bigunclemax at gmail.com>
+---
+ Makefile.am  |  8 ++++++--
+ configure.ac | 11 ++++++++++-
+ 2 files changed, 16 insertions(+), 3 deletions(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index ddcd200..644a8d2 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -20,6 +20,10 @@ if SYSTEMD_CONDITION
+   OPTIONAL_SUBDIR = systemd
+ endif
+ 
+-SUBDIRS = doc src $(OPTIONAL_SUBDIR)
++if WITH_DOC
++  DOC_SUBDIR = doc
++  dist_doc_DATA = README.md
++endif
++
++SUBDIRS = src $(DOC_SUBDIR) $(OPTIONAL_SUBDIR)
+ EXTRA_DIST = config/config.h systemd/ledmon.service.in
+-dist_doc_DATA = README.md
+diff --git a/configure.ac b/configure.ac
+index 05baa62..114957f 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -74,6 +74,15 @@ AM_CONDITIONAL([SYSTEMD_CONDITION], [test "$SYSTEMD_STR" = yes])
+ # target directory for ledmon service file
+ AC_SUBST([SYSTEMD_PATH], "$(pkg-config systemd --variable=systemdsystemunitdir)")
+ 
++# Add configure option to disable documentation building
++AC_ARG_ENABLE([doc],
++    [AS_HELP_STRING([--disable-doc],
++        [do not install ledmon documentaion])],
++    [with_doc=${enableval}],
++    [with_doc=yes])
++
++AM_CONDITIONAL([WITH_DOC], [test "x$with_doc" = "xyes"])
++
+ AC_CONFIG_FILES([Makefile
+                  doc/Makefile
+                  src/Makefile
+@@ -86,5 +95,5 @@ $PACKAGE_NAME $VERSION configuration:
+   Preprocessor flags:      ${AM_CPPFLAGS} ${CPPFLAGS}
+   C compiler flags:        ${AM_CFLAGS} ${CFLAGS}
+   Common install location: ${prefix}
+-  configure parameters:    --enable-systemd=${SYSTEMD_STR}
++  configure parameters:    --enable-systemd=${SYSTEMD_STR} --enable-doc=${with_doc}
+ ])
+-- 
+2.39.2
+
diff --git a/package/ledmon/Config.in b/package/ledmon/Config.in
new file mode 100644
index 0000000000..d08be715c3
--- /dev/null
+++ b/package/ledmon/Config.in
@@ -0,0 +1,15 @@
+config BR2_PACKAGE_LEDMON
+	bool "ledmon"
+	depends on BR2_PACKAGE_HAS_UDEV
+	depends on BR2_TOOLCHAIN_HAS_THREADS # sg3_utils
+	select BR2_PACKAGE_PCIUTILS
+	select BR2_PACKAGE_SG3_UTILS
+	help
+	  Enclosure LED Utilities. The ledmon application is
+	  a daemon process used to monitor a state of software
+	  RAID devices (md only) or a state of block devices.
+
+	  https://github.com/intel/ledmon
+
+comment "ledmon needs udev and a toolchain w/ threads"
+	depends on !BR2_PACKAGE_HAS_UDEV || !BR2_TOOLCHAIN_HAS_THREADS
diff --git a/package/ledmon/ledmon.hash b/package/ledmon/ledmon.hash
new file mode 100644
index 0000000000..dfc5d74242
--- /dev/null
+++ b/package/ledmon/ledmon.hash
@@ -0,0 +1,3 @@
+# Locally calculated
+sha256  40ee7e462b78c77468cc2ef356a06c5b6db44747d596dc11532f7b6f378d2d4b  ledmon-0.97.tar.gz
+sha256  dcc100d4161cc0b7177545ab6e47216f84857cda3843847c792a25289852dcaa  COPYING
diff --git a/package/ledmon/ledmon.mk b/package/ledmon/ledmon.mk
new file mode 100644
index 0000000000..a3a655ab9f
--- /dev/null
+++ b/package/ledmon/ledmon.mk
@@ -0,0 +1,18 @@
+################################################################################
+#
+# ledmon
+#
+################################################################################
+
+LEDMON_VERSION = 0.97
+LEDMON_SITE = $(call github,intel,ledmon,v$(LEDMON_VERSION))
+LEDMON_DEPENDENCIES = host-pkgconf pciutils sg3_utils udev
+LEDMON_LICENSE = GPL-2.0
+LEDMON_LICENSE_FILES = COPYING
+# The code base also include a COPYING.LIB file with the LGPL-2.1 text,
+# and some source files are published under LGPL-2.1, but all of them are
+# at some point linked with GPL-2.0 code, making the resulting binaries
+# GPL-2.0 licensed
+LEDMON_AUTORECONF = YES
+
+$(eval $(autotools-package))
-- 
2.39.2




More information about the buildroot mailing list