Your Name
11d830b496
fix(snmp): 修复 SNMP 采集 ARP 表时只补 MAC 不补厂商的问题
...
问题原因:
- snmp_service.py get_arp_table 第267行条件为
if ip_addr and not ip_addr.mac_address:
- 只给原本没有 MAC 的 IP 设置 MAC + 厂商
- 如果 IP 已有 MAC(来自 Ping/ARP 扫描)但没有 vendor,
则永远不会补全厂商
解决方案:
- 拆分为两个 if:
1. if not ip_addr.mac_address: 写入 MAC
2. if not ip_addr.vendor and ip_addr.mac_address: 补全厂商
- 确保已有 MAC 但无厂商的 IP 也能被补全
- 已有 backfill_vendor.py 脚本可批量回填历史数据
2026-07-23 15:39:59 +08:00
Your Name
934b604b65
fix(mac-vendor): 修复 OUI 数据库 key 格式不匹配导致永远查不到厂商
...
问题原因:
- oui.txt 中的 key 格式为 AABBCC(无冒号,6位十六进制)
- 代码中提取的 oui = mac[:8] 是 AA:BB:CC(带冒号,8字符)
- db.get(oui) 永远匹配不到,且回退的遍历逻辑在4万条字典上
每次查都全扫描,性能极差
解决方案:
- 提取 OUI 后去掉冒号再查询:oui.replace(':', '')
- 直接 db.get() 精确匹配,O(1) 时间复杂度
2026-07-23 15:36:47 +08:00
Your Name
13c457acb3
fix(network): 修复网段 total_ips 包含网络地址和广播地址的问题
...
问题原因:
- calculate_total_ips 使用 network.num_addresses 计算总IP数量
- 该值包含网络地址(第一个IP)和广播地址(最后一个IP)
- 而 _create_ip_addresses 使用 hosts() 生成IP列表,排除这两个地址
- 导致 total_ips 比实际存储的IP记录多2个
- 例: /24 显示 256 个IP,实际只有 254 条记录
解决方案:
1. calculate_total_ips 改为 num_addresses - 2(排除网络地址和广播地址)
2. 对于 /31 /32 等没有网络/广播地址的网段,特殊处理
3. 提供 fix_network_total_ips.py 迁移脚本修复已有数据
2026-07-23 15:33:13 +08:00
Your Name
05cd71ca1a
feat(mac-vendor): 本地 OUI 数据库替代在线查询,修复厂商识别失败
...
问题原因:
- mac_vendor_lookup 库依赖从 IEEE 官网在线下载 OUI 数据库
- 其他机器无网络或网络不通时,内置精简版数据库不全
- 导致 SNMP 扫描到 MAC 地址后无法识别厂商
解决方案:
1. 从 IEEE OUI 官方数据库下载完整数据 (39782 条记录)
保存为 backend/app/data/oui.txt 纳入版本管理
2. 修改 EnhancedScanService.get_mac_vendor(),查询顺序:
1️⃣ 本地 OUI 数据库(免网络、高性能)
2️⃣ mac_vendor_lookup 在线库(回退)
3️⃣ 硬编码常用厂商映射(最终回退)
3. start.sh 启动时检测 OUI 文件是否存在,不存在自动下载
4. 支持 AA:BB:CC、AABBCC、aa-bb-cc、001c.14aa.bbcc 多种 MAC 格式
2026-07-23 15:31:54 +08:00
Your Name
094d2cc112
fix(snmp): 修复异步函数同步调用导致'coroutine object is not an iterator'错误
...
问题原因:
- pysnmp.hlapi.asyncio 的 getCmd/bulkCmd/nextCmd 都是 async def 协程函数
- 返回的是 coroutine 对象,需要用 await 获取结果
- 原代码用 next() 或 for...in 同步迭代协程对象,报错:
'coroutine' object is not an iterator
解决方案:
1. snmp_service.py: 所有 SNMP 操作改为 async def
- test_connection(): getCmd 改为 await getCmd()
- get_arp_table(): bulkCmd 改为 await bulkCmd()
- get_mac_address_table(): bulkCmd 改为 await bulkCmd()
- get_interfaces(): bulkCmd 改为 await bulkCmd()
- poll_device(): 所有子调用加 await
2. api/v1/snmp.py: API 路由改为 async def + await
bulkCmd await 后返回 (errorIndication, errorStatus, errorIndex, varBindTable)
其中 varBindTable 是列表的列表(table 形式),需双层循环解析
2026-07-23 15:01:18 +08:00
Your Name
e0cba105b6
fix(deps): 修复 pysnmp 兼容性问题
...
问题原因:
- pysnmp==7.1.15 使用已废弃的 asyncio.coroutine 装饰器
- 该装饰器在 Python 3.11 中被完全移除,导致导入失败
解决方案:
- 替换为 pysnmp-lextudio==5.0.31
- 这是社区维护的分支,兼容 Python 3.6+
- API 完全兼容,无需修改业务代码
验证:
- Python 3.10 & 3.11 均可正常导入
- FastAPI 应用可正常加载 (95 routes)
- SNMPService.OID_SYS_DESCR 可正常访问
2026-07-23 14:06:39 +08:00
Your Name
a8e764b102
feat(python3.10): 适配 Python 3.10 并修复 SNMP 问题
...
修改内容:
1. 修复 SNMP 凭据显示问题:确保设备列表返回 snmp_credential_id
2. 修复清除 SNMP 凭据功能:新增 clear_snmp_credential 参数
3. 前端适配:处理清除凭据时的参数转换
4. 更新 requirements.txt:添加 Python 3.10 兼容说明和 typing-extensions
5. 添加 PYTHON_3_10_COMPATIBILITY.md 兼容性说明文档
验证:
- 所有代码无 Python 3.11 特有语法
- 依赖包版本均支持 Python 3.10
- typing-extensions 提供向后兼容支持
2026-07-23 13:58:52 +08:00
Your Name
5b93e4536f
add jose
2026-07-23 13:13:31 +08:00
Your Name
845fefd6cf
add file
2026-07-20 14:46:47 +08:00
Your Name
bca0da7c7d
readme
2026-07-20 13:40:05 +08:00
Your Name
9e34f6f0f9
feat(ips): 批量补全厂商功能 + MAC厂商替换为IEEE OUI数据库
...
前端:
- IPs.vue: 新增「补全厂商」按钮,选中网段后一键补全
- scanApi: 新增 batchFillVendor/batchDiscoverHostname + enable_netbios 参数
后端:
- enhanced_scan.py: 新增 POST /scan/batch/vendor 批量补全厂商端点
- enhanced_scan.py: 新增 POST /scan/batch/hostname 批量发现主机名端点
- scan_tasks.py: 透传 enable_netbios 参数
2026-07-18 10:59:27 +08:00
Your Name
ccd7fbe2f0
feat(scan): 增强MAC厂商识别和主机名自动发现
...
- MAC厂商: 替换硬编码OUI_MAP为mac_vendor_lookup库(IEEE OUI官方数据库)
- 主机名发现新增NetBIOS广播(nmblookup),支持Windows/SMB设备
- 综合扫描支持enable_netbios参数
- 新增NetBIOS主机名发现API端点
- 扫描时自动补全缺失厂商(有MAC无vendor时自动识别)
2026-07-18 10:53:33 +08:00
Your Name
bd68abee93
fix(snmp): ARP表缺少发现时间字段,在get_arp_table返回值中添加last_seen和discovered_at
2026-07-18 09:50:20 +08:00
Your Name
1e1e5957e8
fix(ipam): 修复IP管理页面网段筛选不生效及下拉框过窄
...
- Ips.vue: el-select 添加 width: 280px,修复网段下拉框过窄
- Ips.vue: query 参数 networkId → network_id(与 FastAPI snake_case 一致)
- Scan.vue: el-select 用 network.id 代替整个 network 对象作为 value,修复切换网段不生效
- enhanced_scan_service.py: 替换失效的 scapy ARP 扫描为 arp-scan 命令;扫描结果自动创建缺失 IP 记录
2026-07-18 09:45:30 +08:00