blob: 8a99c2951406c112c27e8ba61c05dbc1daf78ed3 [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001/*
2 *
3 * Copyright (C) 2023
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details
14 *
15 * FileName : log_savefs.c
16 * This program Capture module's trace log, and save log to local
17 * file system.
18 */
19
20#include <stdio.h>
21#include <string.h>
22#include <stdlib.h>
23#include <errno.h>
24#include <fcntl.h>
25#include <unistd.h>
26#include <termios.h>
27#include <pthread.h>
28#include <sys/ioctl.h>
29#include <signal.h>
30#include <sys/types.h>
31#include <sys/stat.h>
32#include <errno.h>
33#include <sys/mman.h>
34#include "log_usb.h"
35#include "log_savefs.h"
36#include "./config/IPStart_rule.h"
37#include "./config/modemrule_rule.h"
38
39/**
40 * ºê¶¨Òå
41 */
42#define DELETE_OLD_FILE_NUMR (1)
43#define READ_BUFFER_SIZE (2048)
44#define SINGLE_LOG_SIZE (50*1024*1024)
45#define UNIT_ONE_MB_SIZE (1024*1024)
46
47/**
48 * Íⲿ±äÁ¿ÒýÓÃ
49 */
50extern int errno;
51
52/**
53 * È«¾Ö±äÁ¿¶¨Òå
54 */
55char gReadBuffer[READ_BUFFER_SIZE];
56static pthread_mutex_t s_state_mutex = PTHREAD_MUTEX_INITIALIZER;
57static pthread_cond_t s_state_cond = PTHREAD_COND_INITIALIZER;
58
59T_LOG_RULE_TYPE gRuleOps[] =
60{
61 {"modemrule.rule", modemrule_rule_buf, sizeof(modemrule_rule_buf)},
62 {"IPStart.rule", IPStart_rule_buf, sizeof(IPStart_rule_buf)}
63};
64
65char gHeartBeat_Data[] = {0x01,0xaa,0xaa,0xaa,0x01,0x55,0x73,0x01,
66 0x14,0x00,0x00,0x00,0x06,0x67,0xbb,0xbb,
67 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
68 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
69 0x44,0x09,0x7e};
70
71T_COMM_FS_PARAM gFsSaveParam;
72
73/**
74 * @brief д³öÊý¾Ý
75 * @param[in] void
76 * @return ³É¹¦·µ»ØÐ´È볤¶È£¬Ê§°Ü·µ»Ø-1
77 * @note
78 * @see
79 */
80static int zLogAgt_WriteToTracePort(usbdev_t *udev, char *buf, int len)
81{
82 int retval = -1, write_len = 0;
83 int left_len = len;
84
85 while (left_len > 0) {
86 retval = zLogAgt_Usb_Write(udev, buf+write_len, len);
87 if (retval == -1) {
88 if (errno == EINTR) {
89 continue;
90 }
91 printf("%s failed.\n", __func__);
92 return retval;
93 }
94 left_len -= retval;
95 write_len += retval;
96 }
97
98 return write_len;
99}
100
101/**
102 * @brief ·¢Ë͹æÔòÎļþ¸ø°å²à
103 * @param[in] void
104 * @return ³É¹¦·µ»Ø0£¬Ê§°Ü·µ»Ø-1
105 * @note
106 * @see
107 */
108static int zLogAgt_SendRuleFile(usbdev_t *udev)
109{
110 int ret = -1;
111 int read_size = 0;
112 char *read_buf = NULL;
113 int log_fp = -1;
114 int index = 0;
115 int rule_size = (sizeof(gRuleOps) / sizeof(T_LOG_RULE_TYPE));
116
117 read_buf = (char *)malloc(ZLOG_RULE_MAX_SIZE);
118 if (read_buf == NULL)
119 return ret;
120
121 for (; index < rule_size; index++) {
122 log_fp = open(gRuleOps[index].name, O_RDONLY);
123
124 if (log_fp >= 0) {
125 while ((read_size = read(log_fp, read_buf, ZLOG_RULE_MAX_SIZE - 1)) > 0) {
126 ret = zLogAgt_WriteToTracePort(udev, read_buf, read_size);
127 if (ret < 0) {
128 printf("write trace port failed\n");
129 close(log_fp);
130 free(read_buf);
131 return ret;
132 }
133 memset(read_buf, 0, sizeof(read_buf));
134 }
135 }
136 else {
137 ret = zLogAgt_WriteToTracePort(udev, gRuleOps[index].buf, gRuleOps[index].len);
138 if (ret < 0) {
139 free(read_buf);
140 printf("write trace port failed\n");
141 return ret;
142 }
143 }
144 }
145
146 if (log_fp >= 0) {
147 close(log_fp);
148 log_fp = -1;
149 }
150 ret = 0;
151 free(read_buf);
152 return ret;
153}
154
155/**
156 * @brief ÐÄÌø°ü·¢ËÍÏß³ÌÈë¿Ú
157 * @param[in] void
158 * @return ³É¹¦·µ»ØZOSS_SUCCESS£¬Ê§°Ü·µ»ØZOSS_ERROR
159 * @note
160 * @see
161 */
162static void *zLogAgt_HeartBeatSend_Entry(void *param)
163{
164 int write_len = 0;
165 int remain_len = 0;
166 usbdev_t *udev = (usbdev_t *)param;
167
168 if (param == NULL)
169 return NULL;
170
171 if (zLogAgt_SendRuleFile(udev))
172 return NULL;
173
174 while (1) {
175 remain_len = sizeof(gHeartBeat_Data);
176 while (remain_len > 0) {
177 write_len = 0;
178 int retval = zLogAgt_Usb_Write(udev, gHeartBeat_Data + write_len, remain_len);
179 if (retval <= 0) {
180 PRINTF_DBG_ERROR("retval:%d\n", retval);
181
182 /*ÐÄÌø°ü·¢ËÍʧ°Ü, Ö÷½ø³ÌÍ˳ö*/
183 pthread_mutex_lock(&s_state_mutex);
184 pthread_cond_broadcast (&s_state_cond);
185 pthread_mutex_unlock(&s_state_mutex);
186 return NULL;
187 }
188 remain_len -= retval;
189 write_len += retval;
190 }
191
192 if (write_len != sizeof(gHeartBeat_Data)) {
193 PRINTF_DBG_ERROR("write_len:%d \n", write_len);
194 }
195 sleep(2);
196 }
197}
198
199/**
200 * @brief ɾ³ýLog File
201 * @param[in]ÐèҪɾ³ýµÄÎļþ¸öÊý
202 * @return ³É¹¦·µ»Ø0
203 * @note
204 * @see
205 */
206static int zLogAgt_DelLogFile(int delcnt)
207{
208 int ret = 0;
209 char shcmd[ZLOG_SHELL_CMD_SIZE];
210
211 if (delcnt < DELETE_OLD_FILE_NUMR)
212 delcnt = DELETE_OLD_FILE_NUMR;
213
214 sprintf(shcmd, "ls -rt | sort | head -%d| xargs rm -rf", delcnt);
215 ret = system(shcmd);
216 if (ret < 0)
217 printf("system error errno:%d(%s) \n", errno, strerror(errno));
218
219 return ret;
220}
221
222/**
223 * @brief ´´½¨Log File
224 * @param[in] void
225 * @return ³É¹¦·µ»ØZOSS_SUCCESS£¬Ê§°Ü·µ»ØZOSS_ERROR
226 * @note
227 * @see
228 */
229static int zLogAgt_CreatLogFile(int log_fp)
230{
231 int new_fd = -1;
232 char filename[ZLOG_BUF_SIZE] = {0};
233 time_t t = time(NULL);
234 struct tm *tm = localtime(&t);
235
236 gFsSaveParam.tmaxLogNum = (gFsSaveParam.tMaxLogsize) / (SINGLE_LOG_SIZE);
237
238 if (gFsSaveParam.uFileNum >= gFsSaveParam.tmaxLogNum){
239 zLogAgt_DelLogFile(DELETE_OLD_FILE_NUMR);
240 gFsSaveParam.uFileNum -= DELETE_OLD_FILE_NUMR;
241 }
242
243 sprintf(filename, "%s/%02d_%02d%02d_%02d%02d%02d.log", gFsSaveParam.localFsPath,
244 1900+tm->tm_year, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
245
246 if (log_fp >= 0) {
247 close(log_fp);
248 }
249
250 new_fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0644);
251
252 if (new_fd < 0) {
253 printf("open %s failed errno %d %s.\n", filename, errno, strerror(new_fd));
254 }
255
256 gFsSaveParam.uFileNum++;
257 gFsSaveParam.curfd = new_fd;
258
259 return new_fd;
260}
261
262 /**
263 * @brief LOG ¶ÁÈ¡¼°±£´æÏß³Ì
264 * @param[in] void
265 * @return ³É¹¦·µ»ØZOSS_SUCCESS£¬Ê§°Ü·µ»ØZOSS_ERROR
266 * @note
267 * @see
268 */
269void *zlogAgt_StoreToFs_Entry(void *param)
270{
271 int read_size = 0;
272 int dlog_fp = -1;
273 unsigned int total_len = 0;
274 usbdev_t *udev = (usbdev_t *)param;
275 pthread_t heartbeat_thread;
276
277 if (pthread_create(&heartbeat_thread, NULL, zLogAgt_HeartBeatSend_Entry, (void *)udev)) {
278 PRINTF_DBG_ERROR("create thread failed.\n");
279 }
280
281 while (1) {
282 if (read_size <= 0) {
283 read_size = zLogAgt_Usb_Read(udev, gReadBuffer, sizeof(gReadBuffer));
284 }
285 else {
286 if ((dlog_fp < 0)
287 || ((total_len + read_size) >= SINGLE_LOG_SIZE)) {
288 total_len = 0;
289 dlog_fp = zLogAgt_CreatLogFile(dlog_fp);
290 if (dlog_fp < 0) {
291 break;
292 }
293 }
294 int w_ret = write(dlog_fp, gReadBuffer, read_size);
295 if (w_ret < 0) {
296 printf("%s failed.\n", __func__);
297 dlog_fp = zLogAgt_CreatLogFile(dlog_fp);
298 if (dlog_fp < 0) {
299 break;
300 }
301 continue;
302 }
303 read_size -= w_ret;
304 total_len += w_ret;
305 fsync (dlog_fp);
306 }
307 }
308
309 if (dlog_fp >= 0) {
310 close(dlog_fp);
311 dlog_fp = -1;
312 }
313
314 zLogAgt_Usb_Close(udev);
315 pthread_exit(NULL);
316
317 return NULL;
318}
319
320/**
321 * @brief ÐźÅÍ˳öº¯ÊýÈë¿Ú
322 * @param[in] msg
323 * @return void
324 * @note
325 * @see
326 */
327static void zLogAgt_Exit_Process(int msg)
328{
329 printf("\n%s: %d\n", __func__, msg);
330
331 pthread_mutex_lock(&s_state_mutex);
332 pthread_cond_broadcast(&s_state_cond);
333 pthread_mutex_unlock(&s_state_mutex);
334
335 sleep(1);
336 /*Enable Ctrl+C to exit*/
337 signal(SIGINT, SIG_DFL);
338}
339
340/**
341 * @brief LOG±£´æÖ÷º¯ÊýÈë¿Ú
342 * @param[in] É豸Îļþ¾ä±ú
343 * @return
344 * @note
345 * @see
346 */
347int zLogAgt_Savefs_Main(int fd_devfile)
348{
349 int ret = -1;
350 int opt = -1;
351 usbdev_t udev = {0};
352 pthread_t savefs_thread;
353
354 if (access(gFsSaveParam.localFsPath, 0)) {
355 mkdir(gFsSaveParam.localFsPath, 0777);
356 }
357
358 gFsSaveParam.tMaxLogsize *= UNIT_ONE_MB_SIZE;
359
360 if (gFsSaveParam.tMaxLogsize <= SINGLE_LOG_SIZE)
361 gFsSaveParam.tMaxLogsize = SINGLE_LOG_SIZE;
362
363 udev.ttyfd = fd_devfile;
364
365 ret = pthread_create(&savefs_thread, NULL, zlogAgt_StoreToFs_Entry, (void *)&udev);
366 if (!ret) {
367 signal(SIGINT, zLogAgt_Exit_Process); //ctrl+C
368 signal(SIGTERM, zLogAgt_Exit_Process); //kill
369 pthread_mutex_lock(&s_state_mutex);
370 pthread_cond_wait(&s_state_cond, &s_state_mutex);
371 pthread_mutex_unlock(&s_state_mutex);
372 }
373 else {
374 printf("%s create thread failed, ret:%d error:%s\n", __func__, ret, strerror(ret));
375 return -1;
376 }
377
378 ret = pthread_join(savefs_thread, NULL);
379
380 if (ret) {
381 printf("pthread_join error: %s\n", strerror(ret));
382 }
383 return 0;
384
385}
386
387