编译表和回调表支持配置生效标签。

This commit is contained in:
zhengchao
2018-09-21 21:32:09 +08:00
parent 4eb58f5369
commit 9dd63f3dec
10 changed files with 409 additions and 60 deletions

View File

@@ -6,7 +6,7 @@
* to reside in the heart) of the departed would reach the paradise of afterlife * to reside in the heart) of the departed would reach the paradise of afterlife
* successfully. * successfully.
* Author: zhengchao@iie.ac.cn,MESA * Author: zhengchao@iie.ac.cn,MESA
* Version 2018-07-27 huge service_define * Version 2018-09-21 rule tags
* NOTE: MUST compile with G++ * NOTE: MUST compile with G++
* All right reserved by Institute of Infomation Engineering,Chinese Academic of Science 2014~2018 * All right reserved by Institute of Infomation Engineering,Chinese Academic of Science 2014~2018
********************************************************* *********************************************************
@@ -156,7 +156,8 @@ enum MAAT_INIT_OPT
MAAT_OPT_CUMULATIVE_UPDATE_OFF, //VALUE is NULL,SIZE is 0. Default: CUMMULATIVE UPDATE ON. MAAT_OPT_CUMULATIVE_UPDATE_OFF, //VALUE is NULL,SIZE is 0. Default: CUMMULATIVE UPDATE ON.
MAAT_OPT_LOAD_VERSION_FROM, //VALUE is a long long, SIZE=sizeof(long long). Default: Load the Latest. Only valid in redis mode, and maybe failed for too old. MAAT_OPT_LOAD_VERSION_FROM, //VALUE is a long long, SIZE=sizeof(long long). Default: Load the Latest. Only valid in redis mode, and maybe failed for too old.
//This option also disables background update. //This option also disables background update.
MAAT_OPT_ENABLE_UPDATE //VALUE is interger, SIZE=sizeof(int). 1: Enabled, 0:Disabled. DEFAULT: Backgroud update is enabled. Runtime setting is allowed. MAAT_OPT_ENABLE_UPDATE, //VALUE is interger, SIZE=sizeof(int). 1: Enabled, 0:Disabled. DEFAULT: Backgroud update is enabled. Runtime setting is allowed.
MAAT_OPT_ACCEPT_TAGS //VALUE is a const char*, MUST end with '\0', SIZE= strlen(string+'\0')+1. Format is a JSON, e.g.{"tags":[{"tag":"location","value":"Beijing/ChaoYang/Huayan/22A"},{"tag":"isp","value":"telecom"}]}
}; };
//return -1 if failed, return 0 on success; //return -1 if failed, return 0 on success;
int Maat_set_feather_opt(Maat_feather_t feather,enum MAAT_INIT_OPT type,const void* value,int size); int Maat_set_feather_opt(Maat_feather_t feather,enum MAAT_INIT_OPT type,const void* value,int size);

View File

@@ -666,6 +666,13 @@ int Maat_set_feather_opt(Maat_feather_t feather,enum MAAT_INIT_OPT type,const vo
"Maat load version from %lld, stops backgroud update." "Maat load version from %lld, stops backgroud update."
,_feather->load_version_from); ,_feather->load_version_from);
break; break;
case MAAT_OPT_ACCEPT_TAGS:
_feather->n_tags=parse_accept_tag((const char*) value, &_feather->accept_tags, _feather->logger);
if(_feather->n_tags==0)
{
return -1;
}
break;
default: default:
return -1; return -1;
} }

View File

@@ -695,7 +695,7 @@ int _get_maat_redis_value(redisContext *c,struct serial_rule_t* rule_list,int ru
{ {
rule_list[idx].table_line=_maat_strdup(reply->str); rule_list[idx].table_line=_maat_strdup(reply->str);
} }
else if(reply->type==REDIS_REPLY_ERROR)//Handle: "Loading Redis is loading the database in memory" else if(reply->type==REDIS_REPLY_ERROR)//Deal with Redis response: "Loading Redis is loading the database in memory"
{ {
MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_redis_monitor MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_redis_monitor
,"Redis cmd=%s Error, Reply type=%d, str=%s",redis_cmd, reply->type, reply->str); ,"Redis cmd=%s Error, Reply type=%d, str=%s",redis_cmd, reply->type, reply->str);

View File

@@ -20,6 +20,7 @@
#include "Maat_rule.h" #include "Maat_rule.h"
#include "Maat_rule_internal.h" #include "Maat_rule_internal.h"
#include "json2iris.h" #include "json2iris.h"
#include "cJSON.h"
#include "dynamic_array.h" #include "dynamic_array.h"
#include "aligment_int64.h" #include "aligment_int64.h"
#include "config_monitor.h" #include "config_monitor.h"
@@ -30,7 +31,7 @@
#include "stream_fuzzy_hash.h" #include "stream_fuzzy_hash.h"
#include "gram_index_engine.h" #include "gram_index_engine.h"
int MAAT_FRAME_VERSION_2_2_20180808=1; int MAAT_FRAME_VERSION_2_2_20180921=1;
const char* CHARSET_STRING[]={"NONE","gbk","big5","unicode","utf8","bin", const char* CHARSET_STRING[]={"NONE","gbk","big5","unicode","utf8","bin",
"unicode_ascii_esc","unicode_ascii_aligned","unicode_ncr_dec","unicode_ncr_hex","url_encode_gb2312","url_encode_utf8",""}; "unicode_ascii_esc","unicode_ascii_aligned","unicode_ncr_dec","unicode_ncr_hex","url_encode_gb2312","url_encode_utf8",""};
@@ -319,7 +320,7 @@ error_out:
return ret; return ret;
} }
char* strlwr(char* string) char* str_tolower(char* string)
{ {
int i=0; int i=0;
for(i=0;i<(int)strlen(string);i++) for(i=0;i<(int)strlen(string);i++)
@@ -473,7 +474,166 @@ int cnt_maskbits(struct in6_addr mask)
} }
return bits_cnt; return bits_cnt;
} }
//@param value is a JSON, like {"tags":[{"tag":"location","value":"北京/朝阳/华严北里/甲22号},{"tag":"isp","value":"电信"}]}
int parse_accept_tag(const char* value, struct rule_tag** result, void* logger)
{
cJSON* json=NULL, *array=NULL,*tag=NULL, *tmp=NULL;
struct rule_tag* p=NULL;
int n_tags=0;
json=cJSON_Parse(value);
if(!json)
{
MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_module,
"MAAT_OPT_ACCEPT_TAGS Error before: %-200.200s",cJSON_GetErrorPtr());
return 0;
}
array=cJSON_GetObjectItem(json, "tags");
n_tags=cJSON_GetArraySize(array);
p=(struct rule_tag*)calloc(sizeof(struct rule_tag), n_tags);
for(int i=0;i<n_tags;i++)
{
tag=cJSON_GetArrayItem(array, i);
tmp=cJSON_GetObjectItem(tag, "tag");
p[i].tag_name=_maat_strdup(tmp->valuestring);
tmp=cJSON_GetObjectItem(tag, "value");
p[i].tag_val=_maat_strdup(tmp->valuestring);
}
cJSON_Delete(json);
*result=p;
return n_tags;
}
static int compare_each_tag(cJSON* tag_obj, const struct rule_tag* accept_tags, int n_accept)
{
const char* tag_name;
const char* tag_val;
int n_val;
cJSON *tab_name_obj=NULL, *tag_vals_array=NULL, *tag_val_obj=NULL;
int i=0, j=0, name_matched=0;
tab_name_obj=cJSON_GetObjectItem(tag_obj,"tag");
if(!tab_name_obj||tab_name_obj->type!=cJSON_String)
{
goto error_out;
}
tag_name=tab_name_obj->valuestring;
tag_vals_array=cJSON_GetObjectItem(tag_obj,"value");
if(!tag_vals_array||tag_vals_array->type!=cJSON_Array)
{
goto error_out;
}
n_val=cJSON_GetArraySize(tag_vals_array);
for(i=0;i<n_accept;i++)
{
if(0!=strcmp(accept_tags[i].tag_name, tag_name))
{
continue;
}
name_matched++;
for(j=0; j<n_val; j++)
{
tag_val_obj=cJSON_GetArrayItem(tag_vals_array, j);
if(!tag_val_obj||tag_val_obj->type!=cJSON_String)
{
goto error_out;
}
tag_val=tag_val_obj->valuestring;
// compare a/b/c with a/b/c/d is a miss.
if(strlen(accept_tags[i].tag_val)<strlen(tag_val))
{
continue;
}
// compare a1a2/b1/c1 with a1a2/b/ is a miss.
//make sure the overlap is ended with a '/'
if(0==strncmp(accept_tags[i].tag_val, tag_val, strlen(tag_val))&&
(strlen(accept_tags[i].tag_val)==strlen(tag_val)||accept_tags[i].tag_val[strlen(tag_val)]=='/'))
{
return 1;
}
}
}
//no matched name is considered as a
if(name_matched>0)
{
return 0;
}
else
{
return 1;
}
error_out:
return -1;
}
//@param tag_set likes [{"tag":"location","value":["北京/朝阳/华严北里","上海/浦东/陆家嘴"]},{"tag":"isp","value":["电信","移动"]}]
static int compare_each_tag_set(cJSON* tag_set, const struct rule_tag* accept_tags, int n_accept)
{
cJSON *tag_obj=NULL;
int n_tag=0, ret=0, matched=0;
n_tag=cJSON_GetArraySize(tag_set);
for(int i=0; i<n_tag; i++)
{
tag_obj=cJSON_GetArrayItem(tag_set, i);
if(!tag_obj||tag_obj->type!=cJSON_Object)
{
goto error_out;
}
ret=compare_each_tag(tag_obj, accept_tags, n_accept);
if(ret<0)
{
return -1;
}
if(ret==1)
{
matched++;
}
}
if(matched==n_tag)
{
return 1;
}
else
{
return 0;
}
error_out:
return -1;
}
//@param value {"tag_sets":[[{"tag":"location","value":["北京/朝阳/华严北里","上海/浦东/陆家嘴"]},{"tag":"isp","value":["电信","移动"]}],[{"tag":"location","value":["北京"]},{"tag":"isp","value":["联通"]}]]}
//@return 1 on match, 0 on not match, -1 on error.
static int compare_accept_tag(const char* value,const struct rule_tag* accept_tags, int n_tags)
{
cJSON *json=NULL;
cJSON *tag_set_array=NULL, *tag_set=NULL;
int ret=-1, n_set=0;
json=cJSON_Parse(value);
if(!json)
{
goto error_out;
}
tag_set_array=cJSON_GetObjectItem(json, "tag_sets");
if(!tag_set_array||tag_set_array->type!=cJSON_Array)
{
goto error_out;
}
n_set=cJSON_GetArraySize(tag_set_array);
for(int i=0; i<n_set; i++)
{
tag_set=cJSON_GetArrayItem(tag_set_array,i);
if(!tag_set||tag_set->type!=cJSON_Array)
{
goto error_out;
}
ret=compare_each_tag_set(tag_set, accept_tags, n_tags);
if(ret!=0)//match or error occurs.
{
break;
}
}
error_out:
cJSON_Delete(json);
return ret;
}
int lqueue_destroy_cb(void *data, long data_len, void *arg) int lqueue_destroy_cb(void *data, long data_len, void *arg)
{ {
assert(0); assert(0);
@@ -544,12 +704,12 @@ int read_expr_table_info(const char* line,int line_num,struct _Maat_table_info_t
,&(p->cross_cache_size) ,&(p->cross_cache_size)
,quick_str_scan); ,quick_str_scan);
memset(ret,0,sizeof(ret)); memset(ret,0,sizeof(ret));
ret[0]=map_str2int(string2int_map,strlwr(table_type),(int*)&(p->table_type)); ret[0]=map_str2int(string2int_map,str_tolower(table_type),(int*)&(p->table_type));
ret[1]=map_str2int(string2int_map,strlwr(src_charset),(int*)&(p->src_charset)); ret[1]=map_str2int(string2int_map,str_tolower(src_charset),(int*)&(p->src_charset));
ret[2]=map_str2int(string2int_map,strlwr(merge),&(p->do_charset_merge)); ret[2]=map_str2int(string2int_map,str_tolower(merge),&(p->do_charset_merge));
if(strlen(quick_str_scan)>0) if(strlen(quick_str_scan)>0)
{ {
ret[3]=map_str2int(string2int_map,strlwr(quick_str_scan),&(p->quick_expr_switch)); ret[3]=map_str2int(string2int_map,str_tolower(quick_str_scan),&(p->quick_expr_switch));
} }
memset(quick_str_scan,0,sizeof(quick_str_scan)); memset(quick_str_scan,0,sizeof(quick_str_scan));
@@ -566,7 +726,7 @@ int read_expr_table_info(const char* line,int line_num,struct _Maat_table_info_t
sub_token= strtok_r(token,"/", &saveptr); sub_token= strtok_r(token,"/", &saveptr);
if (sub_token == NULL) if (sub_token == NULL)
break; break;
ret[3]=map_str2int(string2int_map,strlwr(sub_token),(int*)&(p->dst_charset[j])); ret[3]=map_str2int(string2int_map,str_tolower(sub_token),(int*)&(p->dst_charset[j]));
if(ret[3]>0) if(ret[3]>0)
{ {
if(p->dst_charset[j]==p->src_charset) if(p->dst_charset[j]==p->src_charset)
@@ -640,7 +800,7 @@ int read_table_info(struct _Maat_table_info_t** p_table_info,int num,const char*
} }
p=create_table_info(max_thread_num); p=create_table_info(max_thread_num);
ret=sscanf(line,"%hu\t%s\t%s\t%s",&(p->table_id) ret=sscanf(line,"%hu\t%s\t%s\t%[a-z0-9\t ]",&(p->table_id)
,p->table_name[0] ,p->table_name[0]
,table_type_str ,table_type_str
,not_care); ,not_care);
@@ -650,7 +810,7 @@ int read_table_info(struct _Maat_table_info_t** p_table_info,int num,const char*
"Maat read table info %s line %d error: not enough column.",table_info_path,i); "Maat read table info %s line %d error: not enough column.",table_info_path,i);
continue; continue;
} }
ret=map_str2int(string2int_map,strlwr(table_type_str),(int*)&(p->table_type)); ret=map_str2int(string2int_map,str_tolower(table_type_str),(int*)&(p->table_type));
if(ret<0) if(ret<0)
{ {
MESA_handle_runtime_log(logger, RLOG_LV_FATAL,maat_module, MESA_handle_runtime_log(logger, RLOG_LV_FATAL,maat_module,
@@ -673,7 +833,7 @@ int read_table_info(struct _Maat_table_info_t** p_table_info,int num,const char*
case TABLE_TYPE_PLUGIN: case TABLE_TYPE_PLUGIN:
p->cb_info=(struct _plugin_table_info*)calloc(sizeof(struct _plugin_table_info),1); p->cb_info=(struct _plugin_table_info*)calloc(sizeof(struct _plugin_table_info),1);
p->cb_info->cache_lines=dynamic_array_create(1024,1024); p->cb_info->cache_lines=dynamic_array_create(1024,1024);
ret=sscanf(not_care,"%d",&(p->valid_flag_column)); ret=sscanf(not_care,"%d\t%d",&(p->valid_flag_column), &p->rule_tag_column);
if(ret==0||ret==EOF) if(ret==0||ret==EOF)
{ {
p->valid_flag_column=-1; p->valid_flag_column=-1;
@@ -683,7 +843,7 @@ int read_table_info(struct _Maat_table_info_t** p_table_info,int num,const char*
ret=sscanf(not_care,"%[a-z0-9]",user_region_encoding); ret=sscanf(not_care,"%[a-z0-9]",user_region_encoding);
if(ret>0) if(ret>0)
{ {
ret=map_str2int(string2int_map,strlwr(user_region_encoding),(int*)&(p->user_region_encoding)); ret=map_str2int(string2int_map,str_tolower(user_region_encoding),(int*)&(p->user_region_encoding));
} }
if(ret!=1) if(ret!=1)
{ {
@@ -2657,19 +2817,20 @@ error_out:
intval_rule=NULL; intval_rule=NULL;
} }
void update_compile_rule(struct _Maat_table_info_t* table,const char* table_line,struct _Maat_scanner_t *scanner,void* logger) void update_compile_rule(struct _Maat_table_info_t* table,const char* table_line,struct _Maat_scanner_t *scanner, const struct rule_tag* tags, int n_tags,void* logger)
{ {
struct db_compile_rule_t *p_compile=(struct db_compile_rule_t*)calloc(sizeof(struct db_compile_rule_t ),1); struct db_compile_rule_t *p_compile=(struct db_compile_rule_t*)calloc(sizeof(struct db_compile_rule_t ),1);
struct _head_Maat_rule_t* p_m_rule=&(p_compile->m_rule_head); struct _head_Maat_rule_t* p_m_rule=&(p_compile->m_rule_head);
char user_region[MAX_TABLE_LINE_SIZE]={0}; char user_region[MAX_TABLE_LINE_SIZE]={0};
char tag_str[MAX_TABLE_LINE_SIZE]={0};
int ret=0; int ret=0;
p_compile->declare_grp_num=0; p_compile->declare_grp_num=0;
ret=sscanf(table_line,"%d\t%d\t%hhd\t%hhd\t%hhd\t%lld\t%s\t%d\t%d",&(p_m_rule->config_id) ret=sscanf(table_line,"%d\t%d\t%hhd\t%hhd\t%hhd\t%s\t%s\t%d\t%d",&(p_m_rule->config_id)
,&(p_m_rule->service_id) ,&(p_m_rule->service_id)
,&(p_m_rule->action) ,&(p_m_rule->action)
,&(p_m_rule->do_blacklist) ,&(p_m_rule->do_blacklist)
,&(p_m_rule->do_log) ,&(p_m_rule->do_log)
,&(p_compile->effective_range) ,tag_str
,user_region ,user_region
,&(p_compile->is_valid) ,&(p_compile->is_valid)
,&(p_compile->declare_grp_num)); ,&(p_compile->declare_grp_num));
@@ -2678,10 +2839,25 @@ void update_compile_rule(struct _Maat_table_info_t* table,const char* table_line
MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_module , MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_module ,
"update error,invalid format of compile table %s:%s" "update error,invalid format of compile table %s:%s"
,table->table_name[table->updating_name],table_line); ,table->table_name[table->updating_name],table_line);
free(p_compile);
p_compile=NULL;
table->udpate_err_cnt++; table->udpate_err_cnt++;
return; goto no_save;
}
if(n_tags>0&&strlen(tag_str)>2)
{
ret=compare_accept_tag(tag_str, tags, n_tags);
if(ret<0)
{
MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_module ,
"update error,invalid tag format of compile table %s:%s"
,table->table_name[table->updating_name],table_line);
table->udpate_err_cnt++;
goto no_save;
}
if(ret==0)
{
table->unmatch_tag_cnt++;
goto no_save;
}
} }
switch(table->user_region_encoding) switch(table->user_region_encoding)
{ {
@@ -2702,10 +2878,7 @@ void update_compile_rule(struct _Maat_table_info_t* table,const char* table_line
{ {
table->cfg_num--; table->cfg_num--;
} }
free(p_compile->service_defined); goto no_save;
p_compile->service_defined=NULL;
free(p_compile);
p_compile=NULL;
} }
else else
{ {
@@ -2715,12 +2888,8 @@ void update_compile_rule(struct _Maat_table_info_t* table,const char* table_line
MESA_handle_runtime_log(logger,RLOG_LV_INFO,maat_module , MESA_handle_runtime_log(logger,RLOG_LV_INFO,maat_module ,
"duplicate config of compile table %s config_id=%d" "duplicate config of compile table %s config_id=%d"
,table->table_name[table->updating_name],p_m_rule->config_id); ,table->table_name[table->updating_name],p_m_rule->config_id);
free(p_compile->service_defined);
p_compile->service_defined=NULL;
free(p_compile);
p_compile=NULL;
table->udpate_err_cnt++; table->udpate_err_cnt++;
goto no_save;
} }
else else
{ {
@@ -2728,7 +2897,13 @@ void update_compile_rule(struct _Maat_table_info_t* table,const char* table_line
table->cfg_num++; table->cfg_num++;
} }
} }
return;
no_save:
free(p_compile->service_defined);
p_compile->service_defined=NULL;
free(p_compile);
p_compile=NULL;
return; return;
} }
@@ -2901,13 +3076,49 @@ void garbage_bury(MESA_lqueue_head garbage_q,int timeout,void *logger)
q_cnt,bury_cnt); q_cnt,bury_cnt);
} }
} }
void plugin_table_callback(struct _Maat_table_info_t* table,const char* table_line,void* logger) void update_plugin_table(struct _Maat_table_info_t* table,const char* table_line, const struct rule_tag* tags, int n_tags, void* logger)
{ {
int i=0; int i=0, ret=1;
unsigned int len=strlen(table_line)+1; unsigned int len=strlen(table_line)+1;
struct _plugin_table_info* p_table_cb=table->cb_info; struct _plugin_table_info* p_table_cb=table->cb_info;
char *p=NULL; char *p=NULL;
char* copy=NULL;
char *token=NULL,*sub_token=NULL,*saveptr;
if(table->rule_tag_column!=0&&n_tags>0)
{
copy=_maat_strdup(table_line);
for (token = copy, i=0; i<table->rule_tag_column ; token= NULL, i++)
{
sub_token= strtok_r(token,"\t", &saveptr);
if (sub_token == NULL)
break;
}
if(i==table->rule_tag_column&&strlen(sub_token)>2)
{
ret=compare_accept_tag(sub_token, tags, n_tags);
if(ret<0)
{
MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_module ,
"update error,invalid tag format of plugin table %s:%s"
,table->table_name[table->updating_name],table_line);
table->udpate_err_cnt++;
}
if(ret==0)
{
table->unmatch_tag_cnt++;
}
}
free(copy);
copy=NULL;
if(ret!=1)
{
return;
}
}
p_table_cb->acc_line_num++; p_table_cb->acc_line_num++;
if(p_table_cb->cb_plug_cnt>0) if(p_table_cb->cb_plug_cnt>0)
{ {
for(i=0;i<p_table_cb->cb_plug_cnt;i++) for(i=0;i<p_table_cb->cb_plug_cnt;i++)
@@ -3202,13 +3413,13 @@ int maat_update_cb(const char* table_name,const char* line,void *u_para)
update_digest_rule(feather->p_table_info[table_id], line, scanner,feather->logger,feather->GROUP_MODE_ON); update_digest_rule(feather->p_table_info[table_id], line, scanner,feather->logger,feather->GROUP_MODE_ON);
break; break;
case TABLE_TYPE_COMPILE: case TABLE_TYPE_COMPILE:
update_compile_rule(feather->p_table_info[table_id], line, scanner,feather->logger); update_compile_rule(feather->p_table_info[table_id], line, scanner, feather->accept_tags, feather->n_tags, feather->logger);
break; break;
case TABLE_TYPE_GROUP: case TABLE_TYPE_GROUP:
update_group_rule(feather->p_table_info[table_id], line, scanner,feather->logger); update_group_rule(feather->p_table_info[table_id], line, scanner,feather->logger);
break; break;
case TABLE_TYPE_PLUGIN: case TABLE_TYPE_PLUGIN:
plugin_table_callback(feather->p_table_info[table_id], line,feather->logger); update_plugin_table(feather->p_table_info[table_id], line, feather->accept_tags, feather->n_tags, feather->logger);
default: default:
break; break;

View File

@@ -261,9 +261,11 @@ struct _Maat_table_info_t
}; };
struct _plugin_table_info *cb_info; struct _plugin_table_info *cb_info;
int valid_flag_column; //for plugin table int valid_flag_column; //for plugin table
int rule_tag_column; //for plugin table;
int user_region_encoding; //for compile table, USER_REGION_ENCODE_xx int user_region_encoding; //for compile table, USER_REGION_ENCODE_xx
//for stat>>>>>>>> //for stat>>>>>>>>
unsigned long long udpate_err_cnt; unsigned long long udpate_err_cnt;
unsigned long long unmatch_tag_cnt;
unsigned long long iconv_err_cnt; unsigned long long iconv_err_cnt;
int stat_line_id; int stat_line_id;
mcore_long_t scan_cnt; mcore_long_t scan_cnt;
@@ -329,6 +331,11 @@ struct GIE_aux_t
GIE_handle_t* gie_handle; GIE_handle_t* gie_handle;
MESA_lqueue_head update_q; MESA_lqueue_head update_q;
}; };
struct rule_tag
{
char* tag_name;
char* tag_val;
};
struct _Maat_scanner_t struct _Maat_scanner_t
{ {
long long version; long long version;
@@ -399,6 +406,9 @@ struct _Maat_feather_t
pthread_mutex_t redis_write_lock; //protect redis_write_ctx pthread_mutex_t redis_write_lock; //protect redis_write_ctx
long long base_rgn_seq,base_grp_seq,server_time; long long base_rgn_seq,base_grp_seq,server_time;
long long load_version_from; long long load_version_from;
struct rule_tag *accept_tags;
int n_tags;
//internal states //internal states
long long new_version; long long new_version;
int active_plugin_table_num; int active_plugin_table_num;
@@ -451,6 +461,7 @@ struct serial_rule_t //rm= Redis Maat
char table_name[256]; char table_name[256];
char* table_line; char* table_line;
}; };
int parse_accept_tag(const char* value, struct rule_tag** result, void* logger);
void garbage_bagging(enum maat_garbage_type type,void *p,MESA_lqueue_head garbage_q); void garbage_bagging(enum maat_garbage_type type,void *p,MESA_lqueue_head garbage_q);
void garbage_bury(MESA_lqueue_head garbage_q,void *logger); void garbage_bury(MESA_lqueue_head garbage_q,void *logger);
void make_group_set(const struct _Maat_compile_inner_t* compile_rule,universal_bool_expr_t* a_set); void make_group_set(const struct _Maat_compile_inner_t* compile_rule,universal_bool_expr_t* a_set);

View File

@@ -8,13 +8,10 @@ CFLAGS = -Wall -g -fPIC
CFLAGS += $(OPTFLAGS) CFLAGS += $(OPTFLAGS)
#CFLAGS += $(GCOV_FLAGS) #CFLAGS += $(GCOV_FLAGS)
LDDICTATOR = -Wl,-wrap,malloc -Wl,-wrap,calloc -Wl,-wrap,free -Wl,-wrap,realloc LDDICTATOR = -Wl,-wrap,malloc -Wl,-wrap,calloc -Wl,-wrap,free -Wl,-wrap,realloc
LDFLAGS = -lMESA_handle_logger -lMESA_htable -lpthread -lrt -lm -lrulescan -lpcre -lMESA_field_stat2 -lcrypto -lhiredis_vip LDFLAGS += -lMESA_handle_logger -lMESA_htable -lpthread -lrt -lm -lrulescan -lpcre -lMESA_field_stat2 -lcrypto -lhiredis_vip
#LDFLAGS += $(LDDICTATOR) #LDFLAGS += $(LDDICTATOR)
LDFLAGS += $(GCOV_FLAGS) LDFLAGS += $(GCOV_FLAGS)
MAILLIB = ../lib H_DIR =-I../inc_internal -I../../inc -I/opt/MESA/include/
G_H_DIR =../inc_internal
H_DIR =-I$(G_H_DIR) -I../../inc
LIBMAAT = libmaatframe.a LIBMAAT = libmaatframe.a
LIBMAAT_SO = libmaatframe.so LIBMAAT_SO = libmaatframe.so

View File

@@ -715,10 +715,11 @@ int write_compile_rule(cJSON *compile,struct iris_description_t *p_iris,void * l
compile_cmd[cmd_cnt].json_type=cJSON_Number; compile_cmd[cmd_cnt].json_type=cJSON_Number;
cmd_cnt++; cmd_cnt++;
compile_cmd[cmd_cnt].json_string="effective_range";
compile_cmd[cmd_cnt].json_type=cJSON_Number; compile_cmd[cmd_cnt].json_string="tags";
compile_cmd[cmd_cnt].json_type=cJSON_String;
compile_cmd[cmd_cnt].empty_allowed=1; compile_cmd[cmd_cnt].empty_allowed=1;
compile_cmd[cmd_cnt].default_int=0; compile_cmd[cmd_cnt].default_string="0";
cmd_cnt++; cmd_cnt++;
compile_cmd[cmd_cnt].json_string="user_region"; compile_cmd[cmd_cnt].json_string="user_region";

File diff suppressed because one or more lines are too long

View File

@@ -558,7 +558,74 @@ void test_offset_str_scan(Maat_feather_t feather,const char* table_name)
test_offset_str_scan_with_chunk(feather,table_name,1460); test_offset_str_scan_with_chunk(feather,table_name,1460);
return; return;
} }
void test_compile_accept_tags(Maat_feather_t feather)
{
int ret1=0, ret2=0;
int table_id=0;
scan_status_t mid=NULL;
struct Maat_rule_t result[4];
const char* should_hit="string bbb should hit";
const char* should_not_hit="string aaa should not hit";
const char* table_name="HTTP_URL";
table_id=Maat_table_register(feather,table_name);
if(table_id==-1)
{
printf("Database table %s register failed.\n",table_name);
return;
}
ret1=Maat_full_scan_string(feather, table_id,CHARSET_GBK, should_not_hit, strlen(should_not_hit),
result,NULL, 4,
&mid, 0);
ret2=Maat_full_scan_string(feather, table_id,CHARSET_GBK, should_hit, strlen(should_hit),
result,NULL, 4,
&mid, 0);
if(ret1<=0&&ret2>0)
{
printf("Test compile accept tags success.\n");
}
else
{
printf("Test compile accept tags failed.\n");
}
Maat_clean_status(&mid);
return;
}
void accept_tags_entry_cb(int table_id,const char* table_line,void* u_para)
{
char status[32]={0};
int entry_id=-1,seq=-1;
int is_valid=0;
sscanf(table_line,"%d\t%s\t%d\t%d",&seq,status,&entry_id,&is_valid);
printf("Test plugin accept tags loading %d %s.\n",seq, status);
return;
}
void test_plugin_accept_tags(Maat_feather_t feather)
{
int table_id=0,ret=0;
const char* table_name="TEST_EFFECTIVE_RANGE_TABLE";
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,
NULL,
accept_tags_entry_cb,
NULL,
NULL);
if(ret<0)
{
printf("Maat callback register table %s error.\n",table_name);
}
}
return;
}
void test_longer_service_define(Maat_feather_t feather, struct Maat_rule_t* rule) void test_longer_service_define(Maat_feather_t feather, struct Maat_rule_t* rule)
{ {
int ret=0; int ret=0;
@@ -1009,6 +1076,7 @@ int main(int argc,char* argv[])
const char* stat_file="./scan_staus.log"; const char* stat_file="./scan_staus.log";
const char* decrypt_key="mesa2017wy"; const char* decrypt_key="mesa2017wy";
const char* test_digest_file="./testdata/digest_test.data"; const char* test_digest_file="./testdata/digest_test.data";
const char* accept_tags="{\"tags\":[{\"tag\":\"location\",\"value\":\"北京/朝阳/华严北里/甲22号\"},{\"tag\":\"isp\",\"value\":\"移动\"}]}";
int scan_interval_ms=1; int scan_interval_ms=1;
int effective_interval_ms=0; int effective_interval_ms=0;
@@ -1065,6 +1133,7 @@ int main(int argc,char* argv[])
Maat_set_feather_opt(feather, MAAT_OPT_STAT_ON, NULL, 0); Maat_set_feather_opt(feather, MAAT_OPT_STAT_ON, NULL, 0);
Maat_set_feather_opt(feather, MAAT_OPT_PERF_ON, NULL, 0); Maat_set_feather_opt(feather, MAAT_OPT_PERF_ON, NULL, 0);
Maat_set_feather_opt(feather, MAAT_OPT_SCAN_DETAIL, &scan_detail, sizeof(scan_detail)); Maat_set_feather_opt(feather, MAAT_OPT_SCAN_DETAIL, &scan_detail, sizeof(scan_detail));
Maat_set_feather_opt(feather, MAAT_OPT_ACCEPT_TAGS, accept_tags, strlen(accept_tags)+1);
Maat_initiate_feather(feather); Maat_initiate_feather(feather);
if(feather==NULL) if(feather==NULL)
@@ -1122,6 +1191,10 @@ int main(int argc,char* argv[])
Maat_clean_status(&mid); Maat_clean_status(&mid);
test_offset_str_scan(feather,"IMAGE_FP"); test_offset_str_scan(feather,"IMAGE_FP");
test_plugin_accept_tags(feather);
test_compile_accept_tags(feather);
int value=0; int value=0;
if(1==using_redis) if(1==using_redis)
{ {

View File

@@ -11,7 +11,7 @@
#id name type #id name type
# #
#For plugin table #For plugin table
#id name type valid_column #id name type valid_column tag_column
# #
#For expr/expr_plus Table #For expr/expr_plus Table
#id name type src_charset dst_charset do_merge cross_cache quick_mode #id name type src_charset dst_charset do_merge cross_cache quick_mode
@@ -22,8 +22,9 @@
3 KEYWORDS_TABLE expr UTF8 GBK/BIG5/UNICODE/UTF8/unicode_ascii_esc/unicode_ascii_aligned/unicode_ncr_dec/unicode_ncr_hex yes 0 3 KEYWORDS_TABLE expr UTF8 GBK/BIG5/UNICODE/UTF8/unicode_ascii_esc/unicode_ascii_aligned/unicode_ncr_dec/unicode_ncr_hex yes 0
4 IP_CONFIG ip -- 4 IP_CONFIG ip --
5 CONTENT_SIZE intval -- 5 CONTENT_SIZE intval --
6 QD_ENTRY_INFO plugin 4 6 QD_ENTRY_INFO plugin 4 --
7 FILE_DIGEST digest -- 7 FILE_DIGEST digest --
8 HTTP_REGION expr_plus GBK GBK no 0 8 HTTP_REGION expr_plus GBK GBK no 0
9 SIM_URL similar -- 9 SIM_URL similar --
10 IMAGE_FP expr UTF8 UTF8 yes 128 quickoff 10 IMAGE_FP expr UTF8 UTF8 yes 128 quickoff
11 TEST_EFFECTIVE_RANGE_TABLE plugin 4 5 --