fix(lite): report tun worker startup errors
This commit is contained in:
@@ -641,9 +641,11 @@ class TunBackend:
|
|||||||
raise TunBackendError("自定义 DNS 不能为空")
|
raise TunBackendError("自定义 DNS 不能为空")
|
||||||
try:
|
try:
|
||||||
for item in cleaned:
|
for item in cleaned:
|
||||||
socket.inet_pton(socket.AF_INET, item)
|
address = ipaddress.ip_address(item)
|
||||||
except OSError as exc:
|
if address.is_unspecified or address.is_multicast:
|
||||||
raise TunBackendError("当前 TUN 仅支持 IPv4 DNS 服务器") from exc
|
raise ValueError(item)
|
||||||
|
except ValueError as exc:
|
||||||
|
raise TunBackendError("自定义 DNS 必须是有效的 IPv4/IPv6 地址") from exc
|
||||||
self._tun_dns_servers = cleaned[:3]
|
self._tun_dns_servers = cleaned[:3]
|
||||||
engine = self.resolve_engine()
|
engine = self.resolve_engine()
|
||||||
interface = self._physical_interface()
|
interface = self._physical_interface()
|
||||||
|
|||||||
+20
-12
@@ -124,17 +124,22 @@ class TunModeController:
|
|||||||
def _request(self, command: str, payload: dict[str, Any] | None = None) -> Any:
|
def _request(self, command: str, payload: dict[str, Any] | None = None) -> Any:
|
||||||
if self._socket is None or self._reader is None:
|
if self._socket is None or self._reader is None:
|
||||||
raise TunModeError("TUN 工作进程未连接")
|
raise TunModeError("TUN 工作进程未连接")
|
||||||
_send(self._socket, {"command": command, "payload": payload or {}})
|
try:
|
||||||
while True:
|
_send(self._socket, {"command": command, "payload": payload or {}})
|
||||||
message = _receive(self._reader)
|
while True:
|
||||||
if message.get("type") == "log":
|
message = _receive(self._reader)
|
||||||
self.log(str(message.get("message") or ""))
|
if message.get("type") == "log":
|
||||||
continue
|
self.log(str(message.get("message") or ""))
|
||||||
if message.get("type") != "result":
|
continue
|
||||||
raise TunModeError("TUN 工作进程响应无效")
|
if message.get("type") != "result":
|
||||||
if not message.get("ok"):
|
raise TunModeError("TUN 工作进程响应无效")
|
||||||
raise TunModeError(str(message.get("error") or "TUN 操作失败"))
|
if not message.get("ok"):
|
||||||
return message.get("value")
|
raise TunModeError(str(message.get("error") or "TUN 操作失败"))
|
||||||
|
return message.get("value")
|
||||||
|
except TunModeError:
|
||||||
|
raise
|
||||||
|
except OSError as exc:
|
||||||
|
raise TunModeError(f"TUN 工作进程连接中止: {exc}") from exc
|
||||||
|
|
||||||
def status(self) -> dict[str, Any]:
|
def status(self) -> dict[str, Any]:
|
||||||
with self._lock:
|
with self._lock:
|
||||||
@@ -195,7 +200,6 @@ def run_tun_worker(port: int, token: str, backend_factory,
|
|||||||
|
|
||||||
backend = None
|
backend = None
|
||||||
try:
|
try:
|
||||||
backend = backend_factory(emit)
|
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
request = _receive(reader)
|
request = _receive(reader)
|
||||||
@@ -206,6 +210,10 @@ def run_tun_worker(port: int, token: str, backend_factory,
|
|||||||
if command == "start":
|
if command == "start":
|
||||||
if not isinstance(request.get("payload"), dict):
|
if not isinstance(request.get("payload"), dict):
|
||||||
raise TunModeError("TUN 启动参数无效")
|
raise TunModeError("TUN 启动参数无效")
|
||||||
|
# 延迟创建后端,使初始化失败也能通过控制协议返回具体原因,
|
||||||
|
# 避免 GUI 只看到 Windows 的 10053 连接中止错误。
|
||||||
|
if backend is None:
|
||||||
|
backend = backend_factory(emit)
|
||||||
start_backend(backend, request["payload"])
|
start_backend(backend, request["payload"])
|
||||||
value = None
|
value = None
|
||||||
elif command == "stop":
|
elif command == "stop":
|
||||||
|
|||||||
Reference in New Issue
Block a user