Mod aaa-12 增加添加对象接口,正则表达式接口
RCA: SOL: 修改人:huangxin 检视人:huangxin
This commit is contained in:
parent
741bd49d51
commit
42df8b3ed7
|
@ -37,9 +37,9 @@ PLAT_ARM64_SRCS := $(PLAT_LINUX_SRCS)
|
|||
# gcc CFLAGS
|
||||
COMMON_CFLAGS := -I../../Common
|
||||
PLAT_LINUX_CFLAGS += $(COMMON_CFLAGS)
|
||||
PLAT_ARM64_CFLAGS += $(COMMON_CFLAGS)
|
||||
PLAT_ARM64_CFLAGS += $(COMMON_CFLAGS) -D_GNU_SOURCE -D__USE_XOPEN
|
||||
|
||||
COMMON_LIBS := -lcjson -lpthread
|
||||
COMMON_LIBS := -lcjson -lpthread -lpcre
|
||||
PLAT_LINUX_LIBS := $(COMMON_LIBS)
|
||||
PLAT_ARM64_LIBS := $(COMMON_LIBS)
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#include "json_interface.h"
|
||||
|
||||
typedef const char *(*StructToJsonCb)(void *pStruct);
|
||||
typedef void (*JsonToStructCb)(const char *pJsonStr, void **pStruct);
|
||||
typedef int (*JsonToStructCb)(const char *pJsonStr, void **pStruct);
|
||||
typedef void (*Base64Code)(void *pStruct, int enCode);
|
||||
|
||||
typedef struct {
|
||||
|
@ -45,7 +45,7 @@ static const char *__interface_encode(void *pData)
|
|||
return pJsonS;
|
||||
}
|
||||
|
||||
static void __interface_decode(const char *pJsonS, void **pStruct)
|
||||
static int __interface_decode(const char *pJsonS, void **pStruct)
|
||||
{
|
||||
cJSON *pRoot;
|
||||
PJSON_INTERFACE pData;
|
||||
|
@ -53,7 +53,7 @@ static void __interface_decode(const char *pJsonS, void **pStruct)
|
|||
*pStruct = malloc(sizeof(JSON_INTERFACE));
|
||||
|
||||
if(*pStruct == NULL) {
|
||||
return;
|
||||
return -RET_INPUTERR;
|
||||
}
|
||||
|
||||
pData = (PJSON_INTERFACE) * pStruct;
|
||||
|
@ -61,7 +61,7 @@ static void __interface_decode(const char *pJsonS, void **pStruct)
|
|||
pRoot = cJSON_Parse(pJsonS);
|
||||
|
||||
if(!pRoot) {
|
||||
return;
|
||||
return -RET_SYSERR;
|
||||
}
|
||||
|
||||
memset(pData, 0, sizeof(JSON_INTERFACE));
|
||||
|
@ -76,6 +76,8 @@ static void __interface_decode(const char *pJsonS, void **pStruct)
|
|||
}
|
||||
|
||||
cJSON_Delete(pRoot);
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
static const char *__obj_add_encode(void *pData)
|
||||
|
@ -83,7 +85,7 @@ static const char *__obj_add_encode(void *pData)
|
|||
|
||||
}
|
||||
|
||||
static void __obj_add_decode(const char *pJsonS, void **pStruct)
|
||||
static int __obj_add_decode(const char *pJsonS, void **pStruct)
|
||||
{
|
||||
cJSON *pRoot;
|
||||
PIFACE_ADD_OBJ pData;
|
||||
|
@ -93,7 +95,7 @@ static void __obj_add_decode(const char *pJsonS, void **pStruct)
|
|||
*pStruct = malloc(sizeof(IFACE_ADD_OBJ));
|
||||
|
||||
if(*pStruct == NULL) {
|
||||
return;
|
||||
return -RET_INPUTERR;
|
||||
}
|
||||
|
||||
pData = (PIFACE_ADD_OBJ) * pStruct;
|
||||
|
@ -101,7 +103,7 @@ static void __obj_add_decode(const char *pJsonS, void **pStruct)
|
|||
pRoot = cJSON_Parse(pJsonS);
|
||||
|
||||
if(!pRoot) {
|
||||
return;
|
||||
return -RET_SYSERR;
|
||||
}
|
||||
|
||||
memset(pData, 0, sizeof(IFACE_ADD_OBJ));
|
||||
|
@ -171,6 +173,8 @@ static void __obj_add_decode(const char *pJsonS, void **pStruct)
|
|||
}
|
||||
|
||||
cJSON_Delete(pRoot);
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
static JSON_ENGINE g_jSonEngine[] = {
|
||||
|
|
|
@ -3,5 +3,5 @@
|
|||
"ver": 1,
|
||||
"cryptoType": 0,
|
||||
"timeStamp": 1526625689,
|
||||
"msgContent": "[{\"name\":\"RTP管理\",\"type\":1,\"desc\":\"RTP语音数据权限、连接、流控管理\",\"prio\":0,\"objContent\":[{\"proType\":0,\"porPort\":\"80,83\"},{\"proType\":0,\"porPort\":\"100-110\"},{\"proType\":1,\"porPort\":\"10000-10010\"}]},{\"name\":\"研发部\",\"type\":10,\"desc\":\"研发部所有员工\",\"prio\":0,\"objContent\":[{\"ipAddr\":\"192.168.0.1\"},{\"ipAddr\":\"192.168.10.1-192.168.10.20\"},{\"ipAddr\":\"192.168.20.1/24\"}]},{\"name\":\"工作时间\",\"type\":20,\"desc\":\"法定工作时间\",\"prio\":0,\"objContent\":[{\"repType\":255,\"timeValue\":\"09:00-12:00\"},{\"repType\":255,\"timeValue\":\"13:00-18:00\"}]}]"
|
||||
"msgContent": "[{\"name\":\"RTP管理\",\"type\":1,\"desc\":\"RTP语音数据权限、连接、流控管理\",\"prio\":0,\"objContent\":[{\"proType\":0,\"porPort\":\"8083\"},{\"proType\":0,\"porPort\":\"100-110\"},{\"proType\":1,\"porPort\":\"10000-10010\"}]},{\"name\":\"研发部\",\"type\":10,\"desc\":\"研发部所有员工\",\"prio\":0,\"objContent\":[{\"ipAddr\":\"192.168.0.1\"},{\"ipAddr\":\"192.168.10.1-192.168.10.20\"},{\"ipAddr\":\"192.168.20.1/24\"}]},{\"name\":\"工作时间\",\"type\":20,\"desc\":\"法定工作时间\",\"prio\":0,\"objContent\":[{\"repType\":255,\"timeValue\":\"09:00-12:00\"},{\"repType\":255,\"timeValue\":\"13:00-18:00\"}]}]"
|
||||
}
|
|
@ -8,82 +8,36 @@
|
|||
#include <pthread.h>
|
||||
#include <uthash/uthash.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "compile.h"
|
||||
#include "log.h"
|
||||
#include "object_manager.h"
|
||||
#include "json_interface.h"
|
||||
#include "regex_table.h"
|
||||
|
||||
#define MAX_OBJ (300)
|
||||
#define ADD_JS_FILE ("/home/hx/secogateway/Product/user/object_manager/json_test/add.json")
|
||||
|
||||
#define REGEX_SVR_PORT ("^[0-9]{1,5}$")
|
||||
#define REGEX_IP_ADDR "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]\
|
||||
?[0-9][0-9]?)(\\/([0-9]|[1-2][0-9]|3[0-2]))?$|^([0-9a-fA-F]{1,4}:){6}((25[0-5]|2[0-4][0-9]|[01]?[0-9]\
|
||||
[0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^::(\
|
||||
[0-9a-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\
|
||||
(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]{1,4}:):([0-9a-fA-F]{1,4}:){0,3}((25[0-5]|2[0-4]\
|
||||
[0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))\
|
||||
))?$|^([0-9a-fA-F]{1,4}:){2}:([0-9a-fA-F]{1,4}:){0,2}((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]\
|
||||
|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]{1,4}:){3}:([0-9a-fA-F]\
|
||||
{1,4}:){0,1}((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\/([1-9]?[0-9]|\
|
||||
(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]{1,4}:){4}:((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4]\
|
||||
[0-9]|[01]?[0-9][0-9]?)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\
|
||||
(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^:((:[0-9a-fA-F]{1,4}){1,6}|:)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]\
|
||||
))))?$|^[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,5}|:)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]\
|
||||
{1,4}:){2}((:[0-9a-fA-F]{1,4}){1,4}|:)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]{1,4}:){3}\
|
||||
((:[0-9a-fA-F]{1,4}){1,3}|:)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]{1,4}:){4}((:[0-9a-fA-F]\
|
||||
{1,4}){1,2}|:)(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]{1,4}:){5}:([0-9a-fA-F]{1,4})?\
|
||||
(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$|^([0-9a-fA-F]{1,4}:){6}:(\\/([1-9]?[0-9]|(1([0-1][0-9]|2[0-8]))))?$"
|
||||
|
||||
static PCMHI_OBJECT g_pObject = NULL;
|
||||
static OBJECT_K g_objItem[MAX_OBJ];
|
||||
|
||||
int regex_match(const char *regex, const char *pStr)
|
||||
{
|
||||
int result = FALSE;
|
||||
regex_t reg;
|
||||
int regexInit;
|
||||
|
||||
if(!regex || !pStr) {
|
||||
LOG_EX(LOG_Error, "Input params error: %p, %p\n", regex, pStr);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
regexInit = regcomp(®, regex, REG_EXTENDED);
|
||||
|
||||
if(regexInit) {
|
||||
LOG_EX(LOG_Error, "regcomp error\n");
|
||||
return FALSE;
|
||||
} else {
|
||||
int reti = regexec(®, pStr, 0, NULL, 0);
|
||||
|
||||
if(REG_NOERROR != reti) {
|
||||
char buf[1024];
|
||||
memset(buf, 0, 1024);
|
||||
//Error print: match failed!
|
||||
regerror(reti, regexInit, buf, 1024);
|
||||
LOG_EX(LOG_Error, "%s match %s failed(%d): %s\n", regex, pStr, reti, buf);
|
||||
} else {
|
||||
//LOG_EX(LOG_Debug, "%s match %s OK\n", regex, pStr);
|
||||
result = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
regfree(®);
|
||||
return result;
|
||||
}
|
||||
static pthread_mutex_t g_obj_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
int split_params(char *pInput, char **pFirst, char **pSecond, const char *split)
|
||||
{
|
||||
char *pStr = (char *)pInput;
|
||||
char *p;
|
||||
char *pDump;
|
||||
|
||||
if(!pInput || !pFirst || !pSecond) {
|
||||
LOG_EX(LOG_Error, "Input params error: %p, %p, %p\n", pInput, pFirst, pSecond);
|
||||
return -RET_INPUTERR;
|
||||
}
|
||||
|
||||
pDump = strdup(pInput);
|
||||
|
||||
p = strsep(&pStr, split);
|
||||
|
||||
if(strlen(p) == 0) {
|
||||
|
@ -94,8 +48,10 @@ int split_params(char *pInput, char **pFirst, char **pSecond, const char *split)
|
|||
*pSecond = pStr;
|
||||
}
|
||||
|
||||
LOG_EX(LOG_Debug, "[%s] Split to First = %s, Second = %s\n", pInput, *pFirst, *pSecond);
|
||||
/* LOG_EX(LOG_Debug, "[%s] Split to First = %s, Second = %s\n", pDump, *pFirst,
|
||||
*pSecond); */
|
||||
|
||||
free(pDump);
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
|
@ -112,37 +68,93 @@ static int get_free_pos(void)
|
|||
return -1;
|
||||
}
|
||||
|
||||
static void prase_port_object(PSVR_OBJECT pSvr)
|
||||
static void dump_object(void)
|
||||
{
|
||||
int i = 0;
|
||||
int i;
|
||||
PCMHI_OBJECT pObj, pTmp;
|
||||
|
||||
if(!pSvr) {
|
||||
return;
|
||||
pthread_mutex_lock(&g_obj_lock);
|
||||
HASH_ITER(hh, g_pObject, pObj, pTmp) {
|
||||
LOG_EX(LOG_Info, "name: %s\n", pObj->name);
|
||||
LOG_EX(LOG_Info, "desc: %s\n", pObj->desc);
|
||||
LOG_EX(LOG_Info, "prio: %d\n", pObj->prio);
|
||||
LOG_EX(LOG_Info, "Tags: %s\n", g_objItem[pObj->obj_index].memTag);
|
||||
LOG_EX(LOG_Info, "type: %d\n", g_objItem[pObj->obj_index].type);
|
||||
LOG_EX(LOG_Info, "items: %d\n", g_objItem[pObj->obj_index].ctx_num);
|
||||
|
||||
for(i = 0; i < g_objItem[pObj->obj_index].ctx_num; i++) {
|
||||
POBJECT_K pObjK = &g_objItem[pObj->obj_index];
|
||||
|
||||
switch(pObjK->type / 10) {
|
||||
case OBJ_TYPE_SERVER:
|
||||
LOG_EX(LOG_Info, " porType: %d\n", pObjK->objs.svr_obj[i].pro_type);
|
||||
LOG_EX(LOG_Info, " min Port: %d\n", pObjK->objs.svr_obj[i].min_port);
|
||||
LOG_EX(LOG_Info, " min Port: %d\n", pObjK->objs.svr_obj[i].max_port);
|
||||
break;
|
||||
|
||||
case OBJ_TYPE_ADDR:
|
||||
LOG_EX(LOG_Info, " ip_version: %d\n", pObjK->objs.addr_obj[i].ip_version);
|
||||
LOG_EX(LOG_Info, " netmask: %u\n", pObjK->objs.addr_obj[i].net_mask);
|
||||
|
||||
if(IP_V4 == pObjK->objs.addr_obj[i].ip_version) {
|
||||
LOG_EX(LOG_Info, " min addr: %08X\n",
|
||||
pObjK->objs.addr_obj[i].min_addr.addr_v4.ip4_addr);
|
||||
LOG_EX(LOG_Info, " max addr: %08X\n",
|
||||
pObjK->objs.addr_obj[i].max_addr.addr_v4.ip4_addr);
|
||||
} else {
|
||||
LOG_EX(LOG_Info,
|
||||
" min addr: %04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X\n",
|
||||
pObjK->objs.addr_obj[i].min_addr.addr_v6.addr.addr16[0],
|
||||
pObjK->objs.addr_obj[i].min_addr.addr_v6.addr.addr16[1],
|
||||
pObjK->objs.addr_obj[i].min_addr.addr_v6.addr.addr16[2],
|
||||
pObjK->objs.addr_obj[i].min_addr.addr_v6.addr.addr16[3],
|
||||
pObjK->objs.addr_obj[i].min_addr.addr_v6.addr.addr16[4],
|
||||
pObjK->objs.addr_obj[i].min_addr.addr_v6.addr.addr16[6],
|
||||
pObjK->objs.addr_obj[i].min_addr.addr_v6.addr.addr16[7]);
|
||||
LOG_EX(LOG_Info,
|
||||
" max addr: %04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X\n",
|
||||
pObjK->objs.addr_obj[i].max_addr.addr_v6.addr.addr16[0],
|
||||
pObjK->objs.addr_obj[i].max_addr.addr_v6.addr.addr16[1],
|
||||
pObjK->objs.addr_obj[i].max_addr.addr_v6.addr.addr16[2],
|
||||
pObjK->objs.addr_obj[i].max_addr.addr_v6.addr.addr16[3],
|
||||
pObjK->objs.addr_obj[i].max_addr.addr_v6.addr.addr16[4],
|
||||
pObjK->objs.addr_obj[i].max_addr.addr_v6.addr.addr16[5],
|
||||
pObjK->objs.addr_obj[i].max_addr.addr_v6.addr.addr16[6],
|
||||
pObjK->objs.addr_obj[i].max_addr.addr_v6.addr.addr16[7]);
|
||||
}
|
||||
|
||||
for(i = 0; i < strlen(pSvr->str_val); i++) {
|
||||
//if(pSvr->str_val[i] >)
|
||||
break;
|
||||
|
||||
case OBJ_TYPE_DATETIME:
|
||||
LOG_EX(LOG_Info, " repeat: %d\n", pObjK->objs.dt_obj[i].rep_mode);
|
||||
LOG_EX(LOG_Info, " min time: %ld\n", pObjK->objs.dt_obj[i].min_time);
|
||||
LOG_EX(LOG_Info, " max time: %ld\n", pObjK->objs.dt_obj[i].max_time);
|
||||
break;
|
||||
}
|
||||
|
||||
if(strchr(pSvr->str_val, ',') != NULL) {
|
||||
|
||||
} else if(strchr(pSvr->str_val, '-') != NULL) {
|
||||
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&g_obj_lock);
|
||||
}
|
||||
|
||||
int object_add(PCMHI_OBJECT pObj, POBJECT_K pObjK)
|
||||
{
|
||||
int i, pos;
|
||||
PCMHI_OBJECT p;
|
||||
PDT_OBJECT pDt;
|
||||
ADDR_OBJECT pAddr;
|
||||
|
||||
if(!pObj || !pObjK) {
|
||||
LOG_EX(LOG_Error, "Input params error %p, %p\n", pObj, pObjK);
|
||||
return -RET_INPUTERR;
|
||||
}
|
||||
|
||||
pthread_mutex_lock(&g_obj_lock);
|
||||
HASH_FIND_STR(g_pObject, pObj->name, p);
|
||||
pthread_mutex_unlock(&g_obj_lock);
|
||||
|
||||
if(p != NULL) {
|
||||
LOG_EX(LOG_Error, "Item %s exists\n", pObj->name);
|
||||
return -RET_EXIST;
|
||||
}
|
||||
|
||||
pos = get_free_pos();
|
||||
|
||||
if(pos < 0) {
|
||||
|
@ -157,49 +169,55 @@ int object_add(PCMHI_OBJECT pObj, POBJECT_K pObjK)
|
|||
char *pSubStart = NULL, *pSubEnd = NULL;
|
||||
PSVR_OBJECT pSvr = &pObjK->objs.svr_obj[i];
|
||||
PADDR_OBJECT pAddr = &pObjK->objs.addr_obj[i];
|
||||
split_params(pSvr->str_val, &pStart, &pEnd, "-");
|
||||
PDT_OBJECT pDt = &pObjK->objs.dt_obj[i];
|
||||
struct tm tm;
|
||||
|
||||
switch(pObjK->type / 10) {
|
||||
case OBJ_TYPE_SERVER:
|
||||
if(regex_match(REGEX_SVR_PORT, pStart)) {
|
||||
split_params((char*)pSvr->str_val, &pStart, &pEnd, "-");
|
||||
|
||||
if(!pcre_match(REGEX_SVR_PORT, pStart)) {
|
||||
LOG_EX(LOG_Error, "Input %s format error\n", pStart);
|
||||
return -RET_INPUTERR;
|
||||
} else {
|
||||
int first;
|
||||
first = strtoul(pStart, NULL, 10);
|
||||
pSvr->min_port = first;
|
||||
pSvr->max_port = 0;
|
||||
}
|
||||
|
||||
if(pEnd && strlen(pEnd) > 0) {
|
||||
unsigned short first, last;
|
||||
int last;
|
||||
|
||||
if(regex_match(REGEX_SVR_PORT, pEnd)) {
|
||||
if(!pcre_match(REGEX_SVR_PORT, pEnd)) {
|
||||
LOG_EX(LOG_Error, "Input %s format error\n", pEnd);
|
||||
return -RET_INPUTERR;
|
||||
}
|
||||
|
||||
first = strtoul(pStart, NULL, 10) & 0xFFFF;
|
||||
last = strtoul(pEnd, NULL, 10) & 0xFFFF;
|
||||
//first = strtoul(pStart, NULL, 10);
|
||||
last = strtoul(pEnd, NULL, 10);
|
||||
|
||||
if(pSvr->pro_type <= PORT_UDP) {
|
||||
pSvr->min_port = htons(first);
|
||||
pSvr->max_port = htons(last);
|
||||
//pSvr->min_port = htonl(first) & 0xFFFF;
|
||||
pSvr->max_port = last;
|
||||
} else {
|
||||
pSvr->min_port = first;
|
||||
//ICMP , min_port --> type, max_port --> code
|
||||
//pSvr->min_port = first;
|
||||
pSvr->max_port = last;
|
||||
}
|
||||
} else {
|
||||
unsigned short first;
|
||||
first = strtoul(pStart, NULL, 10) & 0xFFFF;
|
||||
pSvr->min_port = htons(first);
|
||||
pSvr->max_port = 0;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case OBJ_TYPE_ADDR:
|
||||
if(regex_match(REGEX_IP_ADDR, pStart)) {
|
||||
split_params((char*)pAddr->str_val, &pStart, &pEnd, "-");
|
||||
|
||||
if(!pcre_match(REGEX_IP_ADDR, pStart)) {
|
||||
LOG_EX(LOG_Error, "Input %s format error\n", pStart);
|
||||
return -RET_INPUTERR;
|
||||
}
|
||||
|
||||
split_params(pStart, &pSubStart, &pSubEnd, "/");
|
||||
split_params((char*)pStart, &pSubStart, &pSubEnd, "/");
|
||||
|
||||
if(pSubEnd && strlen(pSubEnd) > 0) {
|
||||
pAddr->net_mask = strtoul(pSubEnd, NULL, 10);
|
||||
|
@ -214,16 +232,16 @@ int object_add(PCMHI_OBJECT pObj, POBJECT_K pObjK)
|
|||
|
||||
pAddr->ip_version = IP_V4;
|
||||
} else {
|
||||
pAddr->ip_version = IP_V6;
|
||||
|
||||
if(inet_pton(AF_INET6, pSubStart, &pAddr->min_addr.addr_v6.addr.addr8) != 1) {
|
||||
LOG_EX(LOG_Error, "%s convert to ip address error\n", pStart);
|
||||
return -RET_INPUTERR;
|
||||
}
|
||||
|
||||
pAddr->ip_version = IP_V6;
|
||||
}
|
||||
|
||||
if(pEnd && strlen(pEnd) > 0) {
|
||||
if(regex_match(REGEX_IP_ADDR, pEnd)) {
|
||||
if(!pcre_match(REGEX_IP_ADDR, pEnd)) {
|
||||
LOG_EX(LOG_Error, "Input %s format error\n", pEnd);
|
||||
return -RET_INPUTERR;
|
||||
}
|
||||
|
@ -245,23 +263,73 @@ int object_add(PCMHI_OBJECT pObj, POBJECT_K pObjK)
|
|||
break;
|
||||
|
||||
case OBJ_TYPE_DATETIME:
|
||||
split_params((char*)pDt->str_val, &pStart, &pEnd, "-");
|
||||
|
||||
if(!pcre_match(REGEX_DT, pStart)) {
|
||||
LOG_EX(LOG_Error, "Input %s format error\n", pStart);
|
||||
return -RET_INPUTERR;
|
||||
} else {
|
||||
memset(&tm, 0, sizeof(struct tm));
|
||||
|
||||
// YYYY/MM/DD HH:MM 格式
|
||||
if(strlen(pStart) > strlen("00:00")) {
|
||||
strptime(pStart, "%Y/%m/%d %H:%M", &tm);
|
||||
} else {
|
||||
strptime(pStart, "%H:%M", &tm);
|
||||
}
|
||||
|
||||
if(tm.tm_year < 119) {
|
||||
tm.tm_year = 119;
|
||||
}
|
||||
|
||||
if(tm.tm_mday < 1) {
|
||||
tm.tm_mday = 1;
|
||||
}
|
||||
|
||||
pDt->min_time = mktime(&tm);
|
||||
pDt->max_time = 0;
|
||||
}
|
||||
|
||||
if(pEnd && strlen(pEnd) > 0) {
|
||||
|
||||
if(!pcre_match(REGEX_DT, pEnd)) {
|
||||
LOG_EX(LOG_Error, "Input %s format error\n", pEnd);
|
||||
return -RET_INPUTERR;
|
||||
}
|
||||
|
||||
memset(&tm, 0, sizeof(struct tm));
|
||||
|
||||
if(strlen(pEnd) > strlen("00:00")) {
|
||||
strptime(pEnd, "%Y/%m/%d %H:%M", &tm);
|
||||
} else {
|
||||
strptime(pEnd, "%H:%M", &tm);
|
||||
}
|
||||
|
||||
if(tm.tm_year < 119) {
|
||||
tm.tm_year = 119;
|
||||
}
|
||||
|
||||
if(tm.tm_mday < 1) {
|
||||
tm.tm_mday = 1;
|
||||
}
|
||||
|
||||
pDt->max_time = mktime(&tm);
|
||||
}
|
||||
|
||||
//LOG_EX(LOG_Info, " repeat: %d\n", pObjK->objs.dt_obj[j].rep_mode);
|
||||
//LOG_EX(LOG_Info, " value: %s\n", pObjK->objs.dt_obj[j].str_val);
|
||||
break;
|
||||
}
|
||||
|
||||
memcpy(&g_objItem[pos], pObjK, sizeof(OBJECT_K));
|
||||
}
|
||||
|
||||
pObj->obj_index = pos;
|
||||
pthread_mutex_init(&pObj->lock, NULL);
|
||||
|
||||
HASH_FIND_STR(g_pObject, pObj->name, p);
|
||||
|
||||
if(p != NULL) {
|
||||
LOG_EX(LOG_Error, "Item %s exists\n", pObj->name);
|
||||
return -RET_EXIST;
|
||||
}
|
||||
|
||||
pthread_mutex_lock(&g_obj_lock);
|
||||
HASH_ADD_STR(g_pObject, name, pObj);
|
||||
pthread_mutex_unlock(&g_obj_lock);
|
||||
}
|
||||
|
||||
static const char *read_json_file(const char *pPath)
|
||||
|
@ -312,7 +380,7 @@ static void test_add_object(void)
|
|||
|
||||
if(ret != RET_OK || p == NULL) {
|
||||
LOG_EX(LOG_Error, "Decode json error: %d\n", ret);
|
||||
free(pJson);
|
||||
free((void*)pJson);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -328,11 +396,11 @@ static void test_add_object(void)
|
|||
LOG_EX(LOG_Error, "Decode json error: %d\n", ret);
|
||||
|
||||
if(p->msgContent) {
|
||||
free(p->msgContent);
|
||||
free((void*)p->msgContent);
|
||||
}
|
||||
|
||||
free(p);
|
||||
free(pJson);
|
||||
free((void*)pJson);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -363,18 +431,21 @@ static void test_add_object(void)
|
|||
}
|
||||
}
|
||||
|
||||
object_add(&pAdd->pCtx[i].obj, &pAdd->pCtx[i].objk);
|
||||
}
|
||||
|
||||
dump_object();
|
||||
|
||||
if(pAdd) {
|
||||
free(pAdd);
|
||||
}
|
||||
|
||||
if(p->msgContent) {
|
||||
free(p->msgContent);
|
||||
free((void*)p->msgContent);
|
||||
}
|
||||
|
||||
free(p);
|
||||
free(pJson);
|
||||
free((void*)pJson);
|
||||
}
|
||||
|
||||
static void test_strsep(char *pVal)
|
||||
|
@ -383,7 +454,8 @@ static void test_strsep(char *pVal)
|
|||
split_params(pVal, &pStart, &pEnd, "-");
|
||||
|
||||
if(pEnd) {
|
||||
LOG_EX(LOG_Debug, "[%s] Split to First = %s, Second = %s\n", pVal, pStart, pEnd);
|
||||
LOG_EX(LOG_Debug, "[%s] Split to First = %s, Second = %s\n", pVal, pStart,
|
||||
pEnd);
|
||||
} else {
|
||||
LOG_EX(LOG_Debug, "[%s] Split to First = %s\n", pVal, pStart);
|
||||
}
|
||||
|
@ -391,8 +463,13 @@ static void test_strsep(char *pVal)
|
|||
|
||||
static void test_regex(char *pVal)
|
||||
{
|
||||
LOG_EX(LOG_Debug, "Ret : [%s] ==> %d\n", pVal, regex_match(REGEX_IP_ADDR, pVal));
|
||||
//LOG_EX(LOG_Debug, "Ret : [%s] ==> %d\n", pVal, regex_match(REGEX_SVR_PORT, pVal));
|
||||
if(pcre_match(REGEX_IP_ADDR, pVal)) {
|
||||
LOG_EX(LOG_Debug, "[%s] ==> Match\n", pVal);
|
||||
} else {
|
||||
LOG_EX(LOG_Error, "[%s] ==> Not Match\n", pVal);
|
||||
}
|
||||
|
||||
//LOG_EX(LOG_Debug, "Ret : [%s] ==> %d\n", pVal, pcre_match(REGEX_SVR_PORT, pVal));
|
||||
}
|
||||
|
||||
static void test_ipaddr_format(char *pVal)
|
||||
|
@ -404,7 +481,7 @@ static void test_ipaddr_format(char *pVal)
|
|||
memset(&ip_v4, 0, sizeof(IP4_ADDR));
|
||||
memset(&ip_v6, 0, sizeof(IP6_ADDR));
|
||||
|
||||
ret = regex_match(REGEX_IP_ADDR, pVal);
|
||||
ret = pcre_match(REGEX_IP_ADDR, pVal);
|
||||
|
||||
if(ret != TRUE) {
|
||||
LOG_EX(LOG_Error, "Verify ipadd format error\n");
|
||||
|
@ -420,6 +497,41 @@ static void test_ipaddr_format(char *pVal)
|
|||
|
||||
LOG_EX(LOG_Debug, "Convert %s to ip address ret: %d\n", pVal, ret);
|
||||
}
|
||||
|
||||
static void test_str_time(char *pVal)
|
||||
{
|
||||
struct tm tm;
|
||||
char buf[255];
|
||||
|
||||
if(!pVal || strlen(pVal) < 0) {
|
||||
LOG_EX(LOG_Error, "Input params error\n");
|
||||
return;
|
||||
}
|
||||
|
||||
memset(&tm, 0, sizeof(struct tm));
|
||||
strptime(pVal, "%H:%M", &tm);
|
||||
memset(buf, 0, sizeof(buf));
|
||||
LOG_EX(LOG_Debug, "year = %d, month = %d, day = %d\n", tm.tm_year, tm.tm_mon,
|
||||
tm.tm_mday);
|
||||
|
||||
if(tm.tm_year < 119) {
|
||||
tm.tm_year = 119;
|
||||
}
|
||||
|
||||
if(tm.tm_mday < 1) {
|
||||
tm.tm_mday = 1;
|
||||
}
|
||||
|
||||
strftime(buf, sizeof(buf), "%Y/%m/%d %H:%M:%S", &tm);
|
||||
|
||||
LOG_EX(LOG_Debug, "asctime: %s / %d\n", buf, mktime(&tm));
|
||||
|
||||
memset(&tm, 0, sizeof(struct tm));
|
||||
strptime(pVal, "%Y/%m/%d %H:%M", &tm);
|
||||
memset(buf, 0, sizeof(buf));
|
||||
strftime(buf, sizeof(buf), "%Y/%m/%d %H:%M:%S", &tm);
|
||||
LOG_EX(LOG_Debug, "asctime: %s / %d\n", buf, mktime(&tm));
|
||||
}
|
||||
/**
|
||||
* @brief 应用程序主函数
|
||||
* @param argc 输入参数个数
|
||||
|
@ -437,6 +549,7 @@ int main(int argc, char **argv)
|
|||
{ "regex", 1, NULL, 'r' },
|
||||
{ "split_str", 1, NULL, 's' },
|
||||
{ "ip_addr", 1, NULL, 'p' },
|
||||
{ "str_time", 1, NULL, 't' },
|
||||
{NULL, 0, NULL, 0}
|
||||
};
|
||||
|
||||
|
@ -447,8 +560,9 @@ int main(int argc, char **argv)
|
|||
LOG_EX(LOG_Debug, "DT_OBJECT = %u bytes\n", sizeof(DT_OBJECT));
|
||||
LOG_EX(LOG_Debug, "SVR_OBJECT = %u bytes\n", sizeof(SVR_OBJECT));
|
||||
LOG_EX(LOG_Debug, "ADDR_OBJECT = %u bytes\n", sizeof(ADDR_OBJECT));
|
||||
LOG_EX(LOG_Debug, "time_t = %u bytes\n", sizeof(time_t));
|
||||
|
||||
while((c = getopt_long(argc, argv, "hvir:s:p:", long_opts, &optidx)) != -1) {
|
||||
while((c = getopt_long(argc, argv, "hvir:s:p:t:", long_opts, &optidx)) != -1) {
|
||||
switch(c) {
|
||||
case 'v':
|
||||
LOG_EX(LOG_Info, "User demo version: %s(%s)\n", sGATE_GIT_TAGS, sGATE_GIT_VERS);
|
||||
|
@ -479,6 +593,10 @@ int main(int argc, char **argv)
|
|||
case 'p':
|
||||
test_ipaddr_format(optarg);
|
||||
break;
|
||||
|
||||
case 't':
|
||||
test_str_time(optarg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -78,8 +78,8 @@ typedef struct {
|
|||
} SVR_OBJECT, *PSVR_OBJECT;
|
||||
|
||||
typedef struct {
|
||||
unsigned long min_time; ///< 起始时间
|
||||
unsigned long max_time; ///< 终止时间
|
||||
long min_time; ///< 起始时间
|
||||
long max_time; ///< 终止时间
|
||||
REPEAT_MODE rep_mode; ///< 重复模式
|
||||
const char* str_val; ///< 字符串配置值
|
||||
} DT_OBJECT, *PDT_OBJECT;
|
||||
|
|
|
@ -0,0 +1,164 @@
|
|||
|
||||
#include <pcre.h>
|
||||
|
||||
#include "log.h"
|
||||
#include "regex_table.h"
|
||||
|
||||
const char *g_regex_tbl[REGEX_MAX] = {
|
||||
|
||||
"^(([1-9]\\d{0,3})|([1-5]\\d{4})|(6[0-4]\\d{3})|(65[0-4]\\d{2})|(655[0-2]"
|
||||
"\\d)|(6553[0-5]))$",
|
||||
|
||||
"^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?"
|
||||
")(\\/(\\d|[1-2]\\d|3[0-2]))?$|^([\\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\\d"
|
||||
"|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(\\/([1-9]?\\d|(1(["
|
||||
"0-1]\\d|2[0-8]))))?$|^::([\\da-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4]\\d|[01]"
|
||||
"?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(\\/([1-9]?\\d|(1([0-1]"
|
||||
"\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:):([\\da-fA-F]{1,4}:){0,3}((25[0-5]|"
|
||||
"2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(\\/([1-9]"
|
||||
"?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:){2}:([\\da-fA-F]{1,4}:"
|
||||
"){0,2}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?"
|
||||
"\\d\\d?)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:){3}:"
|
||||
"([\\da-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]"
|
||||
"|2[0-4]\\d|[01]?\\d\\d?)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-"
|
||||
"fA-F]{1,4}:){4}:((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]"
|
||||
"\\d|[01]?\\d\\d?)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1"
|
||||
",4}:){7}[\\da-fA-F]{1,4}(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^:((:["
|
||||
"\\da-fA-F]{1,4}){1,6}|:)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^[\\da-f"
|
||||
"A-F]{1,4}:((:[\\da-fA-F]{1,4}){1,5}|:)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8])"
|
||||
")))?$|^([\\da-fA-F]{1,4}:){2}((:[\\da-fA-F]{1,4}){1,4}|:)(\\/([1-9]?\\d|"
|
||||
"(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:){3}((:[\\da-fA-F]{1,4}){1,3"
|
||||
"}|:)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-fA-F]{1,4}:){4}((:["
|
||||
"\\da-fA-F]{1,4}){1,2}|:)(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$|^([\\da-"
|
||||
"fA-F]{1,4}:){5}:([\\da-fA-F]{1,4})?(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))"
|
||||
"?$|^([\\da-fA-F]{1,4}:){6}:(\\/([1-9]?\\d|(1([0-1]\\d|2[0-8]))))?$",
|
||||
|
||||
"^(?:(?!0000)[0-9]{4}\\/(?:(?:0[1-9]|1[0-2])\\/(?:0[1-9]|1[0-9]|2[0-8])|("
|
||||
"?:0[13-9]|1[0-2])\\/(?:29|30)|(?:0[13578]|1[02])\\/31)|(?:[0-9]{2}(?:0[48"
|
||||
"]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)\\/02\\/29"
|
||||
") (20|21|22|23|[0-1][0-9]):[0-5][0-9]$|^(20|21|22|23|[0-1][0-9]):[0-5][0-"
|
||||
"9]$",
|
||||
|
||||
"^(20|21|22|23|[0-1][0-9]):[0-5][0-9]$",
|
||||
};
|
||||
|
||||
int pcre_match(int regId, const char *pStr)
|
||||
{
|
||||
pcre *re;
|
||||
pcre_extra *pcreExtra;
|
||||
const char *error;
|
||||
int ret, erroffset;
|
||||
|
||||
if(regId < 0 || regId > REGEX_MAX || !pStr) {
|
||||
LOG_EX(LOG_Error, "Input params error: %d, %p\n", regId, pStr);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
re = pcre_compile(g_regex_tbl[regId], 0, &error, &erroffset, NULL);
|
||||
|
||||
if(!re) {
|
||||
LOG_EX(LOG_Error, "pcre_compile error at %d: %s, %s\n", erroffset,
|
||||
g_regex_tbl[regId], error);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pcreExtra = pcre_study(re, 0, &error);
|
||||
|
||||
if(error != NULL) {
|
||||
LOG_EX(LOG_Error, "pcre_study error: %s, %s\n", g_regex_tbl[regId], error);
|
||||
pcre_free(re);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ret = pcre_exec(re,
|
||||
pcreExtra,
|
||||
pStr,
|
||||
strlen(pStr), // length of string
|
||||
0, // Start looking at this point
|
||||
0, // OPTIONS
|
||||
NULL,
|
||||
0); // Length of subStrVec
|
||||
|
||||
if(ret < 0) {
|
||||
switch(ret) {
|
||||
case PCRE_ERROR_NOMATCH :
|
||||
LOG_EX(LOG_Error, "[%s] String did not match the pattern\n", pStr);
|
||||
break;
|
||||
|
||||
case PCRE_ERROR_NULL :
|
||||
LOG_EX(LOG_Error, "[%s] Something was null\n", pStr);
|
||||
break;
|
||||
|
||||
case PCRE_ERROR_BADOPTION :
|
||||
LOG_EX(LOG_Error, "[%s] A bad option was passed\n", pStr);
|
||||
break;
|
||||
|
||||
case PCRE_ERROR_BADMAGIC :
|
||||
LOG_EX(LOG_Error, "Magic number bad (compiled re corrupt?)\n");
|
||||
break;
|
||||
|
||||
case PCRE_ERROR_UNKNOWN_NODE :
|
||||
LOG_EX(LOG_Error, "[%s] Something kooky in the compiled re\n", pStr);
|
||||
break;
|
||||
|
||||
case PCRE_ERROR_NOMEMORY :
|
||||
LOG_EX(LOG_Error, "[%s] Ran out of memory\n", pStr);
|
||||
break;
|
||||
|
||||
default :
|
||||
LOG_EX(LOG_Error, "[%s] Unknown error\n", pStr);
|
||||
break;
|
||||
} /* end switch */
|
||||
} else {
|
||||
ret = TRUE;
|
||||
}
|
||||
|
||||
pcre_free(re);
|
||||
|
||||
if(pcreExtra != NULL) {
|
||||
#ifdef PCRE_CONFIG_JIT
|
||||
pcre_free_study(pcreExtra);
|
||||
#else
|
||||
pcre_free(pcreExtra);
|
||||
#endif
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if 0
|
||||
int regex_match(const char *regex, const char *pStr)
|
||||
{
|
||||
int result = FALSE;
|
||||
regex_t reg;
|
||||
int regexInit;
|
||||
|
||||
if(!regex || !pStr) {
|
||||
LOG_EX(LOG_Error, "Input params error: %p, %p\n", regex, pStr);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
regexInit = regcomp(®, regex, REG_EXTENDED);
|
||||
|
||||
if(regexInit) {
|
||||
LOG_EX(LOG_Error, "regcomp error\n");
|
||||
return FALSE;
|
||||
} else {
|
||||
int reti = regexec(®, pStr, 0, NULL, 0);
|
||||
|
||||
if(REG_NOERROR != reti) {
|
||||
char buf[1024];
|
||||
memset(buf, 0, 1024);
|
||||
//Error print: match failed!
|
||||
regerror(reti, regexInit, buf, 1024);
|
||||
LOG_EX(LOG_Error, "%s match %s failed(%d): %s\n", regex, pStr, reti, buf);
|
||||
} else {
|
||||
//LOG_EX(LOG_Debug, "%s match %s OK\n", regex, pStr);
|
||||
result = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
regfree(®);
|
||||
return result;
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,22 @@
|
|||
#ifndef _REGEX_TABLE_H
|
||||
#define _REGEX_TABLE_H
|
||||
|
||||
typedef enum {
|
||||
REGEX_SVR_PORT = 0,
|
||||
REGEX_IP_ADDR = 1,
|
||||
REGEX_DT = 2,
|
||||
REGEX_TIME = 3,
|
||||
|
||||
// add before this line
|
||||
REGEX_MAX
|
||||
} REGEX_TBL_ID;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
int pcre_match(int regId, const char *pStr);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
Loading…
Reference in New Issue