#include #include #include #include #include #include "MESA_prof_load.h" #include "MESA_handle_logger.h" #include "Maat_rule.h" #include "Maat_command.h" #include "mctrl.h" #include "MESA_htable.h" struct mctrl_glocal_info mctrl_g; void mctrl_get_cur_time(char *date) { time_t t; struct tm *lt; time(&t); lt = localtime(&t); snprintf(date, MAX_TIME_LEN,"%d/%d/%d/%d:%d:%d",lt->tm_year+1900, lt->tm_mon+1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec); } int set_ir_line(Maat_feather_t feather,const char *ir_table_name,const char *table_line,int rule_id) { const struct Maat_line_t *p_line; struct Maat_line_t line_rule; int ret = 0; char m_table_line[HTABLE_DATA_LEN]; struct IR_MCTRL_INFO mctrl_info; memset(&mctrl_info,0,sizeof(mctrl_info)); memset(&line_rule, 0,sizeof(line_rule)); line_rule.label_id=0; line_rule.rule_id=rule_id; line_rule.table_name=ir_table_name; sscanf(table_line, "%d\t%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%s\t%s\t%s", &mctrl_info.htable_flag,&mctrl_info.region_id,&mctrl_info.group_id,&mctrl_info.addr_type, mctrl_info.src_ip,mctrl_info.mask_src_ip,mctrl_info.src_port,mctrl_info.mask_src_port,mctrl_info.dst_ip,mctrl_info.mask_dst_ip, mctrl_info.dst_port,mctrl_info.mask_dst_port,&mctrl_info.procotol,&mctrl_info.direction,&mctrl_info.addr_pool_id,&mctrl_info.is_valid, &mctrl_info.action,&mctrl_info.service,mctrl_info.user_region,mctrl_info.effective_range,mctrl_info.op_time); mctrl_get_cur_time(mctrl_info.op_time); if(!memcmp(ir_table_name,NOMINEE_TABLE_NAME,strlen(NOMINEE_TABLE_NAME))) { snprintf(m_table_line,sizeof(m_table_line),"%d\t%d\t%d\t%s\t%d\t%s\t%s", rule_id,mctrl_info.addr_pool_id,mctrl_info.addr_type,mctrl_info.src_ip,mctrl_info.is_valid,mctrl_info.effective_range,mctrl_info.op_time); } else { snprintf(m_table_line,sizeof(m_table_line),"%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%s\t%s\t%s", rule_id,mctrl_info.group_id,mctrl_info.addr_type, mctrl_info.src_ip,mctrl_info.mask_src_ip,mctrl_info.src_port,mctrl_info.mask_src_port,mctrl_info.dst_ip,mctrl_info.mask_dst_ip, mctrl_info.dst_port,mctrl_info.mask_dst_port,mctrl_info.procotol,mctrl_info.direction, mctrl_info.is_valid,mctrl_info.action,mctrl_info.service,mctrl_info.user_region,mctrl_info.effective_range,mctrl_info.op_time); } line_rule.table_line=m_table_line; line_rule.expire_after=0; p_line=&line_rule; ret=Maat_cmd_set_line(feather, p_line, MAAT_OP_ADD); MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_FATAL, (char*)"maat_update", "set_table_name:%s set_table_line:%s",ir_table_name,m_table_line); if(ret==-1) { MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"SET_LINE","%s:set rule_id is %d redis line error",ir_table_name,rule_id); } else { MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"SET_LINE","%s:set rule_id is %d redis line success",ir_table_name,rule_id); } return ret; } int del_ir_line(Maat_feather_t feather,const char *ir_table_name,const char *table_line,int rule_id) { int ret=0; const struct Maat_line_t *p_line; struct Maat_line_t line_rule; memset(&line_rule,0,sizeof(line_rule)); line_rule.label_id=0; line_rule.rule_id=rule_id; line_rule.table_name=ir_table_name; line_rule.table_line=NULL; if(!memcmp(ir_table_name,INTERCEPT_TABLE_NAME,strlen(NOMINEE_TABLE_NAME))) { line_rule.expire_after=TIME_OUT; p_line=&line_rule; ret=Maat_cmd_set_line(feather, p_line, MAAT_OP_RENEW_TIMEOUT); } else { line_rule.expire_after=0; p_line=&line_rule; ret=Maat_cmd_set_line(feather, p_line, MAAT_OP_DEL); } MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_DEBUG, (char*)"maat_update", "del_table_name:%s del_rule_id is:%d table_line:%s",ir_table_name,rule_id,table_line); if(ret==-1) { MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"DEL_LINE","%s:del rule_id is %d redis line error",ir_table_name,rule_id); } else { MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"DEL_LINE","%s:del rule_id is %d redis line success",ir_table_name,rule_id); } return ret; } void set_ir_redis_info(int flag,const char* table_line,int rule_id) { if((!(flag & INTERCEPT_FLAG))&&((flag & STATIC_NOMINEE_FLAG)||(flag & DYNAMIC_NOMINEE_FLAG)||(flag & DNAT_POLICY_FLAG))) { set_ir_line(mctrl_g.i_feather, (char*)INTERCEPT_TABLE_NAME,table_line,rule_id); } if((!(flag & NOMINEE_FLAG))&&((flag & STATIC_NOMINEE_FLAG)||(flag & DYNAMIC_NOMINEE_FLAG))) { set_ir_line(mctrl_g.n_feather,(char*)NOMINEE_TABLE_NAME,table_line,rule_id); } return; } void del_ir_redis_info(int flag,const char* table_line,int rule_id) { if(flag & INTERCEPT_FLAG) { del_ir_line(mctrl_g.i_feather,(char*)INTERCEPT_TABLE_NAME,table_line,rule_id); } if(flag & NOMINEE_FLAG) { del_ir_line(mctrl_g.n_feather,(char*)NOMINEE_TABLE_NAME,table_line,rule_id); } if(flag & CANDIDATE_FLAG) { del_ir_line(mctrl_g.n_feather,(char*)CANDIDATE_TABLE_NAME,table_line,rule_id); } return; } long new_update_search_htable_cb(void *data, const uchar *key, uint size, void *user_arg) { int rule_id=0; int htable_flag=*(int*)user_arg; char *htable_data=(char*)data; if(htable_data!=NULL) { sscanf(htable_data,"%d\t%d",&htable_flag,&rule_id); set_ir_redis_info(htable_flag,htable_data,rule_id); } return htable_flag; } long free_update_search_htable_cb(void *data, const uchar *key, uint size, void *user_arg) { int rule_id=0; int htable_flag=0; char *htable_data=(char*)data; if(htable_data!=NULL) { sscanf(htable_data,"%d\t%d",&htable_flag,&rule_id); del_ir_redis_info(htable_flag,htable_data,rule_id); } return htable_flag; } void htable_data_free(void *data) { if(data!=NULL) { int rule_id=0; sscanf((char*)data,"%*d\t%d",&rule_id); MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_INFO, (char*)"htable_data_free","rule_id is:%d",rule_id); free(data); data=NULL; } return; } void static_dynamic_dpolicy_table_new_cb(int table_id, const char* key, const char* table_line, MAAT_PLUGIN_EX_DATA* ad, long argl, void *argp) { struct IR_MCTRL_INFO mctrl_info; memset(&mctrl_info,0,sizeof(mctrl_info)); char *htable_data=NULL; void *search_result=NULL; int *add_data=NULL; int add_ret=0; long cb_ret=0; switch(table_id) { case DYNAMIC_NOMINEE_ID: mctrl_info.addr_pool_id=0; memcpy(mctrl_info.src_port,"0",sizeof("0")); memcpy(mctrl_info.mask_src_ip,"0.0.0.0",sizeof("0.0.0.0")); memcpy(mctrl_info.mask_src_port,"0",sizeof("0")); memcpy(mctrl_info.dst_ip,"0.0.0.0",sizeof("0.0.0.0")); memcpy(mctrl_info.mask_dst_ip,"0.0.0.0",sizeof("0.0.0.0")); memcpy(mctrl_info.dst_port,"0",sizeof("0")); memcpy(mctrl_info.mask_dst_port,"0",sizeof("0")); memcpy(mctrl_info.effective_range,"{}",sizeof("{}")); mctrl_info.action=96; mctrl_info.service=832; mctrl_info.htable_flag=DYNAMIC_NOMINEE_FLAG; sscanf(table_line,"%d\t%d\t%d\t%s\t%*s\t%d\t%s\t%*d\t%d\t%d\t%*d\t%*s\t%*s", &mctrl_info.region_id,&mctrl_info.addr_type,&mctrl_info.procotol,mctrl_info.src_ip, &mctrl_info.direction,mctrl_info.user_region,&mctrl_info.is_valid,&mctrl_info.service); mctrl_info.region_id=(mctrl_info.region_id%SNAT_DYNAMIC_NUMBER)+SNAT_DYNAMIC_NUMBER; mctrl_info.group_id=mctrl_info.region_id; break; case STATIC_NOMINEE_ID: memcpy(mctrl_info.user_region,"0",sizeof("0")); memcpy(mctrl_info.effective_range,"{}",sizeof("{}")); mctrl_info.service=832; mctrl_info.htable_flag=STATIC_NOMINEE_FLAG; sscanf(table_line,"%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%*d\t%*s\t%*s", &mctrl_info.region_id,&mctrl_info.group_id,&mctrl_info.addr_type, mctrl_info.src_ip,mctrl_info.mask_src_ip,mctrl_info.src_port,mctrl_info.mask_src_port,mctrl_info.dst_ip,mctrl_info.mask_dst_ip, mctrl_info.dst_port,mctrl_info.mask_dst_port,&mctrl_info.procotol,&mctrl_info.direction,&mctrl_info.addr_pool_id,&mctrl_info.is_valid, &mctrl_info.action); mctrl_info.region_id=(mctrl_info.region_id%DNAT_NUMBER)+DNAT_NUMBER; break; case DNAT_POLICY_ID: memcpy(mctrl_info.src_ip,"0.0.0.0",sizeof("0.0.0.0")); memcpy(mctrl_info.src_port,"0",sizeof("0")); memcpy(mctrl_info.mask_src_ip,"0.0.0.0",sizeof("0.0.0.0")); memcpy(mctrl_info.mask_src_port,"0",sizeof("0")); memcpy(mctrl_info.mask_dst_ip,"0.0.0.0",sizeof("0.0.0.0")); memcpy(mctrl_info.mask_dst_port,"0",sizeof("0")); memcpy(mctrl_info.user_region,"0",sizeof("0")); memcpy(mctrl_info.effective_range,"{}",sizeof("{}")); mctrl_info.direction=0; mctrl_info.action=96; mctrl_info.service=832; mctrl_info.htable_flag=DNAT_POLICY_FLAG; sscanf(table_line,"%d\t%d\t%s\t%s\t%d\t%*s\t%*s\t%*s\t%d\t%*d\t%*d\t%d\t%*s\t%*s", &mctrl_info.region_id,&mctrl_info.addr_type,mctrl_info.dst_ip,mctrl_info.dst_port,&mctrl_info.procotol, &mctrl_info.do_log,&mctrl_info.is_valid); mctrl_info.group_id=mctrl_info.region_id; mctrl_info.region_id=mctrl_info.region_id%DNAT_NUMBER; break; default: MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"static_dynamic_dpolicy_table_new_cb","read_snat_or_dnat table flag error!!"); assert(0); break; } search_result=MESA_htable_search_cb(mctrl_g.mctrl_htable_handle,(unsigned char*)&mctrl_info.region_id,sizeof(int),new_update_search_htable_cb,argp,&cb_ret); if(search_result==NULL) { htable_data=(char*)malloc(HTABLE_DATA_LEN); if(htable_data==NULL) { MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"static_dynamic_dpolicy_table_new_cb","malloc htable_data error!!"); exit(1); } snprintf(htable_data,HTABLE_DATA_LEN,"%d\t%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%s\t%s\t%s", mctrl_info.htable_flag,mctrl_info.region_id,mctrl_info.group_id,mctrl_info.addr_type, mctrl_info.src_ip,mctrl_info.mask_src_ip,mctrl_info.src_port,mctrl_info.mask_src_port,mctrl_info.dst_ip,mctrl_info.mask_dst_ip, mctrl_info.dst_port,mctrl_info.mask_dst_port,mctrl_info.procotol,mctrl_info.direction,mctrl_info.addr_pool_id,mctrl_info.is_valid, mctrl_info.action,mctrl_info.service,mctrl_info.user_region,mctrl_info.effective_range,mctrl_info.op_time); add_ret=MESA_htable_add(mctrl_g.mctrl_htable_handle,(unsigned char*)&mctrl_info.region_id,sizeof(int),htable_data); if(add_ret<0) { MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"static_dynamic_dpolicy_table_new_cb","add htable error:%d",add_ret); assert(0); } else { MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"static_dynamic_dpolicy_table_new_cb","add htable succeed:%d",add_ret); } set_ir_redis_info(cb_ret,htable_data,mctrl_info.region_id); add_data=(int*)calloc(sizeof(int),1); if(add_data==NULL) { MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"static_dynamic_dpolicy_table_new_cb","malloc add_data error!!"); exit(1); } *add_data=mctrl_info.region_id; *ad=add_data; } else { MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_INFO, (char*)"static_dynamic_dpolicy_table_new_cb","htable_info exit! rule_id is:%d",mctrl_info.region_id); } return; } void static_dynamic_dpolicy_table_free_cb(int table_id, MAAT_PLUGIN_EX_DATA* ad, long argl, void *argp) { void* search_result=NULL; int del_ret=0; long cb_ret=0; search_result=MESA_htable_search_cb(mctrl_g.mctrl_htable_handle,(unsigned char*)*ad,sizeof(int),free_update_search_htable_cb,NULL,&cb_ret); if(search_result==NULL) { MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_FATAL, (char*)"static_dynamic_dpolicy_table_free_cb", "already del!!!"); } else { del_ret=MESA_htable_del(mctrl_g.mctrl_htable_handle,(unsigned char*)*ad,sizeof(int),htable_data_free); if(del_ret<0) { MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"static_dynamic_dpolicy_table_free_cb","del htable error:%d",del_ret); assert(0); } } if(*ad!=NULL) { free(*ad); } *ad=NULL; return; } long nominee_intercept_candidate_search_htable_cb(void *data, const uchar *key, uint size, void *user_arg) { int htable_flag=0; struct IR_MCTRL_INFO mctrl_info; memset(&mctrl_info,0,sizeof(mctrl_info)); char *htable_data=(char*)data; if(htable_data==NULL) { return htable_flag; } sscanf(htable_data, "%d\t%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%s\t%s\t%s", &htable_flag,&mctrl_info.region_id,&mctrl_info.group_id,&mctrl_info.addr_type, mctrl_info.src_ip,mctrl_info.mask_src_ip,mctrl_info.src_port,mctrl_info.mask_src_port,mctrl_info.dst_ip,mctrl_info.mask_dst_ip, mctrl_info.dst_port,mctrl_info.mask_dst_port,&mctrl_info.procotol,&mctrl_info.direction,&mctrl_info.addr_pool_id,&mctrl_info.is_valid, &mctrl_info.action,&mctrl_info.service,mctrl_info.user_region,mctrl_info.effective_range,mctrl_info.op_time); switch(*(int*)user_arg) { case INTERCEPT_FLAG: if(!(htable_flag & INTERCEPT_FLAG)) { htable_flag+=INTERCEPT_FLAG; } break; case NOMINEE_FLAG: if(!(htable_flag & NOMINEE_FLAG)) { htable_flag+=NOMINEE_FLAG; } break; case CANDIDATE_FLAG: if(!(htable_flag & CANDIDATE_FLAG)) { htable_flag+=CANDIDATE_FLAG; } break; default: MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"nominee_intercept_candidate_search_htable_cb","read nom_intercept_candidate_table error!!!"); assert(0); break; } snprintf(htable_data,HTABLE_DATA_LEN, "%d\t%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%s\t%s\t%s", htable_flag,mctrl_info.region_id,mctrl_info.group_id,mctrl_info.addr_type, mctrl_info.src_ip,mctrl_info.mask_src_ip,mctrl_info.src_port,mctrl_info.mask_src_port,mctrl_info.dst_ip,mctrl_info.mask_dst_ip, mctrl_info.dst_port,mctrl_info.mask_dst_port,mctrl_info.procotol,mctrl_info.direction,mctrl_info.addr_pool_id,mctrl_info.is_valid, mctrl_info.action,mctrl_info.service,mctrl_info.user_region,mctrl_info.effective_range,mctrl_info.op_time); MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"nominee_intercept_candidate_search_htable_cb","table_flag is:%d ,Data rule id is:%d htable flag is:%d",*(int*)user_arg,mctrl_info.region_id, htable_flag); return htable_flag; } void nominee_intercept_candidate_table_new_cb(int table_id, const char* key, const char* table_line, MAAT_PLUGIN_EX_DATA* ad, long argl, void *argp) { long search_ret=0; void* search_htable_result=NULL; int rule_id=0; int *add_data=NULL; sscanf(table_line,"%d\t",&rule_id); if(*(int*)argp==NOMINEE_FLAG&&rule_id