#include "Maat_rule.h" #include "stream_fuzzy_hash.h" #include "Maat_command.h" #include #include #include #include //inet_addr #include //inet_addr #include //inet_addr #include #include //fstat #include #include #include #include #include //fstat #include //fstat #include #include const char* test_maat_redis_ip="127.0.0.1"; unsigned short test_maat_redis_port=6379; const char* json_path="./maat_json.json"; const char* ful_cfg_dir="./rule/full/index/"; const char* inc_cfg_dir="./rule/inc/index/"; #define WAIT_FOR_EFFECTIVE_US 1000*1000 extern int my_scandir(const char *dir, struct dirent ***namelist, int(*filter)(const struct dirent *), int(*compar)(const void *, const void *)); void Maat_read_entry_start_cb(int update_type,void* u_para) { return; } void Maat_read_entry_cb(int table_id,const char* table_line,void* u_para) { char ip_str[16]={0}; int entry_id=-1,seq=-1; unsigned int ip_uint=0; int is_valid=0; unsigned int local_ip_nr=16820416;//192.168.0.1 sscanf(table_line,"%d\t%s\t%d\t%d",&seq,ip_str,&entry_id,&is_valid); inet_pton(AF_INET,ip_str,&ip_uint); if(local_ip_nr==ip_uint) { if(is_valid==1) { printf("Load entry id %d success.\n",entry_id); } else { printf("Offload entry id %d success.\n",entry_id); } } return; } void Maat_read_entry_finish_cb(void* u_para) { Maat_feather_t feather=u_para; long long version=0; int ret=0,is_last_updating_table=0; ret=Maat_read_state(feather,MAAT_STATE_VERSION, &version, sizeof(version)); assert(ret==0); ret=Maat_read_state(feather,MAAT_STATE_LAST_UPDATING_TABLE, &is_last_updating_table, sizeof(is_last_updating_table)); assert(ret==0); //printf("Maat Version %lld at plugin finish callback, is_last_update=%d.\n",version,is_last_updating_table); return; } void print_maat_ret(int ret) { switch(ret) { case -1: printf("scan error.\n"); break; case -2: printf("hit current region,but not hit compile rule.\n"); break; case 0: printf("nothing hit\n"); break; default://>0 printf("hit %d rules\n",ret); break; } return; } const char* print_maat_result(struct Maat_rule_t* result,int ret) { static char buff[1024]={0}; int i=0,j=0; switch(ret) { case -1: snprintf(buff,sizeof(buff),"ret=%d,scan error.",ret); break; case -2: snprintf(buff,sizeof(buff),"ret=%d,hit current region,but not hit compile rule.",ret); break; case 0: snprintf(buff,sizeof(buff),"ret=0,nothing hit."); break; default://>0 j=snprintf(buff,sizeof(buff),"hit %d rules, hit ruleid=",ret); for(i=0;i0) { printf("Digest Scan:%s\n",print_maat_result(result,ret)); } } fclose(fp); } else { printf("fopen %s error.\n",file_name); } Maat_stream_scan_string_end(&sp); return ret; } int test_plugin_table(Maat_feather_t feather,const char* table_name, Maat_start_callback_t *start,Maat_update_callback_t *update,Maat_finish_callback_t *finish, void *u_para, void* logger) { int table_id=0,ret=0; table_id=Maat_table_register(feather,table_name); if(table_id==-1) { printf("Database table %s register failed.\n",table_name); } else { ret=Maat_table_callback_register(feather, table_id, start, update, finish, u_para); if(ret<0) { printf("Maat callback register table %s error.\n",table_name); } } return ret; } int test_url_encode(Maat_feather_t feather,const char* table_name,scan_status_t* mid) { const char* url_utf8="www.google.com/?q=C%23%E4%B8%AD%E5%9B%BD"; const char* url_gb2312="www.baidu.com/?wd=C%23%D6%D0%B9%FA"; int table_id=0,ret=0; struct Maat_rule_t result[4]; int found_pos[4]; table_id=Maat_table_register(feather,table_name); if(table_id==-1) { printf("Database table %s register failed.",table_name); return -1; } ret=Maat_full_scan_string(feather, table_id,CHARSET_GBK, url_utf8, strlen(url_utf8), result,found_pos, 4, mid, 0); printf("URL encode scan utf8 url: %s\n",print_maat_result(result,ret)); ret=Maat_full_scan_string(feather, table_id,CHARSET_GBK, url_gb2312, strlen(url_gb2312), result,found_pos, 4, mid, 0); printf("URL encode scan gb2312 url: %s\n",print_maat_result(result,ret)); return 0; } int test_unicode_esc(Maat_feather_t feather,const char* table_name,scan_status_t* mid) { const char* test_data_dir="./testdata_uni2ascii"; struct dirent **namelist; FILE* fp=NULL; char file_path[256]={0}; char buff[4096]; size_t read_len=0; int table_id=0,ret=0; struct Maat_rule_t result[4]; stream_para_t sp=NULL; int found_pos[4]; int n=0,i=0; table_id=Maat_table_register(feather,table_name); if(table_id==-1) { printf("Database table %s register failed in function %s.\n",table_name,__FUNCTION__); return -1; } n = my_scandir(test_data_dir, &namelist, NULL, (int (*)(const void*, const void*))alphasort); if(n<0) { printf("%s open dir %s error.\n",__FUNCTION__,test_data_dir); return -1; } for(i=0;id_name, ".") == 0) || (strcmp(namelist[i]->d_name, "..") == 0)) { continue; } snprintf(file_path,sizeof(file_path),"%s/%s",test_data_dir,namelist[i]->d_name); fp=fopen(file_path,"rb"); if(fp==NULL) { printf("fopen %s error.\n",file_path);; continue; } printf("%s processing %s\n",__FUNCTION__,file_path); sp=Maat_stream_scan_string_start(feather,table_id,0); if(sp==NULL) { printf("stream scan start failed.\n"); continue; } read_len=fread(buff,1,sizeof(buff),fp); while(read_len>0) { ret=Maat_stream_scan_string(&sp,CHARSET_NONE,buff,read_len ,result,found_pos,4,mid); read_len=fread(buff,1,sizeof(buff),fp); if(ret>0) { printf("UNI2ASCII file %s,%s\n",file_path,print_maat_result(result,ret)); } } Maat_stream_scan_string_end(&sp); fclose(fp); } for(i=0;i0) { printf("Should not hit without setting district.\n"); return -1; } ret=Maat_set_scan_status(feather, mid, MAAT_SET_SCAN_DISTRICT,region_name,strlen(region_name)); if(ret<0) { printf("set MAAT_SET_SCAN_DISTRICT failed.\n"); return -1; } ret=Maat_full_scan_string(feather, table_id,CHARSET_GBK, scan_data, strlen(scan_data), result,found_pos, 4, mid, 0); if(ret>0) { printf("Hit expr_plus rule %d.\n",result[0].config_id); } else { printf("Test expr_plus failed.\n"); } return ret; } int test_string_similar_scan(Maat_feather_t feather,const char* table_name,scan_status_t* mid) { int ret=0; int table_id=0; struct Maat_rule_t result[4]; const char* scan_data="mwss.xiu.youku.com/live/hls/v1/0000000000000000000000001526a0a8/714.ts?&token=98765"; table_id=Maat_table_register(feather,table_name); if(table_id==-1) { printf("Database table %s register failed.\n",table_name); return -1; } ret=Maat_similar_scan_string(feather, table_id, scan_data, strlen(scan_data), result, 4, mid, 0); printf("Similar String Scan:%s\n",print_maat_result(result,ret)); return ret; } int test_offset_str_scan_with_chunk(Maat_feather_t feather,const char* table_name,int chunk_size) { int table_id=0,ret=0; int read_size=0,pass_flag=0; struct Maat_rule_t result[4]; scan_status_t mid=NULL; //const char* fn="./testdata/mesa_logo.jpg"; const char* fn="./testdata/mesa_logo.jpg"; FILE*fp=fopen(fn,"r"); if(fp==NULL) { printf("%s open %s failed.\n",__FUNCTION__, fn); return -1; } char scan_data[chunk_size]; table_id=Maat_table_register(feather,table_name); if(table_id==-1) { printf("Database table %s register failed.\n",table_name); return -1; } struct Maat_hit_detail_t *hit_detail=(struct Maat_hit_detail_t *)malloc(sizeof(struct Maat_hit_detail_t)*10); stream_para_t sp=Maat_stream_scan_string_start(feather,table_id,0); int detail_ret=0; if(sp==NULL) { printf("stream scan start failed.\n"); return -1; } while(0==feof(fp)) { read_size=fread(scan_data,1,sizeof(scan_data),fp); ret=Maat_stream_scan_string_detail(&sp,CHARSET_NONE,scan_data,read_size ,result,4,hit_detail,10 ,&detail_ret,&mid); if(ret>0) { printf("Test offset string Scan chunk=%d Success. String Scan:%s\n",chunk_size,print_maat_result(result,ret)); pass_flag=1; break; } } Maat_stream_scan_string_end(&sp); free(hit_detail); fclose(fp); if(!pass_flag) { printf("Test offset string Scan Failed.\n"); } Maat_clean_status(&mid); return ret; } void test_offset_str_scan(Maat_feather_t feather,const char* table_name) { test_offset_str_scan_with_chunk(feather,table_name,64); test_offset_str_scan_with_chunk(feather,table_name,1460); return; } int test_table_conjunction(Maat_feather_t feather,const char* table_name,const char* conj_table_name,scan_status_t* mid) { int ret=0; int table_id=0,conj_table_id=0; struct Maat_rule_t result[4]; int found_pos[4]; const char* scan_data="soq is using table conjunction function.http://www.3300av.com/novel/27122.txt"; table_id=Maat_table_register(feather,table_name); if(table_id==-1) { printf("Database table %s register failed.\n",table_name); return -1; } conj_table_id=Maat_table_register(feather,conj_table_name); assert(conj_table_id==table_id); ret=Maat_full_scan_string(feather, conj_table_id,CHARSET_GBK, scan_data, strlen(scan_data), result,found_pos, 4, mid, 0); if(ret>=2) { printf("Table conjunction success %s\n",print_maat_result(result,ret)); } return 0; } #define TEST_CMD_LINE_NUM 4 void test_set_cmd_line(Maat_feather_t feather) { const struct Maat_line_t *p_line[TEST_CMD_LINE_NUM]; struct Maat_line_t line_rule[TEST_CMD_LINE_NUM]; char table_line[TEST_CMD_LINE_NUM][128]; int ret=0,i=0; memset(&line_rule,0,sizeof(line_rule)); for(i=0;i