From 435a241b7fcd38cf71942164fdcbb0471075a153 Mon Sep 17 00:00:00 2001 From: PhsySimon Date: Fri, 11 Oct 2024 19:37:33 +0800 Subject: [PATCH] fix bugs of xalarmd --- .../src/libso/xalarm/register_xalarm.c | 13 ++++++++++++ .../src/python/xalarm/register_xalarm.py | 18 ++++++++++------- .../src/python/xalarm/sentry_notify.py | 4 ++-- .../src/python/xalarm/xalarm_server.py | 20 ++++++++++++++----- .../src/python/xalarm/xalarm_transfer.py | 10 +++++++++- 5 files changed, 50 insertions(+), 15 deletions(-) diff --git a/sysSentry-1.0.2/src/libso/xalarm/register_xalarm.c b/sysSentry-1.0.2/src/libso/xalarm/register_xalarm.c index 5aff2bc..82b7ddd 100644 --- a/sysSentry-1.0.2/src/libso/xalarm/register_xalarm.c +++ b/sysSentry-1.0.2/src/libso/xalarm/register_xalarm.c @@ -156,6 +156,10 @@ static void *alarm_recv(void *arg) continue; } printf("recv error len:%d errno:%d\n", recvlen, errno); + } else if (recvlen == 0) { + printf("connection closed by xalarmd, maybe connections reach max num or service stopped.\n"); + g_register_info.thread_should_stop = 1; + break; } } return NULL; @@ -211,6 +215,10 @@ bool xalarm_Upgrade(struct alarm_subscription_info id_filter, int client_id) printf("%s: invalid args\n", __func__); return false; } + if (g_register_info.thread_should_stop) { + printf("%s: upgrade failed, alarm thread has stopped\n", __func__); + return false; + } set_alarm_id(id_filter); return true; @@ -339,6 +347,11 @@ int xalarm_Report(unsigned short usAlarmId, unsigned char ucAlarmLevel, return -1; } + if (pucParas == NULL || (int)strlen(pucParas) > MAX_PARAS_LEN) { + fprintf(stderr, "%s: alarm info invalid\n", __func__); + return -1; + } + if (memset(&info, 0, sizeof(struct alarm_info)) == NULL) { fprintf(stderr, "%s: memset info failed, ret: %d\n", __func__, ret); return -1; diff --git a/sysSentry-1.0.2/src/python/xalarm/register_xalarm.py b/sysSentry-1.0.2/src/python/xalarm/register_xalarm.py index bc2ec0e..6ac1eb7 100644 --- a/sysSentry-1.0.2/src/python/xalarm/register_xalarm.py +++ b/sysSentry-1.0.2/src/python/xalarm/register_xalarm.py @@ -45,7 +45,7 @@ class AlarmRegister: return False if self.socket is None: - sys.stderr.write("check_params: scoket create failed\n") + sys.stderr.write("check_params: socket create failed\n") return False return True @@ -147,15 +147,19 @@ def xalarm_unregister(clientId: int) -> None: ALARM_REGISTER_INFO = None -def xalarm_upgrade(clientId: int, id_filter: list) -> None: +def xalarm_upgrade(clientId: int, id_filter: list) -> bool: global ALARM_REGISTER_INFO if clientId < 0: - sys.stderr.write("xalarm_unregister: invalid client\n") - return + sys.stderr.write("xalarm_upgrade: invalid client\n") + return False if ALARM_REGISTER_INFO is None: - sys.stderr.write("xalarm_unregister: alarm has not registered\n") - return - ALARM_REGISTER_INFO.id_filter = id_filter + sys.stderr.write("xalarm_upgrade: alarm has not registered\n") + return False + if ALARM_REGISTER_INFO.thread_should_stop: + sys.stderr.write("xalarm_upgrade: upgrade failed, alarm thread has stopped\n") + return False + ALARM_REGISTER_INFO.id_filter = id_filter + return True def xalarm_getid(alarm_info: Xalarm) -> int: diff --git a/sysSentry-1.0.2/src/python/xalarm/sentry_notify.py b/sysSentry-1.0.2/src/python/xalarm/sentry_notify.py index c763a24..5838473 100644 --- a/sysSentry-1.0.2/src/python/xalarm/sentry_notify.py +++ b/sysSentry-1.0.2/src/python/xalarm/sentry_notify.py @@ -27,11 +27,11 @@ ALARM_SOCKET_PERMISSION = 0o700 def check_params(alarm_id, alarm_level, alarm_type, puc_paras) -> bool: if not os.path.exists(DIR_XALARM): - sys.stderr.write(f"check_params: {DIR_XALARM} not exist, failed") + sys.stderr.write(f"check_params: {DIR_XALARM} not exist, failed\n") return False if not os.path.exists(PATH_REPORT_ALARM): - sys.stderr.write(f"check_params: {PATH_REPORT_ALARM} not exist, failed") + sys.stderr.write(f"check_params: {PATH_REPORT_ALARM} not exist, failed\n") return False if (alarm_id < MIN_ALARM_ID or alarm_id > MAX_ALARM_ID or diff --git a/sysSentry-1.0.2/src/python/xalarm/xalarm_server.py b/sysSentry-1.0.2/src/python/xalarm/xalarm_server.py index 2882609..f90a0e2 100644 --- a/sysSentry-1.0.2/src/python/xalarm/xalarm_server.py +++ b/sysSentry-1.0.2/src/python/xalarm/xalarm_server.py @@ -22,7 +22,12 @@ import threading from struct import error as StructParseError from .xalarm_api import alarm_bin2stu -from .xalarm_transfer import check_filter, transmit_alarm, wait_for_connection +from .xalarm_transfer import ( + check_filter, + transmit_alarm, + wait_for_connection, + peroid_task_to_cleanup_connections +) ALARM_DIR = "/var/run/xalarm" @@ -66,9 +71,13 @@ def server_loop(alarm_config): fd_to_socket = {alarm_sock.fileno(): alarm_sock,} thread_should_stop = False - thread = threading.Thread(target=wait_for_connection, args=(alarm_sock, epoll, fd_to_socket, thread_should_stop)) - thread.daemon = True - thread.start() + conn_thread = threading.Thread(target=wait_for_connection, args=(alarm_sock, epoll, fd_to_socket, thread_should_stop)) + conn_thread.daemon = True + conn_thread.start() + + cleanup_thread = threading.Thread(target=peroid_task_to_cleanup_connections, args=(alarm_sock, epoll, fd_to_socket, thread_should_stop)) + cleanup_thread.daemon = True + cleanup_thread.start() while True: try: @@ -88,7 +97,8 @@ def server_loop(alarm_config): logging.error(f"Error server:{e}") thread_should_stop = True - thread.join() + conn_thread.join() + cleanup_thread.join() epoll.unregister(alarm_sock.fileno()) epoll.close() diff --git a/sysSentry-1.0.2/src/python/xalarm/xalarm_transfer.py b/sysSentry-1.0.2/src/python/xalarm/xalarm_transfer.py index 42137d8..b072007 100644 --- a/sysSentry-1.0.2/src/python/xalarm/xalarm_transfer.py +++ b/sysSentry-1.0.2/src/python/xalarm/xalarm_transfer.py @@ -17,11 +17,13 @@ Create: 2023-11-02 import socket import logging import select +from time import sleep MIN_ID_NUMBER = 1001 MAX_ID_NUMBER = 1128 MAX_CONNECTION_NUM = 100 TEST_CONNECT_BUFFER_SIZE = 32 +PEROID_SCANN_TIME = 60 def check_filter(alarm_info, alarm_filter): @@ -66,6 +68,12 @@ def cleanup_closed_connections(server_sock, epoll, fd_to_socket): logging.info(f"cleaned up connection {fileno} for client lost connection.") +def peroid_task_to_cleanup_connections(server_sock, epoll, fd_to_socket, thread_should_stop): + while not thread_should_stop: + sleep(PEROID_SCANN_TIME) + cleanup_closed_connections(server_sock, epoll, fd_to_socket) + + def wait_for_connection(server_sock, epoll, fd_to_socket, thread_should_stop): """ thread function for catch and save client connection @@ -117,4 +125,4 @@ def transmit_alarm(server_sock, epoll, fd_to_socket, bin_data): epoll.unregister(fileno) fd_to_socket[fileno].close() del fd_to_socket[fileno] - + logging.info(f"cleaned up connection {fileno} for client lost connection.") -- Gitee