secgateway/Product/user/object_manager/main.c

1189 lines
37 KiB
C
Raw Normal View History

#include <stdio.h>
#include <unistd.h>
#include <getopt.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <regex.h>
#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 DEL_JS_FILE ("/home/hx/secogateway/Product/user/object_manager/json_test/del.json")
#define MOD_JS_FILE ("/home/hx/secogateway/Product/user/object_manager/json_test/mod.json")
static PCMHI_OBJECT g_pObject = NULL;
static OBJECT_K g_objItem[MAX_OBJ];
static pthread_mutex_t g_obj_lock = PTHREAD_MUTEX_INITIALIZER;
static int split_params(char *pInput, char **pFirst, char **pSecond,
const char *split)
{
char *pStr = (char *)pInput;
char *p;
if(!pInput || !pFirst || !pSecond) {
LOG_EX(LOG_Error, "Input params error: %p, %p, %p\n", pInput, pFirst, pSecond);
return -RET_INPUTERR;
}
p = strsep(&pStr, split);
if(strlen(p) == 0) {
*pFirst = pInput;
*pSecond = NULL;
} else {
*pFirst = p;
*pSecond = pStr;
}
return RET_OK;
}
static int get_free_pos(void)
{
int i;
for(i = 0; i < MAX_OBJ; i++) {
if(strlen(g_objItem[i].memTag) == 0) {
return i;
}
}
return -1;
}
static void dump_object(void)
{
int i;
PCMHI_OBJECT pObj, pTmp;
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++) {
struct tm* pTm;
char buf[256];
time_t t;
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]);
}
break;
case OBJ_TYPE_DATETIME:
LOG_EX(LOG_Info, " repeat: %d\n", pObjK->objs.dt_obj[i].rep_mode);
t = pObjK->objs.dt_obj[i].min_time;
pTm = localtime(&t);
memset(buf, 0, 256);
strftime(buf, sizeof(buf), "%Y/%m/%d %H:%M:%S", pTm);
LOG_EX(LOG_Info, " min time: %ld[%s]\n", pObjK->objs.dt_obj[i].min_time, buf);
t = pObjK->objs.dt_obj[i].max_time;
pTm = localtime(&t);
memset(buf, 0, 256);
strftime(buf, sizeof(buf), "%Y/%m/%d %H:%M:%S", pTm);
LOG_EX(LOG_Info, " max time: %ld[%s]\n", pObjK->objs.dt_obj[i].max_time, buf);
break;
}
}
}
pthread_mutex_unlock(&g_obj_lock);
}
int object_add(PCMHI_OBJECT pObj, POBJECT_K pObjK)
{
int i, pos;
PCMHI_OBJECT p;
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) {
LOG_EX(LOG_Error, "Share memory full\n");
return -RET_NOMEM;
}
strcpy(pObjK->memTag, OBJ_MEM_TAG);
for(i = 0; i < pObjK->ctx_num && i < MAX_OBJ_CONTENT; i++) {
char *pStart = NULL, *pEnd = NULL;
char *pSubStart = NULL, *pSubEnd = NULL;
PSVR_OBJECT pSvr = &pObjK->objs.svr_obj[i];
PADDR_OBJECT pAddr = &pObjK->objs.addr_obj[i];
PDT_OBJECT pDt = &pObjK->objs.dt_obj[i];
struct tm tm;
switch(pObjK->type / 10) {
case OBJ_TYPE_SERVER:
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) {
int last;
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);
last = strtoul(pEnd, NULL, 10);
if(pSvr->pro_type <= PORT_UDP) {
//pSvr->min_port = htonl(first) & 0xFFFF;
pSvr->max_port = last;
} else {
//ICMP , min_port --> type, max_port --> code
//pSvr->min_port = first;
pSvr->max_port = last;
}
}
break;
case OBJ_TYPE_ADDR:
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((char *)pStart, &pSubStart, &pSubEnd, "/");
if(pSubEnd && strlen(pSubEnd) > 0) {
pAddr->net_mask = strtoul(pSubEnd, NULL, 10);
}
// IPv4 格式
if(strchr(pStart, ':') == NULL) {
if(inet_pton(AF_INET, pSubStart, &pAddr->min_addr.addr_v4.ip4_addr) != 1) {
LOG_EX(LOG_Error, "%s convert to ip address error\n", pStart);
return -RET_INPUTERR;
}
pAddr->ip_version = IP_V4;
} else {
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(!pcre_match(REGEX_IP_ADDR, pEnd)) {
LOG_EX(LOG_Error, "Input %s format error\n", pEnd);
return -RET_INPUTERR;
}
if(pAddr->ip_version == IP_V4) {
if(inet_pton(AF_INET, pEnd, &pAddr->max_addr.addr_v4.ip4_addr) != 1) {
LOG_EX(LOG_Error, "%s convert to ip address error\n", pEnd);
return -RET_INPUTERR;
}
} else {
if(inet_pton(AF_INET6, pEnd, &pAddr->max_addr.addr_v6.addr.addr8) != 1) {
LOG_EX(LOG_Error, "%s convert to ip address error\n", pEnd);
return -RET_INPUTERR;
}
}
}
//LOG_EX(LOG_Info, " value: %s\n", pObjK->objs.addr_obj[j].str_val);
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);
pthread_mutex_lock(&g_obj_lock);
HASH_ADD_STR(g_pObject, name, pObj);
pthread_mutex_unlock(&g_obj_lock);
return RET_OK;
}
int object_del(const char *pName)
{
int i;
PCMHI_OBJECT p, pTmp;
if(!pName || strlen(pName) == 0) {
return -RET_INPUTERR;
}
pthread_mutex_lock(&g_obj_lock);
HASH_FIND_STR(g_pObject, pName, p);
pthread_mutex_unlock(&g_obj_lock);
if(p == NULL) {
LOG_EX(LOG_Error, "Item %s not exists\n", pName);
return -RET_NOTFOUND;
}
if(g_objItem[p->obj_index].ref_count > 0) {
LOG_EX(LOG_Error, "Item %s used %d\n", p->name,
g_objItem[p->obj_index].ref_count);
return -RET_USED;
}
pthread_mutex_lock(&g_obj_lock);
HASH_DEL(g_pObject, p);
pthread_mutex_unlock(&g_obj_lock);
for(i = 0; i < g_objItem[p->obj_index].ctx_num && i < MAX_OBJ_CONTENT; i++) {
PSVR_OBJECT pSvr = &g_objItem[p->obj_index].objs.svr_obj[i];
PADDR_OBJECT pAddr = &g_objItem[p->obj_index].objs.addr_obj[i];
PDT_OBJECT pDt = &g_objItem[p->obj_index].objs.dt_obj[i];
switch(g_objItem[p->obj_index].type / 10) {
case OBJ_TYPE_SERVER:
if(pSvr->str_val) {
free(pSvr->str_val);
}
break;
case OBJ_TYPE_ADDR:
if(pAddr->str_val) {
free(pAddr->str_val);
}
break;
case OBJ_TYPE_DATETIME:
if(pDt->str_val) {
free(pDt->str_val);
}
break;
}
}
memset(&g_objItem[p->obj_index], 0, sizeof(OBJECT_K));
free(p);
return RET_OK;
}
int object_mod(PCMHI_OBJECT pObj, POBJECT_K pObjK)
{
int i;
PCMHI_OBJECT p;
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 not exists\n", pObj->name);
return -RET_EXIST;
}
memset(p->desc, 0, MAX_DESC);
strncpy(p->desc, pObj->desc, MAX_DESC - 1);
// 清理缓存的配置命令资源
for(i = 0; i < g_objItem[p->obj_index].ctx_num && i < MAX_OBJ_CONTENT; i++) {
PSVR_OBJECT pSvr = &g_objItem[p->obj_index].objs.svr_obj[i];
PADDR_OBJECT pAddr = &g_objItem[p->obj_index].objs.addr_obj[i];
PDT_OBJECT pDt = &g_objItem[p->obj_index].objs.dt_obj[i];
switch(g_objItem[p->obj_index].type / 10) {
case OBJ_TYPE_SERVER:
if(pSvr->str_val) {
free(pSvr->str_val);
}
break;
case OBJ_TYPE_ADDR:
if(pAddr->str_val) {
free(pAddr->str_val);
}
break;
case OBJ_TYPE_DATETIME:
if(pDt->str_val) {
free(pDt->str_val);
}
break;
}
}
for(i = 0; i < pObjK->ctx_num && i < MAX_OBJ_CONTENT; i++) {
char *pStart = NULL, *pEnd = NULL;
char *pSubStart = NULL, *pSubEnd = NULL;
PSVR_OBJECT pSvr = &pObjK->objs.svr_obj[i];
PADDR_OBJECT pAddr = &pObjK->objs.addr_obj[i];
PDT_OBJECT pDt = &pObjK->objs.dt_obj[i];
struct tm tm;
switch(pObjK->type / 10) {
case OBJ_TYPE_SERVER:
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) {
int last;
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);
last = strtoul(pEnd, NULL, 10);
if(pSvr->pro_type <= PORT_UDP) {
//pSvr->min_port = htonl(first) & 0xFFFF;
pSvr->max_port = last;
} else {
//ICMP , min_port --> type, max_port --> code
//pSvr->min_port = first;
pSvr->max_port = last;
}
}
break;
case OBJ_TYPE_ADDR:
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((char *)pStart, &pSubStart, &pSubEnd, "/");
if(pSubEnd && strlen(pSubEnd) > 0) {
pAddr->net_mask = strtoul(pSubEnd, NULL, 10);
}
// IPv4 格式
if(strchr(pStart, ':') == NULL) {
if(inet_pton(AF_INET, pSubStart, &pAddr->min_addr.addr_v4.ip4_addr) != 1) {
LOG_EX(LOG_Error, "%s convert to ip address error\n", pStart);
return -RET_INPUTERR;
}
pAddr->ip_version = IP_V4;
} else {
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(!pcre_match(REGEX_IP_ADDR, pEnd)) {
LOG_EX(LOG_Error, "Input %s format error\n", pEnd);
return -RET_INPUTERR;
}
if(pAddr->ip_version == IP_V4) {
if(inet_pton(AF_INET, pEnd, &pAddr->max_addr.addr_v4.ip4_addr) != 1) {
LOG_EX(LOG_Error, "%s convert to ip address error\n", pEnd);
return -RET_INPUTERR;
}
} else {
if(inet_pton(AF_INET6, pEnd, &pAddr->max_addr.addr_v6.addr.addr8) != 1) {
LOG_EX(LOG_Error, "%s convert to ip address error\n", pEnd);
return -RET_INPUTERR;
}
}
}
//LOG_EX(LOG_Info, " value: %s\n", pObjK->objs.addr_obj[j].str_val);
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;
}
}
p->prio = pObj->prio;
g_objItem[p->obj_index].ctx_num = pObjK->ctx_num;
g_objItem[p->obj_index].type = pObjK->type;
memcpy(&g_objItem[p->obj_index].objs, &pObjK->objs, sizeof(g_objItem[p->obj_index].objs));
return RET_OK;
}
static const char *read_json_file(const char *pPath)
{
FILE *pFile;
unsigned char *pBuf;
int f_size = 0;
GET_FILE_SIZE(pPath, f_size);
if(f_size <= 0) {
LOG_EX(LOG_Error, "Get file %p size error: %d\n", pPath, f_size);
return NULL;
}
pBuf = (unsigned char *)malloc(f_size + 1);
if(!pBuf) {
LOG_EX(LOG_Error, "Malloc %d bytes memory error: %d\n", f_size + 1);
return NULL;
}
pFile = fopen(pPath, "r");
if(!pFile) {
LOG_EX(LOG_Error, "Open file %p size error\n", pPath);
free(pBuf);
return NULL;
}
fread(pBuf, 1, f_size, pFile);
fclose(pFile);
pBuf[f_size] = 0;
return (const char *)pBuf;
}
static void test_del_object(void)
{
int i, ret;
const char *pRetJson;
IFC_RET_MSG retCtx;
PIFACE_DEL_OBJ pDel = NULL;
PJSON_INTERFACE p = NULL;
const char *pJson = read_json_file(DEL_JS_FILE);
ret = Json2Struct(pJson, &p, JE_INTERFACE, FALSE);
memset(&retCtx, 0, sizeof(IFC_RET_MSG));
if(ret != RET_OK || p == NULL) {
LOG_EX(LOG_Error, "Decode json error: %d\n", ret);
free((void *)pJson);
if(p) {
if(p->msgContent) {
free((void *)p->msgContent);
}
free(p);
}
retCtx.ret_code = -RET_JSONERR;
retCtx.mesg = get_err_message(RET_JSONERR);
retCtx.n_items = 0;
pRetJson = Struct2Json(&retCtx, JE_OBJ_DEL, FALSE, &ret);
if(!pRetJson || ret != RET_OK) {
LOG_EX(LOG_Error, "Json format error: %d\n", ret);
return;
}
LOG_EX(LOG_Debug, "Respons:\n%s\n", pRetJson);
free((void *)pRetJson);
return;
}
LOG_EX(LOG_Info, "cmdId: %d\n", p->cmdId);
LOG_EX(LOG_Info, "ver: %d\n", p->ver);
LOG_EX(LOG_Info, "cryptoType: %d\n", p->cryptoType);
LOG_EX(LOG_Info, "timeStamp: %d\n", p->timeStamp);
LOG_EX(LOG_Info, "msgContent: %s\n", p->msgContent);
ret = Json2Struct(p->msgContent, &pDel, JE_OBJ_DEL, FALSE);
if(ret != RET_OK || pDel == NULL) {
LOG_EX(LOG_Error, "Decode json error: %d\n", ret);
if(pDel) {
free(pDel);
}
if(p->msgContent) {
free((void *)p->msgContent);
}
free(p);
free((void *)pJson);
retCtx.ret_code = -RET_JSONERR;
retCtx.mesg = get_err_message(RET_JSONERR);
retCtx.n_items = 0;
pRetJson = Struct2Json(&retCtx, JE_OBJ_DEL, FALSE, &ret);
if(!pRetJson || ret != RET_OK) {
LOG_EX(LOG_Error, "Json format error: %d\n", ret);
return;
}
LOG_EX(LOG_Debug, "Respons:\n%s\n", pRetJson);
free((void *)pRetJson);
return;
} else {
retCtx.n_items = pDel->n_obj;
}
for(i = 0; i < pDel->n_obj; i++) {
ret = object_del(pDel->name[i]);
if(ret != RET_OK && retCtx.ret_code == RET_OK) {
retCtx.ret_code = ret;
}
retCtx.data[i].name = pDel->name[i];
retCtx.data[i].ret_code = ret;
retCtx.data[i].mesg = get_err_message(ret);
}
dump_object();
retCtx.mesg = get_err_message(retCtx.ret_code);
pRetJson = Struct2Json(&retCtx, JE_OBJ_DEL, FALSE, &ret);
if(!pRetJson || ret != RET_OK) {
LOG_EX(LOG_Error, "Json format error: %d\n", ret);
if(pRetJson) {
free((void *)pRetJson);
}
free(pDel);
if(p->msgContent) {
free((void *)p->msgContent);
}
free(p);
free((void *)pJson);
return;
}
LOG_EX(LOG_Debug, "Respons:\n%s\n", pRetJson);
free((void *)pRetJson);
free(pDel);
if(p->msgContent) {
free((void *)p->msgContent);
}
free(p);
free((void *)pJson);
}
static void test_add_object(void)
{
int i, ret;
const char *pRetJson;
IFC_RET_MSG retCtx;
PJSON_INTERFACE p = NULL;
PIFACE_ADD_OBJ pAdd = NULL;
const char *pJson = read_json_file(ADD_JS_FILE);
ret = Json2Struct(pJson, &p, JE_INTERFACE, FALSE);
memset(&retCtx, 0, sizeof(IFC_RET_MSG));
if(ret != RET_OK || p == NULL) {
LOG_EX(LOG_Error, "Decode json error: %d\n", ret);
free((void *)pJson);
if(p) {
if(p->msgContent) {
free((void *)p->msgContent);
}
free(p);
}
retCtx.ret_code = -RET_JSONERR;
retCtx.mesg = get_err_message(RET_JSONERR);
retCtx.n_items = 0;
pRetJson = Struct2Json(&retCtx, JE_OBJ_ADD, FALSE, &ret);
if(!pRetJson || ret != RET_OK) {
LOG_EX(LOG_Error, "Json format error: %d\n", ret);
return;
}
LOG_EX(LOG_Debug, "Respons:\n%s\n", pRetJson);
free((void *)pRetJson);
return;
}
LOG_EX(LOG_Info, "cmdId: %d\n", p->cmdId);
LOG_EX(LOG_Info, "ver: %d\n", p->ver);
LOG_EX(LOG_Info, "cryptoType: %d\n", p->cryptoType);
LOG_EX(LOG_Info, "timeStamp: %d\n", p->timeStamp);
LOG_EX(LOG_Info, "msgContent: %s\n", p->msgContent);
ret = Json2Struct(p->msgContent, &pAdd, JE_OBJ_ADD, FALSE);
if(ret != RET_OK || pAdd == NULL || pAdd->pCtx == NULL) {
LOG_EX(LOG_Error, "Decode json error: %d\n", ret);
if(pAdd) {
if(pAdd->pCtx) {
free(pAdd->pCtx);
}
free(pAdd);
}
if(p->msgContent) {
free((void *)p->msgContent);
}
free(p);
free((void *)pJson);
retCtx.ret_code = -RET_JSONERR;
retCtx.mesg = get_err_message(RET_JSONERR);
retCtx.n_items = 0;
pRetJson = Struct2Json(&retCtx, JE_OBJ_ADD, FALSE, &ret);
if(!pRetJson || ret != RET_OK) {
LOG_EX(LOG_Error, "Json format error: %d\n", ret);
return;
}
LOG_EX(LOG_Debug, "Respons:\n%s\n", pRetJson);
free((void *)pRetJson);
return;
} else {
retCtx.n_items = pAdd->n_obj;
}
for(i = 0; i < pAdd->n_obj; i++) {
LOG_EX(LOG_Debug, "%d: %s\n", i, pAdd->pCtx[i].pObj->name);
ret = object_add(pAdd->pCtx[i].pObj, &pAdd->pCtx[i].objk);
if(ret != RET_OK && retCtx.ret_code == RET_OK) {
retCtx.ret_code = ret;
}
retCtx.data[i].name = pAdd->pCtx[i].pObj->name;
retCtx.data[i].ret_code = ret;
retCtx.data[i].mesg = get_err_message(ret);
}
dump_object();
retCtx.mesg = get_err_message(retCtx.ret_code);
pRetJson = Struct2Json(&retCtx, JE_OBJ_ADD, FALSE, &ret);
if(!pRetJson || ret != RET_OK) {
LOG_EX(LOG_Error, "Json format error: %d\n", ret);
if(pRetJson) {
free((void *)pRetJson);
}
if(pAdd->pCtx) {
free(pAdd->pCtx);
}
free(pAdd);
if(p->msgContent) {
free((void *)p->msgContent);
}
free(p);
free((void *)pJson);
return;
}
LOG_EX(LOG_Debug, "Respons:\n%s\n", pRetJson);
free((void *)pRetJson);
if(pAdd->pCtx) {
free(pAdd->pCtx);
}
free(pAdd);
if(p->msgContent) {
free((void *)p->msgContent);
}
free(p);
free((void *)pJson);
}
static void test_mod_object(void)
{
int i, ret;
const char *pRetJson;
IFC_RET_MSG retCtx;
PJSON_INTERFACE p = NULL;
PIFACE_ADD_OBJ pAdd = NULL;
const char *pJson = read_json_file(MOD_JS_FILE);
ret = Json2Struct(pJson, &p, JE_INTERFACE, FALSE);
memset(&retCtx, 0, sizeof(IFC_RET_MSG));
if(ret != RET_OK || p == NULL) {
LOG_EX(LOG_Error, "Decode json error: %d\n", ret);
free((void *)pJson);
if(p) {
if(p->msgContent) {
free((void *)p->msgContent);
}
free(p);
}
retCtx.ret_code = -RET_JSONERR;
retCtx.mesg = get_err_message(RET_JSONERR);
retCtx.n_items = 0;
pRetJson = Struct2Json(&retCtx, JE_OBJ_ADD, FALSE, &ret);
if(!pRetJson || ret != RET_OK) {
LOG_EX(LOG_Error, "Json format error: %d\n", ret);
return;
}
LOG_EX(LOG_Debug, "Respons:\n%s\n", pRetJson);
free((void *)pRetJson);
return;
}
LOG_EX(LOG_Info, "cmdId: %d\n", p->cmdId);
LOG_EX(LOG_Info, "ver: %d\n", p->ver);
LOG_EX(LOG_Info, "cryptoType: %d\n", p->cryptoType);
LOG_EX(LOG_Info, "timeStamp: %d\n", p->timeStamp);
LOG_EX(LOG_Info, "msgContent: %s\n", p->msgContent);
ret = Json2Struct(p->msgContent, &pAdd, JE_OBJ_ADD, FALSE);
if(ret != RET_OK || pAdd == NULL || pAdd->pCtx == NULL) {
LOG_EX(LOG_Error, "Decode json error: %d\n", ret);
if(pAdd) {
if(pAdd->pCtx) {
free(pAdd->pCtx);
}
free(pAdd);
}
if(p->msgContent) {
free((void *)p->msgContent);
}
free(p);
free((void *)pJson);
retCtx.ret_code = -RET_JSONERR;
retCtx.mesg = get_err_message(RET_JSONERR);
retCtx.n_items = 0;
pRetJson = Struct2Json(&retCtx, JE_OBJ_ADD, FALSE, &ret);
if(!pRetJson || ret != RET_OK) {
LOG_EX(LOG_Error, "Json format error: %d\n", ret);
return;
}
LOG_EX(LOG_Debug, "Respons:\n%s\n", pRetJson);
free((void *)pRetJson);
return;
} else {
retCtx.n_items = pAdd->n_obj;
}
for(i = 0; i < pAdd->n_obj; i++) {
LOG_EX(LOG_Debug, "%d: %s\n", i, pAdd->pCtx[i].pObj->name);
ret = object_mod(pAdd->pCtx[i].pObj, &pAdd->pCtx[i].objk);
if(ret != RET_OK && retCtx.ret_code == RET_OK) {
retCtx.ret_code = ret;
}
retCtx.data[i].name = pAdd->pCtx[i].pObj->name;
retCtx.data[i].ret_code = ret;
retCtx.data[i].mesg = get_err_message(ret);
}
dump_object();
retCtx.mesg = get_err_message(retCtx.ret_code);
pRetJson = Struct2Json(&retCtx, JE_OBJ_ADD, FALSE, &ret);
if(!pRetJson || ret != RET_OK) {
LOG_EX(LOG_Error, "Json format error: %d\n", ret);
if(pRetJson) {
free((void *)pRetJson);
}
if(pAdd->pCtx) {
free(pAdd->pCtx);
}
free(pAdd);
if(p->msgContent) {
free((void *)p->msgContent);
}
free(p);
free((void *)pJson);
return;
}
LOG_EX(LOG_Debug, "Respons:\n%s\n", pRetJson);
free((void *)pRetJson);
if(pAdd->pCtx) {
free(pAdd->pCtx);
}
free(pAdd);
if(p->msgContent) {
free((void *)p->msgContent);
}
free(p);
free((void *)pJson);
}
static void test_strsep(char *pVal)
{
char *pStart = NULL, *pEnd = NULL;
split_params(pVal, &pStart, &pEnd, "-");
if(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);
}
}
static void test_regex(char *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)
{
int ret = 0;
IP4_ADDR ip_v4;
IP6_ADDR ip_v6;
memset(&ip_v4, 0, sizeof(IP4_ADDR));
memset(&ip_v6, 0, sizeof(IP6_ADDR));
ret = pcre_match(REGEX_IP_ADDR, pVal);
if(ret != TRUE) {
LOG_EX(LOG_Error, "Verify ipadd format error\n");
}
if(strchr(pVal, ':') == NULL) {
ret = inet_pton(AF_INET, pVal, &ip_v4.ip4_addr);
print_hex_dump_bytes("IP", 0, &ip_v4, sizeof(IP4_ADDR));
} else {
ret = inet_pton(AF_INET6, pVal, ip_v6.addr.addr8);
print_hex_dump_bytes("IP", 0, &ip_v6, sizeof(IP6_ADDR));
}
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
* @param argv
* @return 0
*/
int main(int argc, char **argv)
{
int c, optidx = 0;
static const struct option long_opts[] = {
{ "help", no_argument, NULL, 'h' },
{ "version", no_argument, NULL, 'v' },
// TODO 添加其它需要处理的参数配置
{ "interface", no_argument, NULL, 'i' },
{ "regex", 1, NULL, 'r' },
{ "split_str", 1, NULL, 's' },
{ "ip_addr", 1, NULL, 'p' },
{ "str_time", 1, NULL, 't' },
{NULL, 0, NULL, 0}
};
IHW_InitLOG("obj", NULL, TRUE);
LOG_EX(LOG_Debug, "OBJECT_K = %u bytes\n", sizeof(OBJECT_K));
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));
LOG_EX(LOG_Debug, "g_objItem[0].objs = %u bytes\n", sizeof(g_objItem[0].objs));
LOG_EX(LOG_Debug, "DT_OBJECT = %u bytes\n", sizeof(DT_OBJECT) * MAX_OBJ_CONTENT);
LOG_EX(LOG_Debug, "SVR_OBJECT = %u bytes\n", sizeof(SVR_OBJECT) * MAX_OBJ_CONTENT);
LOG_EX(LOG_Debug, "ADDR_OBJECT = %u bytes\n", sizeof(ADDR_OBJECT) * MAX_OBJ_CONTENT);
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);
break;
case '?':
case 'h':
LOG_EX2(LOG_Info, "Usage: %s [-h] [-v] ...\n", argv[0]);
LOG_EX2(LOG_Info, "options:\n");
LOG_EX2(LOG_Info, "\t-v, --version show program version\n");
LOG_EX2(LOG_Info, "\t-h, --help print this message\n");
LOG_EX2(LOG_Info, "\t-i, --interface test object add interface\n");
break;
//TODO 添加其它必要处理参数过程
case 'i':
test_add_object();
//test_del_object();
test_mod_object();
break;
case 's':
test_strsep(optarg);
break;
case 'r':
test_regex(optarg);
break;
case 'p':
test_ipaddr_format(optarg);
break;
case 't':
test_str_time(optarg);
break;
}
}
while(TRUE) {
sleep(1);
}
return 0;
}