feat(runtime): adapt android_migration shell to upstream mtproto core

This commit is contained in:
Dark_Avery
2026-03-30 16:14:42 +03:00
parent 9e2c8c16ff
commit 1599b1126c
6 changed files with 179 additions and 140 deletions

View File

@@ -4,6 +4,7 @@ import asyncio as _asyncio
import json
import logging
import logging.handlers
import os
import sys
import threading
import time
@@ -14,8 +15,9 @@ import proxy.tg_ws_proxy as tg_ws_proxy
DEFAULT_CONFIG = {
"port": 1080,
"port": 1443,
"host": "127.0.0.1",
"secret": os.urandom(16).hex(),
"dc_ip": ["2:149.154.167.220", "4:149.154.167.220"],
"log_max_mb": 5,
"buf_kb": 256,
@@ -48,6 +50,27 @@ class ProxyAppRuntime:
self._proxy_thread = None
self._async_stop = None
def _build_core_config(self, active_cfg: dict, dc_opt: Dict[int, str]):
port = int(active_cfg.get("port", self.default_config["port"]))
host = str(active_cfg.get("host", self.default_config["host"]))
secret = str(active_cfg.get("secret") or "").strip()
if not secret:
secret = os.urandom(16).hex()
active_cfg["secret"] = secret
buf_kb = int(active_cfg.get("buf_kb", self.default_config["buf_kb"]))
pool_size = int(active_cfg.get(
"pool_size", self.default_config["pool_size"]))
return tg_ws_proxy.ProxyConfig(
port=port,
host=host,
secret=secret,
dc_redirects=dc_opt,
buffer_size=max(4, buf_kb) * 1024,
pool_size=max(0, pool_size),
)
def ensure_dirs(self):
self.app_dir.mkdir(parents=True, exist_ok=True)
@@ -132,8 +155,7 @@ class ProxyAppRuntime:
self._async_stop = (loop, stop_ev)
try:
loop.run_until_complete(
self.run_proxy(port, dc_opt, stop_event=stop_ev, host=host))
loop.run_until_complete(self.run_proxy(stop_event=stop_ev))
except Exception as exc:
self.log.error("Proxy thread crashed: %s", exc)
if ("10048" in str(exc) or
@@ -143,6 +165,8 @@ class ProxyAppRuntime:
"Порт уже используется другим приложением.\n\n"
"Закройте приложение, использующее этот порт, "
"или измените порт в настройках прокси и перезапустите.")
else:
self._emit_error(str(exc) or exc.__class__.__name__)
finally:
loop.close()
self._async_stop = None
@@ -168,6 +192,9 @@ class ProxyAppRuntime:
self._emit_error("Ошибка конфигурации:\n%s" % exc)
return False
tg_ws_proxy.proxy_config = self._build_core_config(active_cfg, dc_opt)
self.save_config(active_cfg)
self.log.info("Starting proxy on %s:%d ...", host, port)
tg_ws_proxy._RECV_BUF = max(4, buf_kb) * 1024
tg_ws_proxy._SEND_BUF = tg_ws_proxy._RECV_BUF

View File

@@ -493,6 +493,7 @@ class Stats:
self.bytes_down = 0
self.pool_hits = 0
self.pool_misses = 0
self.last_transport_route: Optional[str] = None
def summary(self) -> str:
pool_total = self.pool_hits + self.pool_misses
@@ -511,6 +512,27 @@ class Stats:
_stats = Stats()
def reset_stats() -> None:
global _stats
_stats = Stats()
def get_stats_snapshot() -> Dict[str, object]:
return {
"connections_total": _stats.connections_total,
"connections_active": _stats.connections_active,
"connections_ws": _stats.connections_ws,
"connections_tcp_fallback": _stats.connections_tcp_fallback,
"connections_bad": _stats.connections_bad,
"ws_errors": _stats.ws_errors,
"bytes_up": _stats.bytes_up,
"bytes_down": _stats.bytes_down,
"pool_hits": _stats.pool_hits,
"pool_misses": _stats.pool_misses,
"last_transport_route": _stats.last_transport_route,
}
class _WsPool:
WS_POOL_MAX_AGE = 120.0
@@ -769,6 +791,7 @@ async def _tcp_fallback(reader, writer, dst, port, relay_init, label,
return False
_stats.connections_tcp_fallback += 1
_stats.last_transport_route = "tcp_fallback"
rw.write(relay_init)
await rw.drain()
await _bridge_tcp_reencrypt(reader, writer, rr, rw, label,
@@ -965,6 +988,7 @@ async def _handle_client(reader, writer, secret: bytes):
dc_fail_until.pop(dc_key, None)
_stats.connections_ws += 1
_stats.last_transport_route = "telegram_ws_direct"
splitter = None
try: