mirror of
https://github.com/Flowseal/tg-ws-proxy.git
synced 2026-06-18 12:38:27 +03:00
feat(runtime): adapt android_migration shell to upstream mtproto core
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user