!211 [sync] PR-203: add bidrectional communication for libxalarm
From: @openeuler-sync-bot Reviewed-by: @hubin95 Signed-off-by: @hubin95
This commit is contained in:
commit
2cd75d7cb3
219
add-bidirectional-communication-for-xalarm.patch
Normal file
219
add-bidirectional-communication-for-xalarm.patch
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
From 6fcb7c9e471269c9256efdc0f38c4c579eb7f4bd Mon Sep 17 00:00:00 2001
|
||||||
|
From: PshySimon <caixiaomeng2@huawei.com>
|
||||||
|
Date: Fri, 7 Feb 2025 10:45:14 +0800
|
||||||
|
Subject: [PATCH] add bidirectional communication for xalarm
|
||||||
|
|
||||||
|
---
|
||||||
|
src/libs/libxalarm/register_xalarm.c | 154 +++++++++++++++++++++++++++
|
||||||
|
src/libs/libxalarm/register_xalarm.h | 21 +++-
|
||||||
|
2 files changed, 174 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/libs/libxalarm/register_xalarm.c b/src/libs/libxalarm/register_xalarm.c
|
||||||
|
index deca575..9ff0f7c 100644
|
||||||
|
--- a/src/libs/libxalarm/register_xalarm.c
|
||||||
|
+++ b/src/libs/libxalarm/register_xalarm.c
|
||||||
|
@@ -655,3 +655,157 @@ int report_result(const char *task_name, enum RESULT_LEVEL result_level, const c
|
||||||
|
return RETURE_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
+int xalarm_register_event(struct alarm_register **register_info, struct alarm_subscription_info id_filter)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+ // check whether id_filter is valid
|
||||||
|
+ if (register_info == NULL || !alarm_subscription_verify(id_filter)) {
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ *register_info = (struct alarm_register *)malloc(sizeof(struct alarm_register));
|
||||||
|
+ // failed to malloc memory for register_info struct
|
||||||
|
+ if (*register_info == NULL) {
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // transform id_filter(eg:[1001, 1002]) into bitmap(eg:[true, true, false, ..., false])
|
||||||
|
+ memset((*register_info)->alarm_enable_bitmap, 0, MAX_NUM_OF_ALARM_ID * sizeof(char));
|
||||||
|
+ for (i = 0; i < id_filter.len; i++) {
|
||||||
|
+ (*register_info)->alarm_enable_bitmap[id_filter.id_list[i] - MIN_ALARM_ID] = ALARM_ENABLED;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // establish connection between xalarmd and this program
|
||||||
|
+ (*register_info)->register_fd = create_unix_socket(PATH_REG_ALARM);
|
||||||
|
+ if ((*register_info)->register_fd == -1) {
|
||||||
|
+ free(*register_info);
|
||||||
|
+ return -ENOTCONN;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void xalarm_unregister_event(struct alarm_register *register_info)
|
||||||
|
+{
|
||||||
|
+ if (register_info == NULL) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ // close client fd socket connection resource
|
||||||
|
+ if (register_info->register_fd != -1) {
|
||||||
|
+ (void)close(register_info->register_fd);
|
||||||
|
+ register_info->register_fd = -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ free(register_info);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int xalarm_get_event(struct alarm_msg* msg, struct alarm_register *register_info)
|
||||||
|
+{
|
||||||
|
+ struct alarm_info info;
|
||||||
|
+
|
||||||
|
+ if (msg == NULL || register_info == NULL) {
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ while (true) {
|
||||||
|
+ int recvlen = recv(register_info->register_fd, &info, sizeof(struct alarm_info), 0);
|
||||||
|
+
|
||||||
|
+ // recvlen < 0 means that we meet with error when recv.
|
||||||
|
+ if (recvlen < 0) {
|
||||||
|
+ // when recv EINTR or EAGAIN or EWOULDBLOCK signal, we should try again.
|
||||||
|
+ // EINTR means recv func interrupted by signal
|
||||||
|
+ // EAGIAN and EWOULDBLOCK means recv has been blocked(in nonblock mode)
|
||||||
|
+ if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) {
|
||||||
|
+ usleep(RECV_DELAY_MSEC * TIME_UNIT_MILLISECONDS);
|
||||||
|
+ continue;
|
||||||
|
+ } else {
|
||||||
|
+ // otherwise means we meet up with some unrecoverable error
|
||||||
|
+ // ECONNRESET means server closed the connection for some error
|
||||||
|
+ // EBADF means this filr descriptor is invalid
|
||||||
|
+ // ENOMEM means out of memory
|
||||||
|
+ // EFAULT means invalid buffer address
|
||||||
|
+ close(register_info->register_fd);
|
||||||
|
+ return -errno;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ // recvlen == 0 means the connection has been properly closed,
|
||||||
|
+ // and the remote end has no more data to send.
|
||||||
|
+ if (recvlen == 0) {
|
||||||
|
+ close(register_info->register_fd);
|
||||||
|
+ return -ENOTCONN;
|
||||||
|
+ }
|
||||||
|
+ // if recvlen == sizeof(alarm_info), that means we recieved data correctlly
|
||||||
|
+ // why use alarm_info rather than alarm_msg? alarm_info is used for old
|
||||||
|
+ // api, it's a communication protocol between xalarmd service and libxalarm.
|
||||||
|
+ // to be compatible with old api and reduce modification to xalarmd, use
|
||||||
|
+ // alarm_info for communication and return alarm_msg(alarm_msg is subset of
|
||||||
|
+ // alarm_info).
|
||||||
|
+ if (recvlen == (int)sizeof(struct alarm_info)) {
|
||||||
|
+ // filter alarm id, alarm id reciecved which is not registered by this program
|
||||||
|
+ // will be ignored and continue to wait for next msg
|
||||||
|
+ if (info.usAlarmId < MIN_ALARM_ID || info.usAlarmId > MAX_ALARM_ID ||
|
||||||
|
+ register_info->alarm_enable_bitmap[info.usAlarmId - MIN_ALARM_ID] != ALARM_ENABLED) {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ msg->usAlarmId = info.usAlarmId;
|
||||||
|
+ msg->AlarmTime = info.AlarmTime;
|
||||||
|
+ strncpy((char *)msg->pucParas, (char *)info.pucParas, MAX_PARAS_LEN - 1);
|
||||||
|
+ // no need to close fd because get_event() can be reused after recv one msg
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ // if recvlen > 0 but not equal to sizeof alarm_info, loop to wait for msg
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int xalarm_report_event(unsigned short usAlarmId, char *pucParas)
|
||||||
|
+{
|
||||||
|
+ int ret, fd;
|
||||||
|
+ struct alarm_info info;
|
||||||
|
+ struct sockaddr_un alarm_addr;
|
||||||
|
+
|
||||||
|
+ if (usAlarmId < MIN_ALARM_ID || usAlarmId > MAX_ALARM_ID) {
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (pucParas == NULL || (int)strlen(pucParas) > MAX_PARAS_LEN) {
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ memset(&info, 0, sizeof(struct alarm_info));
|
||||||
|
+ info.usAlarmId = usAlarmId;
|
||||||
|
+ info.ucAlarmLevel = MINOR_ALM;
|
||||||
|
+ info.ucAlarmType = ALARM_TYPE_OCCUR;
|
||||||
|
+ gettimeofday(&info.AlarmTime, NULL);
|
||||||
|
+ strncpy((char *)info.pucParas, (char *)pucParas, MAX_PARAS_LEN - 1);
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ fd = socket(AF_UNIX, SOCK_DGRAM, 0);
|
||||||
|
+ if (fd < 0) {
|
||||||
|
+ return -ENOTCONN;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = init_report_addr(&alarm_addr, PATH_REPORT_ALARM);
|
||||||
|
+ if (ret == -1) {
|
||||||
|
+ close(fd);
|
||||||
|
+ return -ENOTCONN;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ while (true) {
|
||||||
|
+ ret = sendto(fd, &info, sizeof(struct alarm_info), 0, (struct sockaddr *)&alarm_addr,
|
||||||
|
+ sizeof(alarm_addr.sun_family) + strlen(alarm_addr.sun_path));
|
||||||
|
+ // if errno == EINTR means sendto has been interrupted by system, should retry
|
||||||
|
+ if (ret < 0 && errno == EINTR) {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ close(fd);
|
||||||
|
+
|
||||||
|
+ if (ret != (int)sizeof(struct alarm_info)) {
|
||||||
|
+ return -ECOMM;
|
||||||
|
+ }
|
||||||
|
+ return (ret > 0) ? 0 : -errno;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
diff --git a/src/libs/libxalarm/register_xalarm.h b/src/libs/libxalarm/register_xalarm.h
|
||||||
|
index c56561a..7a485ff 100644
|
||||||
|
--- a/src/libs/libxalarm/register_xalarm.h
|
||||||
|
+++ b/src/libs/libxalarm/register_xalarm.h
|
||||||
|
@@ -19,6 +19,9 @@
|
||||||
|
|
||||||
|
#define MEMORY_ALARM_ID 1001
|
||||||
|
|
||||||
|
+#define ALARM_REBOOT_EVENT 1003
|
||||||
|
+#define ALARM_REBOOT_ACK_EVENT 1004
|
||||||
|
+
|
||||||
|
#define MINOR_ALM 1
|
||||||
|
#define MAJOR_ALM 2
|
||||||
|
#define CRITICAL_ALM 3
|
||||||
|
@@ -77,6 +80,22 @@ struct alarm_subscription_info {
|
||||||
|
unsigned int len;
|
||||||
|
};
|
||||||
|
|
||||||
|
+struct alarm_msg {
|
||||||
|
+ unsigned short usAlarmId;
|
||||||
|
+ struct timeval AlarmTime;
|
||||||
|
+ char pucParas[ALARM_INFO_MAX_PARAS_LEN];
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct alarm_register {
|
||||||
|
+ int register_fd;
|
||||||
|
+ char alarm_enable_bitmap[MAX_NUM_OF_ALARM_ID];
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+int xalarm_report_event(unsigned short usAlarmId, char *pucParas);
|
||||||
|
+int xalarm_register_event(struct alarm_register** register_info, struct alarm_subscription_info id_filter);
|
||||||
|
+int xalarm_get_event(struct alarm_msg* msg, struct alarm_register *register_info);
|
||||||
|
+void xalarm_unregister_event(struct alarm_register *register_info);
|
||||||
|
+
|
||||||
|
int xalarm_Register(alarm_callback_func callback, struct alarm_subscription_info id_filter);
|
||||||
|
void xalarm_UnRegister(int client_id);
|
||||||
|
bool xalarm_Upgrade(struct alarm_subscription_info id_filter, int client_id);
|
||||||
|
@@ -118,4 +137,4 @@ extern int report_result(const char *task_name,
|
||||||
|
|
||||||
|
extern int send_data_to_socket(const char *socket_path, const char *message);
|
||||||
|
|
||||||
|
-#endif
|
||||||
|
\ No newline at end of file
|
||||||
|
+#endif
|
||||||
|
--
|
||||||
|
2.27.0
|
||||||
|
|
||||||
@ -4,11 +4,13 @@
|
|||||||
Summary: System Inspection Framework
|
Summary: System Inspection Framework
|
||||||
Name: sysSentry
|
Name: sysSentry
|
||||||
Version: 1.0.3
|
Version: 1.0.3
|
||||||
Release: 1
|
Release: 2
|
||||||
License: Mulan PSL v2
|
License: Mulan PSL v2
|
||||||
Group: System Environment/Daemons
|
Group: System Environment/Daemons
|
||||||
Source0: https://gitee.com/openeuler/sysSentry/releases/download/v%{version}/%{name}-%{version}.tar.gz
|
Source0: https://gitee.com/openeuler/sysSentry/releases/download/v%{version}/%{name}-%{version}.tar.gz
|
||||||
|
|
||||||
|
Patch1: add-bidirectional-communication-for-xalarm.patch
|
||||||
|
|
||||||
BuildRequires: cmake gcc-c++
|
BuildRequires: cmake gcc-c++
|
||||||
BuildRequires: python3 python3-setuptools
|
BuildRequires: python3 python3-setuptools
|
||||||
BuildRequires: json-c-devel
|
BuildRequires: json-c-devel
|
||||||
@ -204,6 +206,12 @@ rm -rf /var/run/sysSentry | :
|
|||||||
%attr(0550,root,root) %{python3_sitelib}/syssentry/bmc_alarm.py
|
%attr(0550,root,root) %{python3_sitelib}/syssentry/bmc_alarm.py
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Sat Feb 8 2025 caixiaomeng <caixiaomeng2@huawei.com> - 1.0.3-2
|
||||||
|
- Type:bugfix
|
||||||
|
- CVE:NA
|
||||||
|
- SUG:NA
|
||||||
|
- DESC: add bidirectional communication for libxalarm
|
||||||
|
|
||||||
* Mon Jan 20 2025 zhuofeng <zhuofeng2@huawei.com> - 1.0.3-1
|
* Mon Jan 20 2025 zhuofeng <zhuofeng2@huawei.com> - 1.0.3-1
|
||||||
- Type:bugfix
|
- Type:bugfix
|
||||||
- CVE:NA
|
- CVE:NA
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user