#include #include #include #include #include #include #include #include #include #include #include "compile.h" #include "log.h" #include "object_manager.h" #include "json_interface.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; } 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; } LOG_EX(LOG_Debug, "[%s] Split to First = %s, Second = %s\n", pInput, *pFirst, *pSecond); 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 prase_port_object(PSVR_OBJECT pSvr) { int i = 0; if(!pSvr) { return; } for(i = 0; i < strlen(pSvr->str_val); i++) { //if(pSvr->str_val[i] >) } if(strchr(pSvr->str_val, ',') != NULL) { } else if(strchr(pSvr->str_val, '-') != NULL) { } } 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; } 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]; split_params(pSvr->str_val, &pStart, &pEnd, "-"); switch(pObjK->type / 10) { case OBJ_TYPE_SERVER: if(regex_match(REGEX_SVR_PORT, pStart)) { LOG_EX(LOG_Error, "Input %s format error\n", pStart); return -RET_INPUTERR; } if(pEnd && strlen(pEnd) > 0) { unsigned short first, last; if(regex_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; if(pSvr->pro_type <= PORT_UDP) { pSvr->min_port = htons(first); pSvr->max_port = htons(last); } else { 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)) { LOG_EX(LOG_Error, "Input %s format error\n", pStart); return -RET_INPUTERR; } split_params(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 { 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; } } if(pEnd && strlen(pEnd) > 0) { if(regex_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: //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; } } 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; } HASH_ADD_STR(g_pObject, name, pObj); } 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_add_object(void) { PJSON_INTERFACE p = NULL; PIFACE_ADD_OBJ pAdd = NULL; int i, j, ret; const char *pJson = read_json_file(ADD_JS_FILE); ret = Json2Struct(pJson, &p, JE_INTERFACE, FALSE); if(ret != RET_OK || p == NULL) { LOG_EX(LOG_Error, "Decode json error: %d\n", ret); free(pJson); 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) { LOG_EX(LOG_Error, "Decode json error: %d\n", ret); if(p->msgContent) { free(p->msgContent); } free(p); free(pJson); return; } for(i = 0; i < pAdd->n_obj; i++) { LOG_EX(LOG_Info, "name: %s\n", pAdd->pCtx[i].obj.name); LOG_EX(LOG_Info, "desc: %s\n", pAdd->pCtx[i].obj.desc); LOG_EX(LOG_Info, "prio: %d\n", pAdd->pCtx[i].obj.prio); LOG_EX(LOG_Info, "type: %d\n", pAdd->pCtx[i].objk.type); LOG_EX(LOG_Info, "items: %d\n", pAdd->pCtx[i].objk.ctx_num); for(j = 0; j < pAdd->pCtx[i].objk.ctx_num; j++) { POBJECT_K pObjK = &pAdd->pCtx[i].objk; switch(pObjK->type / 10) { case OBJ_TYPE_SERVER: LOG_EX(LOG_Info, " porType: %d\n", pObjK->objs.svr_obj[j].pro_type); LOG_EX(LOG_Info, " value: %s\n", pObjK->objs.svr_obj[j].str_val); break; case OBJ_TYPE_ADDR: LOG_EX(LOG_Info, " value: %s\n", pObjK->objs.addr_obj[j].str_val); break; case OBJ_TYPE_DATETIME: 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; } } } if(pAdd) { free(pAdd); } if(p->msgContent) { free(p->msgContent); } free(p); free(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) { 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)); } 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 = regex_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); } /** * @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' }, {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)); while((c = getopt_long(argc, argv, "hvir:s:p:", 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(); break; case 's': test_strsep(optarg); break; case 'r': test_regex(optarg); break; case 'p': test_ipaddr_format(optarg); break; } } while(TRUE) { sleep(1); } return 0; }