#include "slp_model.h"
#include "arp_scanner.h"
#include "arpd_action.h"
#include "arpd_dms.h"
#include "dms_tool.h"
LOCAL S32 dms_arpd_get(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj)
{
*rply_obj = jso_new_obj();
if (!*rply_obj)
return SLP_ENOMEMORY;
pthread_mutex_lock(&g_scanner.lock);
// 序列化配置到JSON
jso_add_bool(*rply_obj, "enabled", g_scanner.config.enabled);
jso_add_int(*rply_obj, "scan_interval", g_scanner.config.scan_interval);
jso_add_int(*rply_obj, "validity_period", g_scanner.config.validity_period);
jso_add_int(*rply_obj, "packet_interval", g_scanner.config.packet_interval);
jso_add_int(*rply_obj, "start_ip", g_scanner.config.start_ip);
jso_add_int(*rply_obj, "end_ip", g_scanner.config.end_ip);
jso_add_string(*rply_obj, "interface", g_scanner.config.interface);
pthread_mutex_unlock(&g_scanner.lock);
return SLP_OK;
}
LOCAL S32 dms_arpd_set(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj)
{
if (!req_obj)
return SLP_EINVALRG; // 无效参数
pthread_mutex_lock(&g_scanner.lock);
// 部分更新:只修改传入的字段
JSON_OBJPTR val;
val = jso_obj_get(req_obj, "enabled");
if (val != NULL)
{
int bool_int = jso_get_int(val);
g_scanner.config.enabled = (bool_int != 0);
}
val = jso_obj_get(req_obj, "scan_interval");
if (val != NULL)
{
g_scanner.config.scan_interval = jso_get_int(val);
}
val = jso_obj_get(req_obj, "validity_period");
if (val != NULL)
{
g_scanner.config.validity_period = jso_get_int(val);
}
val = jso_obj_get(req_obj, "packet_interval");
if (val != NULL)
{
g_scanner.config.packet_interval = jso_get_int(val);
}
val = jso_obj_get(req_obj, "start_ip");
if (val != NULL)
{
g_scanner.config.start_ip = jso_get_int(val);
}
val = jso_obj_get(req_obj, "end_ip");
if (val != NULL)
{
g_scanner.config.end_ip = jso_get_int(val);
}
val = jso_obj_get(req_obj, "interface");
if (val != NULL)
{
const char *iface = jso_get_string(val);
strncpy(g_scanner.config.interface, iface, IFNAMSIZ - 1);
g_scanner.config.interface[IFNAMSIZ - 1] = '\0';
}
pthread_mutex_unlock(&g_scanner.lock);
// 返回成功响应
*rply_obj = jso_new_obj();
if (*rply_obj)
{
jso_add_string(*rply_obj, "result", "success");
}
return SLP_OK;
}
LOCAL S32 dms_arpd_start(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj)
{
// 创建响应JSON对象
*rply_obj = jso_new_obj();
if (*rply_obj == NULL)
{
DS_ERROR("Create response object failed");
return SLP_ENOMEM; // 返回内存不足错误码
}
// 启动扫描
int start_result = arp_scanner_start();
if (start_result == OK)
{
jso_add_string(*rply_obj, "status", "success");
jso_add_string(*rply_obj, "message", "Scan started successfully");
// 添加扫描配置信息(加锁保证线程安全)
pthread_mutex_lock(&g_scanner.lock);
jso_add_bool(*rply_obj, "enabled", g_scanner.config.enabled);
jso_add_int(*rply_obj, "scan_interval", g_scanner.config.scan_interval);
jso_add_int(*rply_obj, "validity_period", g_scanner.config.validity_period);
// 转换IP地址格式
char start_ip_str[MAX_IP_LEN], end_ip_str[MAX_IP_LEN];
int_to_ip(g_scanner.config.start_ip, start_ip_str);
int_to_ip(g_scanner.config.end_ip, end_ip_str);
jso_add_string(*rply_obj, "start_ip", start_ip_str);
jso_add_string(*rply_obj, "end_ip", end_ip_str);
jso_add_string(*rply_obj, "interface", g_scanner.config.interface);
// 添加当前状态
jso_add_bool(*rply_obj, "is_scanning", g_scanner.scanning);
jso_add_int(*rply_obj, "current_entry_count", g_scanner.entry_count);
pthread_mutex_unlock(&g_scanner.lock);
}
else
{
jso_add_string(*rply_obj, "status", "error");
jso_add_int(*rply_obj, "error_code", start_result);
// 根据错误码设置错误信息
const char *error_message = "Failed to start scan";
switch (start_result)
{
case ERROR_BUSY:
error_message = "Scan already in progress";
break;
case ERROR_DISABLED:
error_message = "Scanner is disabled in configuration";
break;
case ERROR_INVAL:
error_message = "Invalid IP range in configuration";
break;
case ERROR_SOCKET:
error_message = "Failed to initialize network socket";
break;
case ERROR_THREAD:
error_message = "Failed to create scan thread";
break;
}
jso_add_string(*rply_obj, "message", error_message);
}
return start_result;
}
LOCAL S32 dms_arpd_stop(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj)
{
// 创建响应JSON对象
*rply_obj = jso_new_obj();
if (*rply_obj == NULL)
{
DS_ERROR("Create response object failed");
return SLP_ENOMEM; // 返回内存不足错误码
}
// 获取当前扫描状态快照(加锁保证线程安全)
pthread_mutex_lock(&g_scanner.lock);
BOOL was_scanning = g_scanner.scanning;
int entry_count = g_scanner.entry_count;
time_t last_scan_time = g_scanner.last_scan_time;
char interface_name[IFNAMSIZ];
strncpy(interface_name, g_scanner.config.interface, IFNAMSIZ - 1);
interface_name[IFNAMSIZ - 1] = '\0'; // 确保字符串结束
pthread_mutex_unlock(&g_scanner.lock);
// 停止扫描
int stop_result = arp_scanner_stop();
// 填充响应信息
jso_add_string(*rply_obj, "status", (stop_result == OK) ? "success" : "error");
jso_add_int(*rply_obj, "error_code", stop_result);
if (stop_result == OK)
{
jso_add_string(*rply_obj, "action", was_scanning ? "Scan stopped" : "No active scan to stop");
}
else
{
// 根据错误码设置错误信息
const char *error_message = "Failed to stop scan";
switch (stop_result)
{
case ERROR_NOT_RUNNING:
error_message = "Scanner not running";
break;
case ERROR_TIMEOUT:
error_message = "Stop operation timed out, forced cancellation";
break;
case ERROR_THREAD:
error_message = "Thread operation failed";
break;
}
jso_add_string(*rply_obj, "message", error_message);
}
// 添加扫描结果统计
jso_add_bool(*rply_obj, "was_scanning", was_scanning);
jso_add_int(*rply_obj, "entry_count", entry_count);
// 添加时间信息
char last_scan_str[32];
if (last_scan_time > 0)
{
myformat_timestamp(last_scan_time, last_scan_str);
jso_add_string(*rply_obj, "last_scan_time", last_scan_str);
}
else
{
jso_add_string(*rply_obj, "last_scan_time", "Never scanned");
}
// 添加网络接口信息
jso_add_string(*rply_obj, "interface", interface_name);
return stop_result;
}
LOCAL S32 dms_arpd_status(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj)
{
// 创建响应JSON对象
*rply_obj = jso_new_obj();
if (*rply_obj == NULL)
{
return SLP_ENOMEMORY; // 内存不足错误
}
pthread_mutex_lock(&g_scanner.lock);
// 添加扫描器状态信息到JSON对象
jso_add_bool(*rply_obj, "enabled", g_scanner.config.enabled);
jso_add_bool(*rply_obj, "scanning", g_scanner.scanning);
jso_add_int(*rply_obj, "entry_count", g_scanner.entry_count);
// 格式化并添加时间信息
char last_scan_str[32] = "never scan";
if (g_scanner.last_scan_time > 0)
{
struct tm *tm_info = localtime(&g_scanner.last_scan_time);
if (tm_info)
{
strftime(last_scan_str, sizeof(last_scan_str), "%Y-%m-%d %H:%M:%S", tm_info);
}
}
jso_add_string(*rply_obj, "last_scan_time", last_scan_str);
pthread_mutex_unlock(&g_scanner.lock);
return 0;
}
LOCAL S32 dms_arpd_result(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj)
{
// 创建主响应对象
*rply_obj = jso_new_obj();
if (*rply_obj == NULL)
{
return SLP_ENOMEMORY;
}
pthread_mutex_lock(&g_scanner.lock);
// 创建结果数组
JSON_OBJPTR entries_array = jso_new_array();
if (!entries_array)
{
pthread_mutex_unlock(&g_scanner.lock);
return SLP_ENOMEMORY;
}
// 处理每个条目
for (int i = 0; i < g_scanner.entry_count; i++)
{
JSON_OBJPTR entry_obj = jso_new_obj();
if (!entry_obj)
continue;
char ip_str[MAX_IP_LEN];
char first_seen_str[32];
char last_seen_str[32];
// 转换IP地址
int_to_ip(g_scanner.entries[i].ip, ip_str);
// 格式化时间戳
myformat_timestamp(g_scanner.entries[i].first_seen, first_seen_str);
myformat_timestamp(g_scanner.entries[i].last_seen, last_seen_str);
// 添加条目属性
jso_add_string(entry_obj, "ip_address", ip_str);
jso_add_string(entry_obj, "mac_address", g_scanner.entries[i].mac);
jso_add_string(entry_obj, "first_seen", first_seen_str);
jso_add_string(entry_obj, "last_seen", last_seen_str);
// 添加条目到数组
jso_array_add(entries_array, entry_obj);
}
// 添加结果数组到主对象
jso_obj_add(*rply_obj, "entries", entries_array);
// 添加统计信息
jso_add_int(*rply_obj, "total_entries", g_scanner.entry_count);
// 格式化最后扫描时间
char last_scan_str[32] = "never scan";
if (g_scanner.last_scan_time > 0)
{
struct tm *tm_info = localtime(&g_scanner.last_scan_time);
if (tm_info)
{
strftime(last_scan_str, sizeof(last_scan_str), "%Y-%m-%d %H:%M:%S", tm_info);
}
}
jso_add_string(*rply_obj, "last_scan_time", last_scan_str);
pthread_mutex_unlock(&g_scanner.lock);
return 0;
}
LOCAL S32 dms_arpd_clear(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj)
{
pthread_mutex_lock(&g_scanner.lock);
// 重置条目计数
g_scanner.entry_count = 0;
// 可选:重置扫描时间
g_scanner.last_scan_time = 0;
pthread_mutex_unlock(&g_scanner.lock);
return 0;
}
/* ---------- DMS ubus 方法的注册 ------------ */
/* 注册ubus具体方法 */
LOCAL DMS_CMD_METHOD arpd_cmd_method[] = {
DMS_CMD_METHOD_DESC("get_conf", dms_arpd_get),
DMS_CMD_METHOD_DESC("set_conf", dms_arpd_set),
DMS_CMD_METHOD_DESC("start_scan", dms_arpd_start),
DMS_CMD_METHOD_DESC("stop_scan", dms_arpd_stop),
DMS_CMD_METHOD_DESC("get_scan_status", dms_arpd_status),
DMS_CMD_METHOD_DESC("get_scan_result", dms_arpd_result),
DMS_CMD_METHOD_DESC("clear_result", dms_arpd_clear),
};
LOCAL DMS_CMD_OBJ_CMD arpd_cmd[] = {
DMS_CMD_OBJ_CMD_DESC("arpd", arpd_cmd_method),
};
/* 注册ubus模块 */
LOCAL DMS_CMD_OBJ arpd_call_obj = DMS_CMD_OBJ_DESC("arpd", arpd_cmd);
LOCAL int arpd_cmd_call_handle(dms_handler_t *handler, U8 *mbuf, U32 mlen, U32 sender_dms_id)
{
return dms_cmd_msg_parse(handler, mbuf, mlen, sender_dms_id, &arpd_call_obj);
}
/* ---------- 模块的注册与基础函数 ------------ */
LOCAL S32 arpdmod_stop()
{
/* 停止扫描 */
int stop_resultt = arp_scanner_stop();
/* 取消注册的DS方法 */
// ds_unregister_get_json("arpd_config", "arpd_info", "arpd_info", get_arpd_info);
// ds_unregister_set_json("arpd_config", "arpd_info", "arpd_info", set_arpd_info);
ds_unregister_action("arpd", "start_scan", arpd_start_scan);
ds_unregister_action("arpd", "stop_scan", arpd_stop_scan);
ds_unregister_action("arpd", "get_scan_status", arpd_get_scan_status);
ds_unregister_action("arpd", "get_scan_result", arpd_get_scan_result);
ds_unregister_action("arpd", "clear_result", arpd_clear_result);
/* 取消注册的dms ubus调试方法 */
msg_detach_handler(MSGID_DMS_CMD, arpd_cmd_call_handle);
return OK;
}
LOCAL S32 arpdmod_start()
{
int start_result = arp_scanner_start();
if (start_result == 0)
{
return OK;
}
else
{
return -1;
}
}
LOCAL S32 arpdmod_reload()
{
return OK;
}
LOCAL S32 arpdmod_check()
{
return OK;
}
LOCAL S32 arpdmod_init()
{
/* ------- DS TDCP接口 ---------- */
/* 可以复写get/set json函数 */
// ds_register_get_json("arpd_config", "arpd_info", "arpd_info", get_arpd_info);
// ds_register_set_json("arpd_config", "arpd_info", "arpd_info", set_arpd_info);
/* 注册do方法函数 */
ds_register_action("arpd", "start_scan", arpd_start_scan);
ds_register_action("arpd", "stop_scan", arpd_stop_scan);
ds_register_action("arpd", "get_scan_status", arpd_get_scan_status);
ds_register_action("arpd", "get_scan_result", arpd_get_scan_result);
ds_register_action("arpd", "clear_result", arpd_clear_result);
/* ------- DMS ubus接口 ---------- */
/* 注册ubus call调试方法 */
msg_attach_handler(MSGID_DMS_CMD, arpd_cmd_call_handle);
return OK;
}
LOCAL void arpd_main()
{
/* 声明基础函数 */
DS_MOD_DESC arpd_module =
DS_STRUCT_MOD("arpdmod", arpdmod_init, NULL, NULL, arpdmod_start, arpdmod_stop, NULL, NULL);
/* 向ds注册模块 */
MODULE *module_node = ds_register_module("arpdmod", &arpd_module);
NSD_ASSERT(NULL != module_node);
}
NSD_INIT(arpd_main);typedef struct _DMS_CMD_METHOD
{
const char *name;
S32 (*handle)(JSON_OBJPTR req_obj, JSON_OBJPTR* rply_obj);
} DMS_CMD_METHOD;为什么会报上面的错
最新发布