blob: 71bc1f6c201a97dede377171b70e002e55aaaee8 [file] [log] [blame]
liubin281ac462023-07-19 14:22:54 +08001#include <stdio.h>
2#include <fcntl.h>
3#include <time.h>
4#include <stdio.h>
5#include <unistd.h>
6#include <sys/socket.h>
7#include <time.h>
8#include <errno.h>
9#include <stdlib.h>
xf.li44e08692024-01-30 01:54:44 -080010#include <sys/file.h>
liubin281ac462023-07-19 14:22:54 +080011#include <sys/types.h>
12#include <sys/stat.h>
b.liu0f7ffad2024-11-06 19:57:27 +080013#include <string.h>
14#include <pthread.h>
b.liu3fb0ffe2024-11-12 19:24:43 +080015#include <signal.h>
b.liu0f7ffad2024-11-06 19:57:27 +080016
b.liub3b923a2024-06-06 15:15:49 +080017#include "json-c/json.h"
18#include "json-c/printbuf.h"
liubin281ac462023-07-19 14:22:54 +080019#include "log_config.h"
20
b.liu5fa2fb52024-06-20 18:26:34 +080021#include "mbtk_type.h"
xf.li43643772024-03-04 19:39:53 -080022//#define DEBUG 1
liubin281ac462023-07-19 14:22:54 +080023
b.liu3fb0ffe2024-11-12 19:24:43 +080024#ifdef MBTK_DUMP_SUPPORT
25void mbtk_debug_open(const char *log_file, bool thread_support);
26#endif
l.yang250444d2024-11-12 00:35:10 -080027
liubin281ac462023-07-19 14:22:54 +080028#ifdef DEBUG
29#define mbtk_log(...) printf(__VA_ARGS__)
30#else
31#define mbtk_log(...)
32#endif
33
l.yang250444d2024-11-12 00:35:10 -080034
35#define MAX_BUFFER_SIZE (8*1024)
l.yange4285f22024-11-13 00:30:41 -080036#define MAX_SLEEP_TIME 2147483647
l.yang250444d2024-11-12 00:35:10 -080037
38int tmp_syslog_fd = -1;
39int tmp_rd_fd = -1;
40
41char syslog_buff[MAX_BUFFER_SIZE] = {0};
42char radiolog_buff[MAX_BUFFER_SIZE] = {0};
43
44
45static void signal_handler(int signum)
46{
47 printf("Received SIGTERM signal, fflush buffer");
48 if(fcntl(tmp_syslog_fd, F_GETFL) != -1 && strlen(syslog_buff) > 0)
49 {
b.liu3fb0ffe2024-11-12 19:24:43 +080050 if(write(tmp_syslog_fd, syslog_buff, strlen(syslog_buff)) < 0)
l.yang250444d2024-11-12 00:35:10 -080051 {
52 perror("write error");
53 }
54 memset(syslog_buff,0,MAX_BUFFER_SIZE);
55 }
b.liu3fb0ffe2024-11-12 19:24:43 +080056
l.yang250444d2024-11-12 00:35:10 -080057 if(fcntl(tmp_rd_fd, F_GETFL) != -1 && strlen(radiolog_buff) > 0)
58 {
b.liu3fb0ffe2024-11-12 19:24:43 +080059 if(write(tmp_rd_fd, radiolog_buff, strlen(radiolog_buff)) < 0)
l.yang250444d2024-11-12 00:35:10 -080060 {
61 perror("write error");
62 }
63 memset(radiolog_buff,0,MAX_BUFFER_SIZE);
64 }
b.liu3fb0ffe2024-11-12 19:24:43 +080065
l.yang250444d2024-11-12 00:35:10 -080066}
67
liubin281ac462023-07-19 14:22:54 +080068static void handler_free(log_config_entry* listdata)
69{
70 int i, n;
71 struct filter_list_t* _filter_list = NULL;
72 log_config_entry* entry;
73
74 for (i = 0; i < 5; i++) {
75 entry = listdata + i;
76 if (entry->name) {
l.yange4285f22024-11-13 00:30:41 -080077 //free(entry->name);
liubin281ac462023-07-19 14:22:54 +080078 if (entry->out_path) {
l.yange4285f22024-11-13 00:30:41 -080079 //free(entry->out_path);
liubin281ac462023-07-19 14:22:54 +080080 }
81 if (entry->ip) {
82 free(entry->ip);
83 }
84 _filter_list = entry->filter_list;
85 for (n = 0; n < 10; n++) {
b.liu9e8584b2024-11-06 19:21:28 +080086 printf("%s %d: malloc %p!\n", __FUNCTION__, __LINE__, _filter_list);
liubin281ac462023-07-19 14:22:54 +080087 if (_filter_list) {
b.liu9e8584b2024-11-06 19:21:28 +080088 printf("%s %d: malloc %p!\n", __FUNCTION__, __LINE__, _filter_list->next);
l.yange4285f22024-11-13 00:30:41 -080089 if (_filter_list->tag && _filter_list->tag[0] != '\0') {
liubin281ac462023-07-19 14:22:54 +080090 free(_filter_list->tag);
91 }
92 free(_filter_list);
93 _filter_list = _filter_list->next;
94 } else {
95 break;
96 }
97 }
98 } else {
99 break;
100 }
101 }
102}
103
104int parse_config(log_config_entry* listdata)
105{
106 json_object* jsonobj = NULL;
107 json_object* tmpjson = NULL;
108 json_object* datajson = NULL;
109 json_object* listjson = NULL;
110 json_object* fileterjson = NULL;
111 json_object* fileter_listjson = NULL;
112 log_config_entry* entry;
xf.li43643772024-03-04 19:39:53 -0800113 int i, n, ret, array_length;
b.liu0f7ffad2024-11-06 19:57:27 +0800114 char* cmdval = NULL;
liubin281ac462023-07-19 14:22:54 +0800115
xf.li44e08692024-01-30 01:54:44 -0800116 printf("MBTK_LOGD: in parse_config\n");
liubin281ac462023-07-19 14:22:54 +0800117 jsonobj = json_object_from_file(LOG_CONFIG_PATH);
118 if (NULL == jsonobj) {
119 printf("Can't open config file: %s\n", LOG_CONFIG_PATH);
120 return -1;
121 }
122 ret = json_object_object_get_ex(jsonobj, "logd", &tmpjson);
123 if (!ret) {
124 printf("get jsondata error ...\n");
125 }
126
127 if (NULL == tmpjson) {
128 printf("the tmpjson : [%s]\n", json_object_to_json_string(tmpjson));
129 }
130 /**获取total***/
b.liu0f7ffad2024-11-06 19:57:27 +0800131 cmdval = (char*)json_object_get_string(tmpjson);
liubin281ac462023-07-19 14:22:54 +0800132 printf("logd enable : %s\n", cmdval);
133 json_object_put(tmpjson);
xf.li44e08692024-01-30 01:54:44 -0800134
liubin281ac462023-07-19 14:22:54 +0800135 /***获取data***/
136 json_object_object_get_ex(jsonobj, "buffer_list", &tmpjson);
xf.li44e08692024-01-30 01:54:44 -0800137
liubin281ac462023-07-19 14:22:54 +0800138 for (i = 0 ; i < 5; i++) {
139 struct filter_list_t* _filter_list = NULL;
140 struct filter_list_t* tmp_filter_list = NULL;
141 datajson = json_object_array_get_idx(tmpjson, i);
142 if (NULL == datajson) {
143 mbtk_log("the datajson exit\n");
144 break;
145 }
146 entry = listdata + i;
147 json_object_object_get_ex(datajson, "enable", &listjson);
148 entry->enable = json_object_get_int(listjson);
149 mbtk_log("enable: %d\n", entry->enable);
150
151 json_object_object_get_ex(datajson, "name", &listjson);
b.liu0f7ffad2024-11-06 19:57:27 +0800152 entry->name = (char*)json_object_get_string(listjson);
b.liu9e8584b2024-11-06 19:21:28 +0800153 printf("cmdval: %s\n", entry->name);
liubin281ac462023-07-19 14:22:54 +0800154
155 json_object_object_get_ex(datajson, "log_file", &listjson);
b.liu0f7ffad2024-11-06 19:57:27 +0800156 entry->out_path = (char*)json_object_get_string(listjson);
liubin281ac462023-07-19 14:22:54 +0800157 mbtk_log("cmdval: %s\n", entry->out_path);
158
159 json_object_object_get_ex(datajson, "log_stream", &listjson);
160 if (listjson) {
b.liu0f7ffad2024-11-06 19:57:27 +0800161 entry->ip = (char*)json_object_get_string(listjson);
xf.li44e08692024-01-30 01:54:44 -0800162
liubin281ac462023-07-19 14:22:54 +0800163 cmdval = strstr(entry->ip, ":");
164 if (cmdval) {
165 entry->port = &cmdval[1];
166 cmdval[0] = 0;
167 mbtk_log("cmdval: %s [%s]\n", entry->ip, entry->port);
168 } else {
169 printf("Can't find port!!\n");
170 free(entry->ip);
171 entry->ip = NULL;
172 }
173 }
174 json_object_object_get_ex(datajson, "rotate_file_size", &listjson);
175 entry->rotate_file_size = json_object_get_int(listjson) * 1024;
176 mbtk_log("rotate_file_size: %d\n", entry->rotate_file_size);
177
178 json_object_object_get_ex(datajson, "rotate_file_count", &listjson);
179 entry->rotate_file_count = json_object_get_int(listjson);
180 mbtk_log("rotate_file_count: %d\n", entry->rotate_file_count);
181
182 json_object_object_get_ex(datajson, "filter_list", &listjson);
183 if (NULL == listjson) {
184 printf("%s %d: object failure!\n", __FUNCTION__, __LINE__);
185 json_object_put(listjson);
186 continue;
187 }
188 entry->filter_list = (struct filter_list_t*)malloc(sizeof(struct filter_list_t));
189 _filter_list = entry->filter_list;
190
xf.li43643772024-03-04 19:39:53 -0800191 array_length = json_object_array_length(listjson);
192 for (n = 0 ; n <= array_length; n++) {
liubin281ac462023-07-19 14:22:54 +0800193 fileterjson = json_object_array_get_idx(listjson, n);
194 if (NULL == fileterjson) {
195 mbtk_log("the fileterjson exit\n");
196 free(tmp_filter_list->next);
197 tmp_filter_list->next = NULL;
198 break;
199 }
200 memset(_filter_list, 0, sizeof(struct filter_list_t));
201 json_object_object_get_ex(fileterjson, "priority", &fileter_listjson);
b.liu0f7ffad2024-11-06 19:57:27 +0800202 const char* str = json_object_get_string(fileter_listjson);
liubin281ac462023-07-19 14:22:54 +0800203 if (str) {
204 _filter_list->priority = str[0];
205 mbtk_log("fileter_listjson: %c\n", _filter_list->priority);
206 }
207 json_object_object_get_ex(fileterjson, "tag", &fileter_listjson);
208 // if (NULL == fileter_listjson) {
209 // printf("%s %d: object failure!\n", __FUNCTION__, __LINE__);
210 // }
211 str = json_object_get_string(fileter_listjson);
212 if (str) {
213 _filter_list->tag = strdup(str);
214 mbtk_log("fileter_listjson: %s\n", _filter_list->tag);
215 }
xf.li43643772024-03-04 19:39:53 -0800216 else
217 {
218 _filter_list->tag = "\0";
219 }
xf.li44e08692024-01-30 01:54:44 -0800220
221 //json_object_put(fileter_listjson);
liubin281ac462023-07-19 14:22:54 +0800222 _filter_list->next = (struct filter_list_t*)malloc(sizeof(struct filter_list_t));
223 if (NULL == _filter_list->next) {
224 printf("%s %d: malloc failure!\n", __FUNCTION__, __LINE__);
225 break;
226 }
227 tmp_filter_list = _filter_list;
228 _filter_list = _filter_list->next;
229 }
liubin281ac462023-07-19 14:22:54 +0800230 }
liubin281ac462023-07-19 14:22:54 +0800231
232 /***释放json对象***/
233 json_object_put(jsonobj);
xf.li44e08692024-01-30 01:54:44 -0800234 printf("MBTK_LOGD: parse_config end\n");
liubin281ac462023-07-19 14:22:54 +0800235 return 0;
236}
237
238#define LOGD_PID "/var/run/mbtk_logd.pid"
b.liu0f7ffad2024-11-06 19:57:27 +0800239#if 0
liubin281ac462023-07-19 14:22:54 +0800240static int save_pid(void)
241{
242 pid_t process_id;
243 int fd, ret;
244 char buf[12] = {0};
245
246 process_id = getpid();
247 if(access(LOGD_PID, F_OK) == 0)
248 {
249 printf("mbtk_logd 进程已经存在\n");
250 return -1;
251 }
252 fd = open(LOGD_PID, O_CREAT | O_WRONLY, 0600);
253 if (fd < 0) {
254 fprintf(stderr, "failed to open %s: %s\n", LOGD_PID, strerror(errno));
255 return -2;
256 }
257 snprintf(buf, sizeof(buf), "%d\n", process_id);
258 ret = write(fd, buf, strlen(buf));
259 close(fd);
260
261 if(ret > 0)
262 return 0;
263 else
264 return -2;
265}
b.liu0f7ffad2024-11-06 19:57:27 +0800266#endif
xf.li43643772024-03-04 19:39:53 -0800267
liubin281ac462023-07-19 14:22:54 +0800268int main(int argc, char* argv[])
269{
270 log_config_entry listdata[5];
271 pthread_t pid[5] = {0};
272 int i, ret;
273 void* tret;
l.yang250444d2024-11-12 00:35:10 -0800274 //struct filter_list_t* _filter_list = NULL;
xf.li44e08692024-01-30 01:54:44 -0800275
l.yang250444d2024-11-12 00:35:10 -0800276 signal(SIGTERM, signal_handler);
b.liubb590492024-06-13 16:42:08 +0800277#ifdef MBTK_DUMP_SUPPORT
278 mbtk_debug_open(NULL, TRUE);
279#endif
280
xf.li44e08692024-01-30 01:54:44 -0800281 int lock_file = open("/tmp/mbtk_logd.lock", O_CREAT|O_RDWR, 0666);
282 int rc = flock(lock_file,LOCK_EX|LOCK_NB);
283 if(rc) {
284 if(EWOULDBLOCK == errno) {
285 printf("Error: cannot restart the mbtk_logd repeatedly\n");
286 exit(0);
287 }
288 }
liubin281ac462023-07-19 14:22:54 +0800289
290 memset(listdata, 0, sizeof(log_config_entry) * 5);
liubin281ac462023-07-19 14:22:54 +0800291 ret = parse_config(listdata);
292 if (ret) {
293 return -1;
294 }
liubin281ac462023-07-19 14:22:54 +0800295
296 printf("logd %s start !\n", __FUNCTION__);
297
298 for (i = 0; i < 5; ++i) {
299 if (NULL == listdata[i].name) {
300 break;
301 }
302
303 if (0 == listdata[i].enable) {
304 printf("%s log disabled !\n", listdata[i].name);
305 continue;
306 }
307
308 if (0 == memcmp(listdata[i].name, "radio", 5)) {
309 ret = pthread_create(&pid[i], NULL, alog_thread, &listdata[i]);
310 if (ret != 0) {
311 fprintf(stderr, "\n%s: Failed to create pthread\n", __FUNCTION__);
312 }
313 } else if (0 == memcmp(listdata[i].name, "syslog", 6)) {
314 ret = pthread_create(&pid[i], NULL, syslog_main, &listdata[i]);
315 if (ret != 0) {
316 fprintf(stderr, "\n%s %d: Failed to create pthread\n", __FUNCTION__, __LINE__);
317 }
318 } else if (0 == memcmp(listdata[i].name, "local_socket", 12)) {
319 ret = pthread_create(&pid[i], NULL, socket_log_thread, &listdata[i]);
320 if (ret != 0) {
321 fprintf(stderr, "\n%s %d: Failed to create pthread\n", __FUNCTION__, __LINE__);
322 }
xf.li44e08692024-01-30 01:54:44 -0800323 } else if (0 == memcmp(listdata[i].name, "/dev/ttyS0", 8)) {
liubin281ac462023-07-19 14:22:54 +0800324 ret = pthread_create(&pid[i], NULL, common_log_thread, &listdata[i]);
325 if (ret != 0) {
326 fprintf(stderr, "\n%s %d: Failed to create pthread\n", __FUNCTION__, __LINE__);
327 }
328 }
329 }
330
b.liu5fa2fb52024-06-20 18:26:34 +0800331
liubin281ac462023-07-19 14:22:54 +0800332 for (i = 0; i < 5; ++i) {
333 if (NULL == listdata[i].name) {
334 break;
335 }
336 if (pid[i]) {
337 if (pthread_join(pid[i], &tret) != 0) {
b.liu0f7ffad2024-11-06 19:57:27 +0800338 printf("Join thread %d : %ld error!\n", i, pid[i]);
liubin281ac462023-07-19 14:22:54 +0800339 exit(1);
340 }
341 }
342 }
343 handler_free(listdata);
l.yange4285f22024-11-13 00:30:41 -0800344 sleep(MAX_SLEEP_TIME);
liubin281ac462023-07-19 14:22:54 +0800345 return 0;
346}