package/ledmon: new package

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@gmail.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
This commit is contained in:
Maksim Kiselev 2023-08-20 12:58:33 +03:00 committed by Thomas Petazzoni
parent 90031397ed
commit 57ff5f7d2a
8 changed files with 371 additions and 0 deletions

View File

@ -2123,6 +2123,9 @@ F: package/python-txaio/
F: package/python-ujson/
F: package/python-wsaccel/
N: Maksim Kiselev <bigunclemax@gmail.com>
F: package/ledmon/
N: Max Filippov <jcmvbkbc@gmail.com>
F: arch/Config.in.xtensa

View File

@ -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"

View File

@ -0,0 +1,223 @@
From e57ad4c71cce734de7f8aa75e84fce97bc148c2b Mon Sep 17 00:00:00 2001
From: Maksim Kiselev <bigunclemax@gmail.com>
Date: Mon, 15 May 2023 14:46:56 +0300
Subject: [PATCH] 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@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

View File

@ -0,0 +1,44 @@
From b9f454cd29b6b5a0927b3c1e98807d54ffacd73e Mon Sep 17 00:00:00 2001
From: Maksim Kiselev <bigunclemax@gmail.com>
Date: Mon, 15 May 2023 19:29:45 +0300
Subject: [PATCH] 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@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

View File

@ -0,0 +1,63 @@
From 141628519d227b59be3977b16ebaab0feb22b295 Mon Sep 17 00:00:00 2001
From: Maksim Kiselev <bigunclemax@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@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

15
package/ledmon/Config.in Normal file
View File

@ -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

View File

@ -0,0 +1,3 @@
# Locally calculated
sha256 40ee7e462b78c77468cc2ef356a06c5b6db44747d596dc11532f7b6f378d2d4b ledmon-0.97.tar.gz
sha256 dcc100d4161cc0b7177545ab6e47216f84857cda3843847c792a25289852dcaa COPYING

19
package/ledmon/ledmon.mk Normal file
View File

@ -0,0 +1,19 @@
################################################################################
#
# ledmon
#
################################################################################
LEDMON_VERSION = 0.97
LEDMON_SITE = $(call github,intel,ledmon,v$(LEDMON_VERSION))
LEDMON_DEPENDENCIES = host-pkgconf pciutils sg3_utils udev
# 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_LICENSE = GPL-2.0
LEDMON_LICENSE_FILES = COPYING
# 0002-Fix-unknown-type-name-ssize_t-error.patch
LEDMON_AUTORECONF = YES
$(eval $(autotools-package))