diff --git a/config/vcpe.cfg b/config/vcpe.cfg index 2720bcd..071b160 100644 --- a/config/vcpe.cfg +++ b/config/vcpe.cfg @@ -12,6 +12,10 @@ application: system_info_refresh = 10; # 硬件信息监控刷新频率(秒) }; + agent: { + iptv_report_url = "http://127.0.0.1:50012/vcpe/dhcp/info"; # IPTV 设备上报接口 + }; + # 硬件监控相关配置内容 watch_params: { diff --git a/srcs/libs/configure/config.c b/srcs/libs/configure/config.c index 377318d..cad25ea 100644 --- a/srcs/libs/configure/config.c +++ b/srcs/libs/configure/config.c @@ -65,6 +65,8 @@ static CFG_ITEM g_cfgItem[] = { DEF_CFG_ITEM(CFG_BANNER_SHOW, "system.show_banner", VAL_BOOL, "1", "Enable/Disable show banner"), DEF_CFG_ITEM(CFG_HARDWARE_WATCH, "system.system_info_watch", VAL_BOOL, "1", "Monitor cpu, memory, disk, fan, temperature ..."), DEF_CFG_ITEM(CFG_HARDWARE_REFRESH, "system.system_info_refresh", VAL_INT, "10", "Monitor hardware information upgrade frequency"), + // Agent 配置 + DEF_CFG_ITEM(CFG_AGENT_IPTV_POST_URL, "agent.iptv_report_url", VAL_STR, "", "IPTV report URL"), /* 系统监控设备相配置 */ DEF_CFG_ITEM(CFG_WATCH_CPU, "watch_params.cpu", VAL_BOOL, "1", "Monitor cpu information"), DEF_CFG_ITEM(CFG_WATCH_MEMORY, "watch_params.memory", VAL_BOOL, "1", "Monitor memory information"), diff --git a/srcs/libs/configure/config_help.c b/srcs/libs/configure/config_help.c index 192bd66..dfbab5f 100644 --- a/srcs/libs/configure/config_help.c +++ b/srcs/libs/configure/config_help.c @@ -33,6 +33,10 @@ c_vector config_get_dhcp_mac_filter() { } #endif +const char *config_get_agent_iptv_report_url() { + return cfg_get_string_value(CFG_AGENT_IPTV_POST_URL); +} + const char *config_get_http_server_addr() { return cfg_get_string_value(CFG_HTTP_SVR_ADDR); } diff --git a/srcs/libs/include/config.h b/srcs/libs/include/config.h index e4b340c..e486088 100644 --- a/srcs/libs/include/config.h +++ b/srcs/libs/include/config.h @@ -35,6 +35,7 @@ typedef enum { CFG_BANNER_SHOW, CFG_HARDWARE_WATCH, CFG_HARDWARE_REFRESH, + CFG_AGENT_IPTV_POST_URL, CFG_WATCH_CPU, CFG_WATCH_MEMORY, CFG_WATCH_DISK, @@ -132,6 +133,7 @@ const char *config_get_vxlan_nic_name(); const char *config_get_vxlan_peer_mac(); const char *config_get_vxlan_peer_ip(); const char *config_get_vxlan_pkg_filter(); +const char *config_get_agent_iptv_report_url(); const char *config_get_http_server_addr(); unsigned int config_get_http_server_port(); int config_get_http_server_tcp_nodelay(); diff --git a/srcs/libs/network/inet_misc.c b/srcs/libs/network/inet_misc.c index cd82c3b..9a9a453 100644 --- a/srcs/libs/network/inet_misc.c +++ b/srcs/libs/network/inet_misc.c @@ -729,6 +729,7 @@ const char *inet_http_post_async(const char *pURL, const char *pPost, on_http_re pParams->pCurl = pCurl; pParams->lastTm = 0; pParams->isCancel = FALSE; + pParams->createTm = LIBUV_CURRENT_TIME_S(); memset(pParams->pReqUrl, 0, strlen(pURL) + 1); strcpy(pParams->pReqUrl, pURL); diff --git a/srcs/open_dhcp/query.cpp b/srcs/open_dhcp/query.cpp index c2c9a1f..e5c6606 100644 --- a/srcs/open_dhcp/query.cpp +++ b/srcs/open_dhcp/query.cpp @@ -26,6 +26,7 @@ using namespace std; #include "user_errno.h" #include "uthash/uthash.h" #include "sds/sds.h" +#include "inet_misc.h" extern data2 cfig; extern bool kRunning; @@ -1173,8 +1174,27 @@ int opendhcp_add_listener() { return i; } +void on_http_response_cb(void *pData, + unsigned int size, + const char *pReqUrl, + const char *pDlPath, + const char *pTaskUuid, + int iFinished, + void *pUserData) { + if (iFinished == 0) { + dzlog_debug("Request(%s): [%s] Response: [%u] OK:\n", pTaskUuid, pReqUrl, size); + } else if (iFinished == 1) { + dzlog_error("Request(%s): [%s] Response: [%u] Error\n", pTaskUuid, pReqUrl, size); + } else { + dzlog_error("Download Error Code: %d\n", iFinished); + } +} + void iptvCacheCb(void *UNUSED(pArg)) { do { + bool isReport = false; + const char *pUrl = config_get_agent_iptv_report_url(); + PIPTV_DEV_SET report = nullptr; PIPTV_DEV_SET pDev, pTmp = nullptr; uv_rwlock_wrlock(&g_uvCacheLock); HASH_ITER(hh, g_iptvNewDevs, pDev, pTmp) { @@ -1185,8 +1205,9 @@ void iptvCacheCb(void *UNUSED(pArg)) { if (!pTemp) { auto pCacheDev = (PIPTV_DEV_SET)malloc(sizeof(IPTV_DEV_SET)); memcpy(pCacheDev, pDev, sizeof(IPTV_DEV_SET)); - // Report new IPTV device MAC - pCacheDev->isReport = 1; + HASH_ADD_STR(report, iptvMAC, pCacheDev); + + isReport = true; // 添加到缓存列表供后续查询 HASH_ADD_STR(g_iptvCacheDevs, iptvMAC, pCacheDev); dzlog_debug("Add IPTV device %s vni %d to cache\n", pCacheDev->iptvMAC, pCacheDev->vni); @@ -1197,6 +1218,28 @@ void iptvCacheCb(void *UNUSED(pArg)) { free((void *)pDevMac); } uv_rwlock_wrunlock(&g_uvCacheLock); + + if (isReport && pUrl && strlen(pUrl) > 0) { + cJSON *pRspMsg = cJSON_CreateObject(); + cJSON *pMsgArray = cJSON_CreateArray(); + cJSON_AddItemToObject(pRspMsg, "iptvDevs", pMsgArray); + + HASH_ITER(hh, report, pDev, pTmp) { + cJSON *pRspItem = cJSON_CreateObject(); + cJSON_AddStringToObject(pRspItem, "mac", pDev->iptvMAC); + cJSON_AddNumberToObject(pRspItem, "vni", pDev->vni); + pDev->isReport = 1; + cJSON_AddItemToArray(pMsgArray, pRspItem); + } + + const char *pStrPro = proto_create_new(pRspMsg, 200); + + // Report new IPTV device MAC + inet_http_post_async(config_get_agent_iptv_report_url(), pStrPro, on_http_response_cb, nullptr); + + free((void *)pStrPro); + } + uv_sleep(10); } while (true); }