#include "slp_model.h"
#include "nsd_common.h"
#include "arp_scanner.h"
#include "arpd_action.h"
#include "arpd_dms.h"
/* ---------- DMS ubus 方法的注册 ------------ */
/* 注册ubus具体方法 */
LOCAL DMS_CMD_METHOD arpd_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_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()
{
/* 取消注册的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);
/* 最后停止扫描 */
arpd_stop_scan();
return OK;
}
LOCAL S32 arpdmod_start()
{
arpd_start_scan();
return OK;
}
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);#include "arp_scanner.h"
#include "arpd_action.h"
#include "json_api.h"
// 开始扫描
int arpd_start_scan(struct _DS_HANDLE_CONTEXT *context, JSON_OBJPTR param)
{
// 创建响应JSON对象
context->res_obj = jso_new_obj();
if (NULL == context->res_obj)
{
DS_ERROR("Create new json object failed.");
context->error_code = SLP_ESYSTEM;
return ERROR;
}
// 调用arp_scanner_start启动扫描
int start_result = arp_scanner_start();
if (start_result == OK)
{
jso_add_string(context->res_obj, "status", "success");
jso_add_string(context->res_obj, "message", "Scan started successfully");
// 添加扫描配置信息
pthread_mutex_lock(&g_scanner.lock);
jso_add_bool(context->res_obj, "enabled", g_scanner.config.enabled);
jso_add_int(context->res_obj, "scan_interval", g_scanner.config.scan_interval);
jso_add_int(context->res_obj, "validity_period", g_scanner.config.validity_period);
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(context->res_obj, "start_ip", start_ip_str);
jso_add_string(context->res_obj, "end_ip", end_ip_str);
jso_add_string(context->res_obj, "interface", g_scanner.config.interface);
// 添加当前状态
jso_add_bool(context->res_obj, "is_scanning", g_scanner.scanning);
jso_add_int(context->res_obj, "current_entry_count", g_scanner.entry_count);
pthread_mutex_unlock(&g_scanner.lock);
}
else
{
jso_add_string(context->res_obj, "status", "error");
// 根据错误码提供详细错误信息
switch (start_result)
{
case ERROR_BUSY:
jso_add_string(context->res_obj, "message", "Scan already in progress");
break;
case ERROR_DISABLED:
jso_add_string(context->res_obj, "message", "Scanner is disabled in configuration");
break;
case ERROR_INVAL:
jso_add_string(context->res_obj, "message", "Invalid IP range in configuration");
break;
case ERROR_SOCKET:
jso_add_string(context->res_obj, "message", "Failed to initialize network socket");
break;
case ERROR_THREAD:
jso_add_string(context->res_obj, "message", "Failed to create scan thread");
break;
default:
jso_add_string(context->res_obj, "message", "Failed to start scan");
}
jso_add_int(context->res_obj, "error_code", start_result);
}
return start_result;
}
int arpd_stop_scan(struct _DS_HANDLE_CONTEXT *context, JSON_OBJPTR param)
{
// 创建响应JSON对象
context->res_obj = jso_new_obj();
if (NULL == context->res_obj)
{
DS_ERROR("Create JSON object failed"); // 翻译:创建JSON对象失败
context->error_code = SLP_ESYSTEM;
return ERROR;
}
// 获取当前扫描状态快照
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);
pthread_mutex_unlock(&g_scanner.lock);
// 执行停止操作
int stop_result = arp_scanner_stop();
// 构建响应
jso_add_string(context->res_obj, "status", (stop_result == OK) ? "success" : "error");
jso_add_int(context->res_obj, "error_code", stop_result);
// 添加详细状态信息
if (stop_result == OK)
{
jso_add_string(context->res_obj, "action", was_scanning ? "Scan stopped" : "No active scan to stop");
}
else
{
// 根据错误码提供详细错误信息
switch (stop_result)
{
case ERROR_NOT_RUNNING:
jso_add_string(context->res_obj, "message", "Scanner not running");
break;
case ERROR_TIMEOUT:
jso_add_string(context->res_obj, "message", "Stop operation timed out, forced cancellation");
break;
case ERROR_THREAD:
jso_add_string(context->res_obj, "message", "Thread operation failed");
break;
default:
jso_add_string(context->res_obj, "message", "Failed to stop scan");
}
}
// 添加扫描结果统计
jso_add_bool(context->res_obj, "was_scanning", was_scanning);
jso_add_int(context->res_obj, "entry_count", entry_count);
// 添加时间信息
char last_scan_str[32];
if (last_scan_time > 0)
{
format_timestamp(last_scan_time, last_scan_str);
jso_add_string(context->res_obj, "last_scan_time", last_scan_str);
}
else
{
jso_add_string(context->res_obj, "last_scan_time", "Never scanned");
}
// 添加网络接口信息
jso_add_string(context->res_obj, "interface", interface_name);
return stop_result;
}
// 获取扫描状态
int arpd_get_scan_status(struct _DS_HANDLE_CONTEXT *context, JSON_OBJPTR param)
{
char last_scan_time[32];
/* 创建回复数据的json对象 */
context->res_obj = jso_new_obj();
if (NULL == context->res_obj)
{
DS_ERROR("Create new json object failed.");
context->error_code = SLP_ESYSTEM;
return ERROR;
}
pthread_mutex_lock(&g_scanner.lock);
jso_add_bool(context->res_obj, "Enabled", g_scanner.config.enabled);
jso_add_bool(context->res_obj, "Scanning", g_scanner.scanning);
jso_add_int(context->res_obj, "Entry Count", g_scanner.entry_count);
format_timestamp(g_scanner.last_scan_time, last_scan_time);
jso_add_string(context->res_obj, "Last Scan Time", last_scan_time);
pthread_mutex_unlock(&g_scanner.lock);
return 0;
}
// 获取扫描结果(JSON格式)
int arpd_get_scan_result(struct _DS_HANDLE_CONTEXT *context, JSON_OBJPTR param)
{
pthread_mutex_lock(&g_scanner.lock);
// 创建根JSON对象
context->res_obj = jso_new_obj();
if (NULL == context->res_obj)
{
DS_ERROR("Create new json object failed.");
pthread_mutex_unlock(&g_scanner.lock);
context->error_code = SLP_ESYSTEM;
return ERROR;
}
// 创建存储条目的JSON数组
JSON_OBJPTR entries_array = jso_new_array();
if (NULL == entries_array)
{
DS_ERROR("Create entries array failed.");
pthread_mutex_unlock(&g_scanner.lock);
context->error_code = SLP_ESYSTEM;
return ERROR;
}
jso_obj_add(context->res_obj, "entries", entries_array);
// 遍历扫描结果并转换为JSON对象
for (int i = 0; i < g_scanner.entry_count; i++)
{
char ip_str[MAX_IP_LEN];
char first_seen_str[32];
char last_seen_str[32];
int_to_ip(g_scanner.entries[i].ip, ip_str);
format_timestamp(g_scanner.entries[i].first_seen, first_seen_str);
format_timestamp(g_scanner.entries[i].last_seen, last_seen_str);
// 创建单条目的JSON对象
JSON_OBJPTR entry_obj = jso_new_obj();
if (entry_obj)
{
jso_add_string(entry_obj, "ip", ip_str);
jso_add_string(entry_obj, "mac", 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_add_int(context->res_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;
}
// 辅助函数:格式化时间戳
void format_timestamp(time_t timestamp, char *buffer)
{
if (timestamp == 0)
{
strcpy(buffer, "N/A");
return;
}
struct tm *tm_info = localtime(×tamp);
strftime(buffer, 32, "%Y-%m-%d %H:%M:%S", tm_info);
}
int arpd_clear_result(struct _DS_HANDLE_CONTEXT *context, JSON_OBJPTR param)
{
// 创建响应JSON对象
context->res_obj = jso_new_obj();
if (NULL == context->res_obj)
{
DS_ERROR("Create new json object failed.");
context->error_code = SLP_ESYSTEM;
return ERROR;
}
pthread_mutex_lock(&g_scanner.lock);
// 记录清除前的状态
int cleared_count = g_scanner.entry_count;
time_t last_scan_time = g_scanner.last_scan_time;
// 执行清除操作
g_scanner.entry_count = 0;
g_scanner.last_scan_time = 0;
pthread_mutex_unlock(&g_scanner.lock);
// 构建响应
jso_add_string(context->res_obj, "status", "success");
jso_add_string(context->res_obj, "action", "ARP results cleared");
jso_add_int(context->res_obj, "cleared_entries", cleared_count);
// 添加时间信息
char last_scan_str[32];
if (last_scan_time > 0)
{
format_timestamp(last_scan_time, last_scan_str);
jso_add_string(context->res_obj, "last_scan_time_before_clear", last_scan_str);
}
else
{
jso_add_string(context->res_obj, "last_scan_time_before_clear", "Never scanned");
}
// 添加当前状态
jso_add_int(context->res_obj, "current_entry_count", 0);
jso_add_string(context->res_obj, "current_last_scan_time", "No data");
return 0;
}
这里调用arpd_start_scan和arpd_stop_scan有问题吗
最新发布