#include #include #include #include #include #include "MESA_prof_load.h" #include "MESA_handle_logger.h" #include "Maat_rule.h" #include "Maat_command.h" #include "ir_mctrl.h" #include "MESA_htable.h" struct mctrl_glocal_info mctrl_g; void s_d_start_cb(int update_type,void* u_para) { if(update_type==MAAT_RULE_UPDATE_TYPE_FULL) { MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_INFO,(char*)"maat_rule_type", "table_name:%d,Maat rule type is full",*(int*)u_para); switch(*(int*)u_para) { case DYNAMIC_NOMINEE_FLAG: mctrl_g.update_type_d=MAAT_RULE_UPDATE_TYPE_FULL; mctrl_g.version_d++; MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_INFO,(char*)"maat_rule_type", "table_name:%d,version:%d",*(int*)u_para,mctrl_g.version_d); break; case STATIC_NOMINEE_FLAG: mctrl_g.update_type_s=MAAT_RULE_UPDATE_TYPE_FULL; mctrl_g.version_s++; MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_INFO,(char*)"maat_rule_type", "table_name:%d,version:%d",*(int*)u_para,mctrl_g.version_s); break; case DNAT_POLICY_FLAG: mctrl_g.update_type_dp=MAAT_RULE_UPDATE_TYPE_FULL; mctrl_g.version_dp++; MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_INFO,(char*)"maat_rule_type", "table_name:%d,version:%d",*(int*)u_para,mctrl_g.version_dp); break; default: MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_INFO,(char*)"maat_start_cb", "maat_start_cb table name error!!!"); assert(0); break; } } else { MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_INFO,(char*)"maat_rule_type", "table_name:%d,Maat rule type is inc",*(int*)u_para); } return; } void n_i_c_start_cb(int update_type,void* u_para) { if(update_type==MAAT_RULE_UPDATE_TYPE_FULL) { MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_INFO,(char*)"maat_rule_type", "table_name:%d,Maat rule type is full",*(int*)u_para); } else { MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_INFO,(char*)"maat_rule_type", "table_name:%d,Maat rule type is inc",*(int*)u_para); } return; } 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 nom_info; memset(&nom_info,0,sizeof(nom_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%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", &nom_info.htable_flag,&nom_info.version,&nom_info.region_id,&nom_info.group_id,&nom_info.addr_type, nom_info.src_ip,nom_info.mask_src_ip,nom_info.src_port,nom_info.mask_src_port,nom_info.dst_ip,nom_info.mask_dst_ip, nom_info.dst_port,nom_info.mask_dst_port,&nom_info.procotol,&nom_info.direction,&nom_info.addr_pool_id,&nom_info.is_valid, &nom_info.action,&nom_info.service,nom_info.user_region,nom_info.effective_range,nom_info.op_time); mctrl_get_cur_time(nom_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,nom_info.addr_pool_id,nom_info.addr_type,nom_info.src_ip,nom_info.is_valid,nom_info.effective_range,nom_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,nom_info.group_id,nom_info.addr_type, nom_info.src_ip,nom_info.mask_src_ip,nom_info.src_port,nom_info.mask_src_port,nom_info.dst_ip,nom_info.mask_dst_ip, nom_info.dst_port,nom_info.mask_dst_port,nom_info.procotol,nom_info.direction, nom_info.is_valid,nom_info.action,nom_info.service,nom_info.user_region,nom_info.effective_range,nom_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 redis line error",ir_table_name); } else { MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"SET_LINE","%s:set redis line success",ir_table_name); } 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,NOMINEE_TABLE_NAME,strlen(NOMINEE_TABLE_NAME))) { line_rule.expire_after=0; p_line=&line_rule; ret=Maat_cmd_set_line(feather, p_line, MAAT_OP_DEL); } else { line_rule.expire_after=TIME_OUT; p_line=&line_rule; ret=Maat_cmd_set_line(feather, p_line, MAAT_OP_RENEW_TIMEOUT); } MESA_handle_runtime_log(mctrl_g.logger_handle,RLOG_LV_FATAL, (char*)"maat_update", "del_table_name:%s del_table_line:%s",ir_table_name,table_line); if(ret==-1) { MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"DEL_LINE","%s:del redis line error",ir_table_name); } else { MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_FATAL, (char*)"DEL_LINE","%s:del redis line success",ir_table_name); } return ret; } long del_update_search_htable_cb(void *data, const uchar *key, uint size, void *user_arg) { int htable_flag=0; char *htable_data=(char*)data; if(htable_data!=NULL) { sscanf(htable_data,"%d\t",&htable_flag); } return htable_flag; } long set_update_search_htable_cb(void *data, const uchar *key, uint size, void *user_arg) { struct IR_MCTRL_INFO nom_info; char *htable_data=(char*)data; if(htable_data!=NULL) { sscanf(htable_data,"%d\t%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", &nom_info.htable_flag,&nom_info.version,&nom_info.region_id,&nom_info.group_id,&nom_info.addr_type, nom_info.src_ip,nom_info.mask_src_ip,nom_info.src_port,nom_info.mask_src_port,nom_info.dst_ip,nom_info.mask_dst_ip, nom_info.dst_port,nom_info.mask_dst_port,&nom_info.procotol,&nom_info.direction,&nom_info.addr_pool_id,&nom_info.is_valid, &nom_info.action,&nom_info.service,nom_info.user_region,nom_info.effective_range,nom_info.op_time); if(nom_info.htable_flag & DYNAMIC_NOMINEE_FLAG) { nom_info.version=mctrl_g.version_d; MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"set_update_search_htable_cb","get htable flag:%d! version:%d!",nom_info.htable_flag,nom_info.version); } else if(nom_info.htable_flag & STATIC_NOMINEE_FLAG) { nom_info.version=mctrl_g.version_s; MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"set_update_search_htable_cb","get htable flag:%d! version:%d!",nom_info.htable_flag,nom_info.version); } else if(nom_info.htable_flag & DNAT_POLICY_FLAG) { nom_info.version=mctrl_g.version_dp; MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"set_update_search_htable_cb","get htable flag:%d! version:%d!",nom_info.htable_flag,nom_info.version); } else { MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"set_update_search_htable_cb","get htable flag:%d!",nom_info.htable_flag); } snprintf(htable_data,HTABLE_DATA_LEN, "%d\t%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", nom_info.htable_flag,nom_info.version,nom_info.region_id,nom_info.group_id,nom_info.addr_type, nom_info.src_ip,nom_info.mask_src_ip,nom_info.src_port,nom_info.mask_src_port,nom_info.dst_ip,nom_info.mask_dst_ip, nom_info.dst_port,nom_info.mask_dst_port,nom_info.procotol,nom_info.direction,nom_info.addr_pool_id,nom_info.is_valid, nom_info.action,nom_info.service,nom_info.user_region,nom_info.effective_range,nom_info.op_time); } else { MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_INFO, (char*)"set_update_search_htable_cb","htable info not exist!,set error!!!"); assert(0); } return nom_info.htable_flag; } long n_i_c_update_search_htable_cb(void *data, const uchar *key, uint size, void *user_arg) { int htable_flag=0; struct IR_MCTRL_INFO nom_info; char *htable_data=(char*)data; if(htable_data==NULL) { return htable_flag; } sscanf((char*)data, "%d\t%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,&nom_info.version,&nom_info.region_id,&nom_info.group_id,&nom_info.addr_type, nom_info.src_ip,nom_info.mask_src_ip,nom_info.src_port,nom_info.mask_src_port,nom_info.dst_ip,nom_info.mask_dst_ip, nom_info.dst_port,nom_info.mask_dst_port,&nom_info.procotol,&nom_info.direction,&nom_info.addr_pool_id,&nom_info.is_valid, &nom_info.action,&nom_info.service,nom_info.user_region,nom_info.effective_range,nom_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_DEBUG, (char*)"n_i_c_update_search_htable_cb","htable flag is:%d",htable_flag); break; } snprintf(htable_data,HTABLE_DATA_LEN, "%d\t%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,nom_info.version,nom_info.region_id,nom_info.group_id,nom_info.addr_type, nom_info.src_ip,nom_info.mask_src_ip,nom_info.src_port,nom_info.mask_src_port,nom_info.dst_ip,nom_info.mask_dst_ip, nom_info.dst_port,nom_info.mask_dst_port,nom_info.procotol,nom_info.direction,nom_info.addr_pool_id,nom_info.is_valid, nom_info.action,nom_info.service,nom_info.user_region,nom_info.effective_range,nom_info.op_time); MESA_handle_runtime_log(mctrl_g.logger_handle, RLOG_LV_DEBUG, (char*)"n_i_c_update_search_htable_cb","htable flag change:%d",htable_flag); return htable_flag; } void del_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; } void n_i_c_table_update_cb(int table_id,const char* table_line,void* u_para) { int rule_id=0; void *htable_data=NULL; int is_valid=-1; long search_ret=0; switch(*(int*)u_para) { case NOMINEE_FLAG: sscanf(table_line,"%d\t%*d\t%*d\t%*s\t%d",&rule_id,&is_valid); if(rule_id