update README.md
This commit is contained in:
31
README.md
31
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.
|
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).
|
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`
|
> **Phiên bản:** `1.2.0`
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -16,7 +16,7 @@ Mira_Firmware_Loader/
|
|||||||
├── version.txt # Số phiên bản ứng dụng
|
├── version.txt # Số phiên bản ứng dụng
|
||||||
├── requirements.txt # Danh sách dependencies
|
├── requirements.txt # Danh sách dependencies
|
||||||
├── core/
|
├── 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
|
│ ├── workers.py # ScanThread — chạy scanner trong background thread
|
||||||
│ ├── api_flash.py # Flash firmware qua LuCI HTTP API
|
│ ├── api_flash.py # Flash firmware qua LuCI HTTP API
|
||||||
│ ├── ssh_utils.py # SSH/SCP transport helpers dùng chung
|
│ ├── ssh_utils.py # SSH/SCP transport helpers dùng chung
|
||||||
@@ -48,8 +48,7 @@ Mira_Firmware_Loader/
|
|||||||
### Yêu cầu
|
### Yêu cầu
|
||||||
|
|
||||||
- Python **3.9+**
|
- Python **3.9+**
|
||||||
- Thư viện: `PyQt6`, `scapy`, `requests`, `paramiko`, `scp`, `pyinstaller` (để build)
|
- Thư viện: `PyQt6`, `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)
|
|
||||||
|
|
||||||
### Khởi chạy nhanh
|
### 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 │
|
│ scanner.py │ │ Flash Workers │ │ AutoFlashWorker │
|
||||||
│ │ │ (thủ công) │ │ (tự động hóa) │
|
│ │ │ (thủ công) │ │ (tự động hóa) │
|
||||||
│ 1. Ping │ │ │ │ │
|
│ Ping Sweep │ │ │ │ │
|
||||||
│ Sweep │ │ NewFlashThread │ │ Phase 1: Scan LAN │
|
│ (Multithread│ │ NewFlashThread │ │ Phase 1: Scan LAN │
|
||||||
│ 2. arp -a │ │ ├─ api_flash │ │ (tối đa 15 lần) │
|
│ gọi OS │ │ ├─ api_flash │ │ (tối đa 15 lần) │
|
||||||
│ 3. Scapy │ │ └─ ssh_new_flash│ │ Phase 2: Flash │
|
│ ping cmd) │ │ └─ ssh_new_flash│ │ Phase 2: Flash │
|
||||||
│ ARP │ │ │ │ (auto-retry x3) │
|
│ │ │ │ │ (auto-retry x3) │
|
||||||
└─────────────┘ │ UpdateFlash │ │ ├─ api_flash │
|
└─────────────┘ │ UpdateFlash │ │ ├─ api_flash │
|
||||||
│ Thread │ │ └─ ssh_new_flash │
|
│ Thread │ │ └─ ssh_new_flash │
|
||||||
│ └─ ssh_update │ └──────────────────────┘
|
│ └─ 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)
|
### 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ả |
|
| 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 |
|
| **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. |
|
||||||
| **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 |
|
|
||||||
|
|
||||||
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)
|
### 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
|
## 🔒 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`.
|
- **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 (`ping`, `arp`), ứng dụng dùng flag `CREATE_NO_WINDOW` trên Windows để ngăn cửa sổ console hiện ra.
|
- **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ở.
|
- **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.
|
- **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.
|
||||||
|
|||||||
Reference in New Issue
Block a user