diff --git a/README.md b/README.md index c25cf13..0d27902 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Công cụ desktop dùng để **scan, phát hiện và flash firmware hàng loạt** cho các thiết bị OpenWrt trong mạng LAN. Hỗ trợ nạp **thủ công** (chọn thiết bị → flash) và **tự động hóa** (scan → phát hiện → flash → retry). -> **Tech stack:** Python 3.9+ · PyQt6 · Paramiko/SCP · Scapy · Requests · PyInstaller +> **Tech stack:** Python 3.9+ · PyQt6 · Paramiko/SCP · Requests · PyInstaller > **Phiên bản:** `1.2.0` --- @@ -16,7 +16,7 @@ Mira_Firmware_Loader/ ├── version.txt # Số phiên bản ứng dụng ├── requirements.txt # Danh sách dependencies ├── core/ -│ ├── scanner.py # Quét thiết bị mạng đa lớp (Ping sweep + ARP + Scapy) +│ ├── scanner.py # Quét thiết bị mạng (Ping sweep đa luồng) │ ├── workers.py # ScanThread — chạy scanner trong background thread │ ├── api_flash.py # Flash firmware qua LuCI HTTP API │ ├── ssh_utils.py # SSH/SCP transport helpers dùng chung @@ -48,8 +48,7 @@ Mira_Firmware_Loader/ ### Yêu cầu - Python **3.9+** -- Thư viện: `PyQt6`, `scapy`, `requests`, `paramiko`, `scp`, `pyinstaller` (để build) -- _Windows:_ Cài [Npcap](https://npcap.com/) để Scapy có thể gửi ARP broadcast (không bắt buộc — có fallback) +- Thư viện: `PyQt6`, `requests`, `paramiko`, `scp`, `pyinstaller` (để build) ### Khởi chạy nhanh @@ -101,11 +100,11 @@ Output: `dist\Mira_Firmware_Loader.exe` — không cần cài Python trên máy ┌──────▼──────┐ ┌───────▼──────────┐ ┌───▼──────────────────┐ │ scanner.py │ │ Flash Workers │ │ AutoFlashWorker │ │ │ │ (thủ công) │ │ (tự động hóa) │ -│ 1. Ping │ │ │ │ │ -│ Sweep │ │ NewFlashThread │ │ Phase 1: Scan LAN │ -│ 2. arp -a │ │ ├─ api_flash │ │ (tối đa 15 lần) │ -│ 3. Scapy │ │ └─ ssh_new_flash│ │ Phase 2: Flash │ -│ ARP │ │ │ │ (auto-retry x3) │ +│ Ping Sweep │ │ │ │ │ +│ (Multithread│ │ NewFlashThread │ │ Phase 1: Scan LAN │ +│ gọi OS │ │ ├─ api_flash │ │ (tối đa 15 lần) │ +│ ping cmd) │ │ └─ ssh_new_flash│ │ Phase 2: Flash │ +│ │ │ │ │ (auto-retry x3) │ └─────────────┘ │ UpdateFlash │ │ ├─ api_flash │ │ Thread │ │ └─ ssh_new_flash │ │ └─ ssh_update │ └──────────────────────┘ @@ -127,15 +126,15 @@ Output: `dist\Mira_Firmware_Loader.exe` — không cần cài Python trên máy ### 1. Quét mạng (Network Scan) -`scanner.py` dùng chiến lược 3 lớp, đảm bảo phát hiện đầy đủ mà không cần quyền Root: +`scanner.py` sử dụng chiến lược **Ping Sweep**, chỉ quét thiết bị đang online thông qua ping: | Giai đoạn | Mô tả | | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **Ping Sweep** | Gửi ping đồng thời tới toàn bộ host trong dải `/24` (tất cả cùng lúc, không batching) để đánh thức thiết bị và điền ARP cache | -| **ARP Table** | Đọc `arp -a` bằng regex, hỗ trợ cả định dạng Windows (`cc-2d-...`) và macOS/Linux (`aa:bb:...`) | -| **Scapy ARP** | Chạy **song song** với ARP Table — gửi ARP broadcast để lấp khoảng trống. Yêu cầu Npcap (Windows) hoặc root (Linux); tự động bỏ qua nếu không khả dụng | +| **Ping Sweep** | Gửi ping đồng thời tới toàn bộ host trong dải mạng bằng tiến trình con (đa luồng). Thiết bị có phản hồi (`returncode == 0`) sẽ được coi là online. | -Kết quả được merge theo IP và sort tăng dần trước khi trả về UI. +*Lưu ý: Phương pháp hiện tại quét tĩnh lấy IP, bỏ qua phân giải MAC address (hiển thị N/A) nhằm giải quyết triệt để lỗi thiết bị bị cache lưa trong mạng dù đã reset/rút nguồn điện.* + +Kết quả được sort tăng dần theo IP trước khi trả về UI. ### 2. Bảng thiết bị (Device Table) @@ -281,7 +280,7 @@ Kết quả nạp được lưu ở 2 cấp: ## 🔒 Lưu ý bảo mật & Quyền -- **Scapy (chế độ sâu):** Cần Npcap (Windows) hoặc `sudo` (macOS/Linux). App vẫn hoạt động mà không cần quyền Admin nhờ fallback Ping Sweep + `arp -a`. -- **CREATE_NO_WINDOW:** Khi gọi subprocess (`ping`, `arp`), ứng dụng dùng flag `CREATE_NO_WINDOW` trên Windows để ngăn cửa sổ console hiện ra. +- **Quyền hệ thống:** Quá trình quét của `scanner.py` chỉ chạy lệnh ping từ hệ điều hành, vì vậy ứng dụng có thể chạy hoàn toàn **không cần** quyền Admin (trên Windows) / Root (trên macOS/Linux). +- **CREATE_NO_WINDOW:** Khi gọi subprocess lệnh `ping`, ứng dụng dùng flag `CREATE_NO_WINDOW` trên Windows để ngăn cửa sổ console command prompt (cmd) liên tục hiện lên màn hình. - **HTTP thuần:** Firmware được upload qua HTTP (không HTTPS). Chỉ dùng trong mạng LAN nội bộ, không nên dùng trên mạng mở. - **Credentials cố định:** SSH credentials (`root`/`admin123a`) được hardcode trong `flash_update_worker.py` và truyền từ `main.py`, không hiển thị trên UI.