Files
ipam/backend/scripts/README.md
T
Your Name 1a3c2d15c8 feat(scripts): add backfill_vendor.py
一次性运维脚本:对 mac_address 有值但 vendor/hostname 为空的 IP,
重新调用 EnhancedScanService.get_mac_vendor (基于 IEEE OUI 数据库)
和 reverse_dns_lookup 回填字段,不需重新扫描。

解决场景:升级前 mac-vendor-lookup 库未装、或扫描时 vendor
字段因 bug 未写入。

- backend/scripts/backfill_vendor.py: 主脚本,支持 dry-run / --with-hostname / --limit
- backend/scripts/README.md: 用法、参数、故障排查
2026-07-20 17:35:04 +08:00

95 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# IPAM 运维脚本
存放 IPAM 平台的一次性运维脚本。所有脚本都假定从 `backend/` 目录执行,且 venv 已激活。
## 回填厂商 / 主机名 — `backfill_vendor.py`
### 用途
在某些情况下(升级前扫描失败、OUI 库没装、依赖 bug 等)IP 表里 `mac_address` 有值但 `vendor`/`hostname` 是空。本脚本会:
- 找出所有 `mac_address IS NOT NULL AND vendor IS NULL` 的 IP
- 调用 `EnhancedScanService.get_mac_vendor()` 重新识别厂商(基于 IEEE OUI 数据库)
- 可选:调用 `reverse_dns_lookup()` 回填主机名
- 支持 dry-run 模式(只统计不写库)
### 用法
```bash
# 1. 确保依赖装了(首次或升级后必做)
pip install mac-vendor-lookup
# 2. 干跑:只统计能识别的 IP 数量,不写库
python scripts/backfill_vendor.py --dry-run
# 3. 实际回填
python scripts/backfill_vendor.py
# 4. 同时回填主机名(用反向 DNS,会慢一些)
python scripts/backfill_vendor.py --with-hostname
# 5. 加 --yes 跳过确认提示(cron 用)
python scripts/backfill_vendor.py --yes
# 6. 限制处理数量(测试用)
python scripts/backfill_vendor.py --dry-run --limit 100
```
### 参数
| 参数 | 说明 |
|------|------|
| `--dry-run` | 只统计,不写库 |
| `--with-hostname` | 同时回填 hostnameDNS 解析) |
| `--timeout N` | DNS 解析超时秒数(默认 2) |
| `--limit N` | 最多处理 N 条,0 = 不限 |
| `--yes` / `-y` | 跳过确认提示 |
### 常见场景
**场景 1:升级后 IP 厂商显示 -**
```bash
pip install mac-vendor-lookup # 装新依赖
python scripts/backfill_vendor.py --dry-run # 先看数量
python scripts/backfill_vendor.py # 实际回填
```
**场景 2:扫描能拿到 MAC,但扫描时 vendor 字段没写**
说明扫描代码逻辑有 bug,应该改 `enhanced_scan_service.py``update_ip_from_scan_result()` 而不是用本脚本。脚本只是数据修复。
**场景 3:所有 IP 都没有 MAC**
说明扫描本身没成功,根因在网络层(防火墙、扫描不到、ICMP/ARP 都被禁)。需要先解决扫描链路问题。
### 依赖
- `mac-vendor-lookup`IEEE OUI 官方数据库,约 17 万条记录)
- 项目本身的依赖(FastAPI、SQLAlchemy、PyMySQL 等)
- 可选:`pynmblookup`NetBIOS 主机名发现,仅 Windows 设备需要)
### 注意事项
- 脚本会**直接写库**,建议先 dry-run
- hostname 反向 DNS 可能比较慢(取决于目标设备是否配置了 PTR 记录)
- 不会改写已经存在的 vendor/hostname(只填空值)
- 不影响扫描逻辑本身(不会自动重新扫描)
### 故障排查
如果脚本运行时报 `ImportError: No module named 'app'`,说明 `sys.path` 没找到 backend 目录。在 backend 目录里执行:
```bash
cd /root/ipam/backend
python scripts/backfill_vendor.py
```
如果脚本运行后 `未识别 = 候选 IP 总数`,说明 mac_vendor_lookup 库没装或加载失败:
```bash
pip show mac-vendor-lookup # 检查库是否装好
python -c "from mac_vendor_lookup import MacLookup; print('OK')" # 测试导入
```
如果 OUI 数据库太旧(库自带的 IEEE OUI 文件是 2022 年的快照),新厂商识别不到,可以更新:
```bash
pip install -U mac-vendor-lookup
# 或下载最新 IEEE OUI 文件
python -c "from mac_vendor_lookup import MacLookup; MacLookup().update_vendors()"
```