diff --git a/2023-11-03.webp b/2023-11-03.webp deleted file mode 100644 index 3e88900..0000000 Binary files a/2023-11-03.webp and /dev/null differ 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