From 1c1fbb7f92157e2f067979be99067fd704f79900 Mon Sep 17 00:00:00 2001 From: MinhNN86 Date: Sun, 8 Mar 2026 17:08:38 +0700 Subject: [PATCH] Refactor: Update build scripts and improve Telnet handling in SSH flasher --- 2023-11-03.webp | Bin 7608 -> 0 bytes build_windows.bat | 10 +++++----- core/ssh_flasher.py | 37 +++++++++++++++++++++++++++++++++++-- main.py | 4 ++-- run.bat | 11 ++++++----- 5 files changed, 48 insertions(+), 14 deletions(-) delete mode 100644 2023-11-03.webp diff --git a/2023-11-03.webp b/2023-11-03.webp deleted file mode 100644 index 3e889003161af9e42a937f43f6b9f7affae26bd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7608 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 a0RjLA0000Q000000000-Z*OO8WdH#3akL}= diff --git a/build_windows.bat b/build_windows.bat index d5e7650..978e142 100644 --- a/build_windows.bat +++ b/build_windows.bat @@ -22,12 +22,12 @@ call venv\Scripts\activate.bat REM 3. Cai dependencies + PyInstaller echo [2/4] Installing dependencies... -pip install PyQt6 scapy requests pyinstaller --quiet +pip install -r requirements.txt pyinstaller --quiet REM 4. Build .exe echo [3/4] Building executable... pyinstaller ^ - --name "MiraV3_Firmware_Loader" ^ + --name "Mira_Firmware_Loader_v1.1.0" ^ --icon "icon.ico" ^ --add-data "icon.ico;." ^ --onefile ^ @@ -47,11 +47,11 @@ echo. echo [4/4] Build complete! echo. -if exist "dist\MiraV3_Firmware_Loader.exe" ( - echo ✅ SUCCESS: dist\MiraV3_Firmware_Loader.exe +if exist "dist\Mira_Firmware_Loader_v1.1.0.exe" ( + echo SUCCESS: dist\Mira_Firmware_Loader_v1.1.0.exe echo. echo File size: - for %%A in ("dist\MiraV3_Firmware_Loader.exe") do echo %%~zA bytes + for %%A in ("dist\Mira_Firmware_Loader_v1.1.0.exe") do echo %%~zA bytes echo. echo Ban co the copy file .exe nay sang may khac va chay truc tiep. ) else ( diff --git a/core/ssh_flasher.py b/core/ssh_flasher.py index c112196..9f5480d 100644 --- a/core/ssh_flasher.py +++ b/core/ssh_flasher.py @@ -30,7 +30,40 @@ def _create_ssh_client(ip, user, password, timeout=15): time.sleep(1) -import telnetlib +import socket + + +class _SimpleTelnet: + """Minimal Telnet client using raw sockets (replaces telnetlib removed in Python 3.13+).""" + def __init__(self, host, port=23, timeout=10): + self._sock = socket.create_connection((host, port), timeout=timeout) + + def read_very_eager(self): + try: + self._sock.setblocking(False) + data = b"" + while True: + try: + chunk = self._sock.recv(4096) + if not chunk: + break + data += chunk + except (BlockingIOError, OSError): + break + self._sock.setblocking(True) + return data + except Exception: + return b"" + + def write(self, data): + self._sock.sendall(data) + + def close(self): + try: + self._sock.close() + except Exception: + pass + def set_device_password(ip, user="root", old_password="", new_password="admin123a", status_cb=None): @@ -45,7 +78,7 @@ def set_device_password(ip, user="root", old_password="", new_password="admin123 # 1. Thử Telnet trước (OpenWrt mặc định mở Telnet 23 và cấm SSH Root khi chưa có Pass) try: - tn = telnetlib.Telnet(ip, timeout=5) + tn = _SimpleTelnet(ip, timeout=5) # Nếu vô được Telnet tức là thiết bị vừa Reset cứng chưa có pass if status_cb: status_cb("Telnet connected! Setting password...") diff --git a/main.py b/main.py index 6dc97fb..662f0a0 100644 --- a/main.py +++ b/main.py @@ -47,7 +47,7 @@ class App(QWidget): def __init__(self): super().__init__() - self.setWindowTitle("MiraV3 Firmware Loader") + self.setWindowTitle("Mira Firmware Loader") self.setWindowIcon(QIcon(resource_path("icon.ico"))) # Data state self.local_ip = "" @@ -67,7 +67,7 @@ class App(QWidget): layout.setContentsMargins(8, 6, 8, 6) # ── Title ── - title = QLabel("⚡ MiraV3 Firmware Loader") + title = QLabel("⚡ Mira Firmware Loader") title.setObjectName("title") title.setAlignment(Qt.AlignmentFlag.AlignCenter) layout.addWidget(title) diff --git a/run.bat b/run.bat index 861073c..29313ec 100644 --- a/run.bat +++ b/run.bat @@ -3,14 +3,15 @@ REM IoT Firmware Loader - Windows launcher cd /d "%~dp0" -if exist "venv" ( - call venv\Scripts\activate.bat -) else ( +if not exist "venv" ( echo Creating virtual environment... python -m venv venv - call venv\Scripts\activate.bat - pip install PyQt6 scapy requests ) +call venv\Scripts\activate.bat + +echo Checking and installing required packages... +pip install -r requirements.txt --quiet + echo Starting IoT Firmware Loader... python main.py