diff --git a/http_check/src/http_check.c b/http_check/src/http_check.c index bd85281..6ed2e6d 100644 --- a/http_check/src/http_check.c +++ b/http_check/src/http_check.c @@ -17,15 +17,14 @@ #include #include #include -//#include "cJSON/cJSON.h" -#include "cJSON.h" -#include "MESA/MESA_prof_load.h" -#include "MESA/stream.h" -#include "MESA/MESA_prof_load.h" -#include "MESA/MESA_handle_logger.h" -#include "MESA/MESA_htable.h" -#include "MESA/MESA_list.h" #include +#include "cJSON.h" +#include "../../../opt/MESA/include/MESA/MESA_prof_load.h" +#include "../../../opt/MESA/include/MESA/stream.h" +#include "../../../opt/MESA/include/MESA/MESA_prof_load.h" +#include "../../../opt/MESA/include/MESA/MESA_handle_logger.h" +#include "../../../opt/MESA/include/MESA/MESA_htable.h" +#include "../../../opt/MESA/include/MESA/MESA_list.h" #define BUFSIZE 8192 #define MAX_STR_LEN 256 @@ -36,6 +35,11 @@ uint16_t g_http_port; char g_http_address[MAX_STR_LEN]=""; const char *http_check_conf_file = "./plug/business/http_check/http_check.conf"; +char http_check_log_path[MAX_STR_LEN] = ""; +char http_check_error_log_path[MAX_STR_LEN] = ""; +char module_name[MAX_STR_LEN] = ""; +void *http_check_log_handler = NULL; +void *error_log_handler = NULL; struct route_info { @@ -82,39 +86,38 @@ char *get_items_by_pos(char *buff, unsigned int numb) long get_pro_cpu_time(unsigned int pid) { FILE *fp = NULL; - char *vpos, buff[MAX_BUF_LEN] = ""; + char *vpos = NULL, buff[MAX_BUF_LEN] = ""; long utime, stime, cutime, cstime; sprintf(buff, "/proc/%d/stat", pid); - fp = fopen(buff, "r"); if(fp == NULL) { - printf("file open /proc/self/stat error!"); + MESA_handle_runtime_log(error_log_handler, RLOG_LV_FATAL, module_name, "open /proc/self/stat failed."); + printf("====line:%d,%s\n",__LINE__,"open /proc/self/stat failed."); return -1; } fgets(buff, sizeof(buff), fp); - vpos = get_items_by_pos(buff, CPU_START_POS); sscanf(vpos, "%ld %ld %ld %ld", &utime, &stime, &cutime, &cstime); //printf("get_data_process:%ld %ld %ld %ld\n", utime, stime, cutime, cstime); fclose(fp); return (utime + stime + cutime + cstime); - //return (utime + stime); } //获取整个系统的CPU时间 long get_sys_cpu_time(void) { FILE *fp; - char name[MAX_NAME_LEN] = "", buff[MAX_BUF_LEN] = ""; + char name[MAX_BUF_LEN] = "", buff[MAX_BUF_LEN] = ""; long user, nice, syst, idle; fp = fopen("/proc/stat", "r"); if(fp == NULL) { - printf("file open /proc/stat error!"); + MESA_handle_runtime_log(error_log_handler, RLOG_LV_FATAL, module_name, "open /proc/stat failed."); + printf("====line:%d,%s\n",__LINE__,"open /proc/stat failed."); return -1; } fgets(buff, sizeof(buff), fp); @@ -123,7 +126,6 @@ long get_sys_cpu_time(void) fclose(fp); return (user + nice + syst + idle); - //return (user + syst); } //获取进程的CPU使用率 @@ -163,7 +165,7 @@ int readNlSock(int sockFd, char *bufPtr, int seqNum, int pId) //收到内核的应答 if((readLen = recv(sockFd, bufPtr, BUFSIZE - msgLen, 0)) < 0) { - perror("SOCK READ: "); + printf("sock read error!"); return -1; } @@ -171,7 +173,7 @@ int readNlSock(int sockFd, char *bufPtr, int seqNum, int pId) //检查header是否有效 if((NLMSG_OK(nlHdr, readLen) == 0) || (nlHdr->nlmsg_type == NLMSG_ERROR)) { - perror("Error in recieved packet"); + printf("error in recieved packet!\n"); return -1; } @@ -195,19 +197,19 @@ int readNlSock(int sockFd, char *bufPtr, int seqNum, int pId) } //分析返回的路由信息 -void parseRoutes(struct nlmsghdr *nlHdr, struct route_info *rtInfo,char *gateway) +void parseRoutes(struct nlmsghdr *nlHdr, struct route_info *rtInfo,char *gateway,unsigned int len) { - struct rtmsg *rtMsg; - struct rtattr *rtAttr; - int rtLen; - struct in_addr dst; - struct in_addr gate; - unsigned char *bytes = NULL; + struct rtmsg *rtMsg = NULL; + struct rtattr *rtAttr = NULL; + int rtLen; + char dst_address[MAX_STR_LEN] = ""; rtMsg = (struct rtmsg *)NLMSG_DATA(nlHdr); // If the route is not for AF_INET or does not belong to main routing table //then return. - if((rtMsg->rtm_family != AF_INET) || (rtMsg->rtm_table != RT_TABLE_MAIN)) - return; + if((rtMsg->rtm_family != AF_INET) || (rtMsg->rtm_table != RT_TABLE_MAIN)) + { + return; + } rtAttr = (struct rtattr *)RTM_RTA(rtMsg); rtLen = RTM_PAYLOAD(nlHdr); @@ -217,48 +219,39 @@ void parseRoutes(struct nlmsghdr *nlHdr, struct route_info *rtInfo,char *gateway switch(rtAttr->rta_type) { case RTA_OIF: - if_indextoname(*(int *)RTA_DATA(rtAttr), rtInfo->ifName); - break; + if_indextoname(*(int *)RTA_DATA(rtAttr), rtInfo->ifName); + break; case RTA_GATEWAY: - rtInfo->gateWay = *(u_int *)RTA_DATA(rtAttr); - break; + rtInfo->gateWay = *(u_int *)RTA_DATA(rtAttr); + break; case RTA_PREFSRC: - rtInfo->srcAddr = *(u_int *)RTA_DATA(rtAttr); - break; + rtInfo->srcAddr = *(u_int *)RTA_DATA(rtAttr); + break; case RTA_DST: - rtInfo->dstAddr = *(u_int *)RTA_DATA(rtAttr); - break; + rtInfo->dstAddr = *(u_int *)RTA_DATA(rtAttr); + break; } - } - dst.s_addr = rtInfo->dstAddr; - //if (strstr((char *)inet_ntoa(dst), "0.0.0.0")) - if (dst.s_addr == 0) - { - //printf("oif:%s",rtInfo->ifName); - gate.s_addr = rtInfo->gateWay; - //sprintf(gateway, (char *)inet_ntoa(gate)); - bytes = (unsigned char *) &gate.s_addr; - sprintf(gateway, "%d.%d.%d.%d", bytes[0], bytes[1], bytes[2], bytes[3] ); - //printf("%s\n",gateway); - gate.s_addr = rtInfo->srcAddr; - //printf("src:%s\n",(char *)inet_ntoa(gate)); - gate.s_addr = rtInfo->dstAddr; - //printf("dst:%s\n",(char *)inet_ntoa(gate)); + } + inet_ntop(AF_INET, &rtInfo->dstAddr, dst_address, MAX_STR_LEN); + if (strstr(dst_address, "0.0.0.0")) + { + inet_ntop(AF_INET, &rtInfo->gateWay, gateway, len); + //printf("%s\n",gateway); } return; } -int get_gateway(char *gateway) +int get_gateway(char *gateway, unsigned int length)//传入长度 { - struct nlmsghdr *nlMsg; - struct route_info *rtInfo; - char msgBuf[BUFSIZE]; + struct nlmsghdr *nlMsg = NULL; + struct route_info *rtInfo = NULL; + char msgBuf[BUFSIZE] = ""; int sock, len, msgSeq = 0; if((sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE)) < 0) { - perror("Socket Creation: "); + printf("socket creation error!\n"); return -1; } @@ -272,25 +265,26 @@ int get_gateway(char *gateway) if(send(sock, nlMsg, nlMsg->nlmsg_len, 0) < 0) { - printf("Write To Socket Failed…\n"); - return -1; + printf("Write To Socket Failed…\n"); + goto OUT; } if((len = readNlSock(sock, msgBuf, msgSeq, getpid())) < 0) { printf("Read From Socket Failed…\n"); - return -1; + goto OUT; } rtInfo = (struct route_info *)malloc(sizeof(struct route_info)); for(;NLMSG_OK(nlMsg,len);nlMsg = NLMSG_NEXT(nlMsg,len)) { memset(rtInfo, 0, sizeof(struct route_info)); - parseRoutes(nlMsg, rtInfo,gateway); + parseRoutes(nlMsg, rtInfo,gateway, length); } - free(rtInfo); + free(rtInfo); + +OUT: close(sock); - return 0; } @@ -304,10 +298,12 @@ void http_handler_status_msg(struct evhttp_request *req,void *arg) unsigned int run_days,run_hour,run_minute,run_second; pid_t process_id; + memset(&info, 0, sizeof(struct sysinfo)); //启动时间,启动时长 if (sysinfo(&info)) { - printf("====line:%d,%s\n",__LINE__,"Failed to get sysinfo!"); + MESA_handle_runtime_log(error_log_handler, RLOG_LV_FATAL, module_name, "failed to get sysinfo."); + printf("====line:%d,%s\n",__LINE__,"failed to get sysinfo!"); return ; } time(&cur_time); @@ -329,15 +325,15 @@ void http_handler_status_msg(struct evhttp_request *req,void *arg) //默认网关地址 char default_gateway_tmp[MAX_STR_LEN]=""; - get_gateway(default_gateway_tmp); + get_gateway(default_gateway_tmp ,MAX_STR_LEN); //printf("gateway:%s\n",buff); //内存(虚存,实存) unsigned int n_rss, n_resident, n_share, n_text, n_lib, n_data, n_dt; - char mem_buf_tmp[MAX_STR_LEN]; - char boot_time_tmp[MAX_STR_LEN]; - char running_time_tmp[MAX_STR_LEN]; - char cpu_usage_tmp[MAX_STR_LEN]; + char mem_buf_tmp[MAX_STR_LEN] = ""; + char boot_time_tmp[MAX_STR_LEN] = ""; + char running_time_tmp[MAX_STR_LEN] = ""; + char cpu_usage_tmp[MAX_STR_LEN] = ""; FILE *fp = fopen("/proc/self/statm","r"); if(fp) @@ -347,7 +343,8 @@ void http_handler_status_msg(struct evhttp_request *req,void *arg) } else { - printf("====line:%d,%s\n",__LINE__,"open /proc/self/statm failed!"); + MESA_handle_runtime_log(error_log_handler, RLOG_LV_FATAL, module_name, "open /proc/self/statm failed."); + printf("====line:%d,%s\n",__LINE__,"open /proc/self/statm failed."); return; } n_rss = n_rss * (getpagesize()/1024); @@ -366,7 +363,8 @@ void http_handler_status_msg(struct evhttp_request *req,void *arg) retbuff = evbuffer_new(); if(retbuff == NULL) { - printf("====line:%d,%s\n",__LINE__,"retbuff is null."); + MESA_handle_runtime_log(error_log_handler, RLOG_LV_FATAL, module_name, "status evbuffer_new failed."); + printf("====line:%d,%s\n",__LINE__,"status evbuffer_new failed."); return; } sprintf(boot_time_tmp, "%d-%-d-%d %d:%d:%d", ptm->tm_year + 1900,ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec); @@ -375,7 +373,8 @@ void http_handler_status_msg(struct evhttp_request *req,void *arg) cJSON * root = cJSON_CreateObject(); if(!root) { - printf("====line:%d,%s\n",__LINE__,"cJSON_CreateObject error!"); + MESA_handle_runtime_log(error_log_handler, RLOG_LV_FATAL, module_name, "status cjson createObject error."); + printf("====line:%d,%s\n",__LINE__,"status cjson createObject error."); return; } //根节点下添加 @@ -387,7 +386,7 @@ void http_handler_status_msg(struct evhttp_request *req,void *arg) cJSON_AddItemToObject(root, "memory info", cJSON_CreateString(mem_buf_tmp)); cJSON_AddItemToObject(root, "cpu usage", cJSON_CreateString(cpu_usage_tmp)); printf("cjson_status_print:%s\n", cJSON_Print(root)); - + MESA_handle_runtime_log(http_check_log_handler, RLOG_LV_INFO, module_name, cJSON_Print(root)); //evbuffer_add_printf(retbuff,"System boot time: %d-%-d-%d %d:%d:%d\r\nsystem running time:%dday %dhour %dminute %dsecond\r\nprocess id:%d\r\ngateway:%s\r\nmemory info:%s\r\ncpu% = %f\r\n", // ptm->tm_year + 1900,ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, run_days,run_hour,run_minute,run_second,process_id,buff,buf,cpu_rate*cpu_num); evbuffer_add_printf(retbuff,cJSON_Print(root)); @@ -413,19 +412,21 @@ void http_handler_keepalive_msg(struct evhttp_request *req,void *arg) retbuff = evbuffer_new(); if(retbuff == NULL) { - printf("====line:%d,%s\n",__LINE__,"retbuff is null."); + MESA_handle_runtime_log(error_log_handler, RLOG_LV_FATAL, module_name, "keepalive evbuffer_new failed."); + printf("====line:%d,%s\n",__LINE__,"keepalive evbuffer_new failed."); return; } cJSON * root = cJSON_CreateObject(); if(!root) { - printf("====line:%d,%s\n",__LINE__,"cJSON_CreateObject error!"); + MESA_handle_runtime_log(error_log_handler, RLOG_LV_FATAL, module_name, "keepalive cjson_createobject error."); + printf("====line:%d,%s\n",__LINE__,"keepalice cjson_createobject error."); return; } cJSON_AddItemToObject(root, "current time", cJSON_CreateString(asctime(local))); printf("cjson_keepalive_print:%s\n", cJSON_Print(root)); - + MESA_handle_runtime_log(http_check_log_handler, RLOG_LV_INFO, module_name, cJSON_Print(root)); evbuffer_add_printf(retbuff,cJSON_Print(root)); evhttp_send_reply(req,HTTP_OK,"OK",retbuff); evbuffer_free(retbuff); @@ -437,33 +438,11 @@ void http_handler_keepalive_msg(struct evhttp_request *req,void *arg) return; } -void *pthread(void *arg) +void *http_check_dispatch(void *arg) { - struct evhttp *http_server = NULL; - //short http_port = 10000; - //char *http_addr = "0.0.0.0"; - - MESA_load_profile_int_def(http_check_conf_file, "HTTP", "SERVER_PORT", (int *)(&g_http_port), 0); - MESA_load_profile_string_def(http_check_conf_file, "HTTP", "SERVER_IP", g_http_address, MAX_STR_LEN, NULL); - printf("*v2*******read_ip:%s,read_port:%d\n",g_http_address, g_http_port); - //初始化 - event_init(); - //启动http服务端 - http_server = evhttp_start(g_http_address,g_http_port); - if(http_server == NULL) - { - printf("====line:%d,%s\n",__LINE__,"http server start failed."); - return NULL; - } - - //设置请求超时时间(s) - evhttp_set_timeout(http_server,HTTP_TIMEOUT); - //设置事件处理函数,针对每一个事件(请求)注册一个处理函数,为特定的URI指定callback - evhttp_set_cb(http_server,"/status",http_handler_status_msg,NULL); - evhttp_set_cb(http_server,"/keepalive",http_handler_keepalive_msg,NULL); //循环监听 event_dispatch(); - evhttp_free(http_server); + //evhttp_free(http_server); return NULL; } @@ -471,18 +450,63 @@ void *pthread(void *arg) int http_check_init() { pthread_t tidp; + struct evhttp *http_server = NULL; + int log_level = 30; - if ((pthread_create(&tidp, NULL, pthread, NULL)) == -1) - { - printf("====line:%d,%s\n",__LINE__,"http_check thread create error!"); - return 0; - } + MESA_load_profile_int_def(http_check_conf_file, "HTTP", "SERVER_PORT", (int *)(&g_http_port), 10000); + MESA_load_profile_string_def(http_check_conf_file, "HTTP", "SERVER_IP", g_http_address, MAX_STR_LEN, "0.0.0.0"); + MESA_load_profile_string_def(http_check_conf_file, "HTTP", "HTTP_CHECK_LOG_PATH", http_check_log_path, MAX_STR_LEN, ""); + MESA_load_profile_string_def(http_check_conf_file, "HTTP", "HTTP_CHECK_ERR_LOG_PATH", http_check_error_log_path, MAX_STR_LEN, ""); + MESA_load_profile_string_def(http_check_conf_file, "HTTP", "MODULE_NAME", module_name, MAX_STR_LEN, ""); + MESA_load_profile_int_def(http_check_conf_file, "HTTP", "LOG_LEVEL", &log_level, 30); + printf("*v12*******read_ip:%s,read_port:%d\n",g_http_address, g_http_port); + + http_check_log_handler = MESA_create_runtime_log_handle(http_check_log_path, RLOG_LV_INFO); + error_log_handler = MESA_create_runtime_log_handle(http_check_error_log_path, log_level); + if (http_check_log_handler == NULL || error_log_handler == NULL) + { + MESA_handle_runtime_log(error_log_handler, RLOG_LV_FATAL, module_name, "http check init error."); + printf("====line:%d,%s\n",__LINE__,"http check init error."); + return -1; + } + //初始化 + event_init(); + //启动http服务端 + http_server = evhttp_start(g_http_address,g_http_port); + if(http_server == NULL) + { + MESA_handle_runtime_log(error_log_handler, RLOG_LV_FATAL, module_name, "evhttp_start failed."); + printf("====line:%d,%s\n",__LINE__,"evhttp_start failed."); + return 0; + } + + //设置请求超时时间(s) + evhttp_set_timeout(http_server,HTTP_TIMEOUT); + //设置事件处理函数,针对每一个事件(请求)注册一个处理函数,为特定的URI指定callback + evhttp_set_cb(http_server,"/status",http_handler_status_msg,NULL); + evhttp_set_cb(http_server,"/keepalive",http_handler_keepalive_msg,NULL); + + if ((pthread_create(&tidp, NULL, http_check_dispatch, NULL)) == -1) + { + MESA_handle_runtime_log(error_log_handler, RLOG_LV_FATAL, module_name, "http_check_dispatch thread create failed."); + printf("====line:%d,%s\n",__LINE__,"http_check_dispatch thread create failed."); + return 0; + } return 0; } void http_check_destory() { + if (http_check_log_handler) + { + MESA_destroy_runtime_log_handle(http_check_log_handler); + } + if (error_log_handler) + { + MESA_destroy_runtime_log_handle(error_log_handler); + } + return; }