diff --git a/Makefile b/Makefile index 60763b1..53a95f3 100644 --- a/Makefile +++ b/Makefile @@ -6,9 +6,11 @@ all: cd src/entry/ && $(MAKE) cd test && $(MAKE) + cd tools && $(MAKE) clean: cd src/entry/ && $(MAKE) clean cd test && $(MAKE) clean + cd tools && $(MAKE) clean opt: $(MAKE) all diff --git a/src/entry/Maat_rule_internal.h b/src/entry/Maat_rule_internal.h index 4f93488..b5a9127 100644 --- a/src/entry/Maat_rule_internal.h +++ b/src/entry/Maat_rule_internal.h @@ -428,6 +428,15 @@ struct _maat_garbage_t MESA_htable_handle str2int_map; }; }; +struct serial_rule_t //rm= Redis Maat +{ + enum MAAT_OPERATION op;//0: delete, 1: add. + int rule_id; + int label_id; + long long timeout; // absolute unix time. + char table_name[256]; + char* table_line; +}; 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 make_group_set(const struct _Maat_compile_inner_t* compile_rule,universal_bool_expr_t* a_set); @@ -456,6 +465,9 @@ void maat_stat_output(struct _Maat_feather_t* feather); char* _maat_strdup(const char* s); char* str_unescape(char* s); redisReply *_wrap_redisCommand(redisContext *c, const char *format, ...); +int get_rm_key_list(unsigned int version,redisContext *c,struct serial_rule_t** list,void* logger, unsigned int* new_version,int *update_type); +int get_maat_redis_value(redisContext *c,struct serial_rule_t* rule_list,int rule_num,void* logger,int print_process); +void empty_serial_rules(struct serial_rule_t* rule); void redis_monitor_traverse(unsigned int version,redisContext *c, void (*start)(unsigned int ,int ,void*),//vesion,CM_UPDATE_TYPE_*,u_para int (*update)(const char* ,const char*,void* ),//table name ,line ,u_para diff --git a/src/entry/json2iris.h b/src/entry/json2iris.h index 10631af..b6b08f3 100644 --- a/src/entry/json2iris.h +++ b/src/entry/json2iris.h @@ -1,2 +1,6 @@ - +#ifndef H_MAAT_JSON2IRIS_H_INCLUDE +#define H_MAAT_JSON2IRIS_H_INCLUDE int json2iris(const char* json_file,const char*compile_tn,const char* group_tn,char* iris_dir_buf,int buf_len,void* logger); +int set_file_rulenum(const char* path,int rulenum,void* logger); +#endif + diff --git a/test/Makefile b/test/Makefile index bde0217..9c83e95 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,7 +1,8 @@ -LIBS=../lib/libmaatframe.so -INC=-I../inc/ -I/usr/include/MESA/ +LIBS= ../lib/libmaatframe.so -lhiredis_vip +INC=-I../inc/ -I ../src/entry/ -I../src/inc_internal/ -I/usr/include/MESA/ all: - g++ -o maat_test -g -Wall maat_test.cpp $(INC) $(LIBS) -lMESA_handle_logger + g++ -o maat_redis_tool.o -c -g -Wall maat_redis_tool.cpp $(INC) + g++ -o maat_redis_tool maat_redis_tool.o $(LIBS) g++ -o digest_gen -g digest_gen.c $(INC) $(LIBS) clean: - rm maat_test test.log* -f + rm *.o diff --git a/tools/Makefile b/tools/Makefile new file mode 100644 index 0000000..9c83e95 --- /dev/null +++ b/tools/Makefile @@ -0,0 +1,8 @@ +LIBS= ../lib/libmaatframe.so -lhiredis_vip +INC=-I../inc/ -I ../src/entry/ -I../src/inc_internal/ -I/usr/include/MESA/ +all: + g++ -o maat_redis_tool.o -c -g -Wall maat_redis_tool.cpp $(INC) + g++ -o maat_redis_tool maat_redis_tool.o $(LIBS) + g++ -o digest_gen -g digest_gen.c $(INC) $(LIBS) +clean: + rm *.o diff --git a/test/digest_gen.c b/tools/digest_gen.c similarity index 100% rename from test/digest_gen.c rename to tools/digest_gen.c diff --git a/test/digest_test.data b/tools/digest_test.data similarity index 100% rename from test/digest_test.data rename to tools/digest_test.data diff --git a/tools/maat_redis_tool.cpp b/tools/maat_redis_tool.cpp new file mode 100644 index 0000000..76bff8d --- /dev/null +++ b/tools/maat_redis_tool.cpp @@ -0,0 +1,180 @@ +#include "Maat_rule.h" +#include "Maat_command.h" +#include "Maat_rule_internal.h" +#include "json2iris.h" +#include "config_monitor.h" +#include "hiredis.h" +#include +#include +#include +#include +#include +const char* redis_dump_dir="./redis_dump"; +void maat_tool_print_usage(void) +{ + printf("maat_redis_tool manipulate rules from redis.\n"); + printf("Usage:\n"); + printf("\t-h [host], redis IP, 127.0.0.1 as default.\n"); + printf("\t-p [port], redis port, 6379 as default.\n"); + printf("\t-d [dir], dump rules from redis to [dir], %s as default.\n",redis_dump_dir); + printf("example: ./maat_redis_tool -h 127.0.0.1 -p 6379 -d %s\n",redis_dump_dir); + + return; +} +static int compare_serial_rule(const void *a, const void *b) +{ + struct serial_rule_t *ra=(struct serial_rule_t *)a; + struct serial_rule_t *rb=(struct serial_rule_t *)b; + + char p_str[256],q_str[256]; + snprintf(p_str,sizeof(p_str),"%s.%d",ra->table_name,ra->rule_id); + snprintf(q_str,sizeof(q_str),"%s.%d",rb->table_name,rb->rule_id); + return strcmp(p_str,q_str); +} +void read_rule_from_redis(const char*redis_ip, int redis_port, int redis_db,const char* output_path ,void*logger) +{ + struct serial_rule_t* rule_list; + int rule_num=0,line_count=0; + int i=0,ret=0; + int update_type=CM_UPDATE_TYPE_INC; + unsigned int version=0; + const char* cur_table=NULL; + + char table_path[256],index_path[256]; + FILE *table_fp=NULL, *index_fp=NULL; + + struct timeval connect_timeout; + connect_timeout.tv_sec=0; + connect_timeout.tv_usec=100*1000; // 100 ms + + redisContext * ctx; + ctx=redisConnectWithTimeout(redis_ip, redis_port,connect_timeout); + if(ctx==NULL) + { + printf("Unable to connect %s:%d db%d\n",redis_ip,redis_port,redis_db); + return; + } + + printf("Reading key list from %s:%d db%d.\n",redis_ip,redis_port,redis_db); + rule_num=get_rm_key_list(0, ctx, &rule_list, logger,&version, &update_type); + assert(update_type==CM_UPDATE_TYPE_FULL); + printf("MAAT Version: %d, key number: %d\n", version, rule_num); + printf("Reading value: "); + ret=get_maat_redis_value(ctx,rule_list,rule_num,logger,1); + if(ret<0) + { + goto clean_up; + } + qsort(rule_list,rule_num, sizeof(struct serial_rule_t), + compare_serial_rule); + if((access(output_path,F_OK)) <0) + + { if((mkdir(output_path,S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) < 0) + printf("mkdir %s error\n",output_path); + + } + snprintf(index_path,sizeof(index_path),"%s/full_config_index.%010d",output_path,version); + index_fp=fopen(index_path,"w"); + if(index_fp==NULL) + { + printf("Open %s failed.\n",index_path); + goto clean_up; + } + + for(i=0;i