LAN access: bind 0.0.0.0 + expose LAN URL (capabilities.lan, UI badge)
This commit is contained in:
+36
-4
@@ -22,14 +22,37 @@ def _pick_port():
|
||||
# (2 engine cung 8000 -> request roi vao engine ngau nhien -> UI loi).
|
||||
# Listen socket khong can SO_REUSEADDR (TIME_WAIT chi ap dung cho
|
||||
# connection socket, khong phai listen socket).
|
||||
# Bind 0.0.0.0 (GIONG uvicorn) — kiem tra dung port ma server se
|
||||
# dung, truong hop port bi chiem tren interface khac khong sot.
|
||||
try:
|
||||
s.bind(("127.0.0.1", port))
|
||||
s.bind(("0.0.0.0", port))
|
||||
return port
|
||||
except OSError:
|
||||
continue
|
||||
return PORT_RANGE[0]
|
||||
|
||||
|
||||
def _lan_ips():
|
||||
"""IPv4 cua may tren LAN (bo loopback) — client browser o may khac mo app."""
|
||||
ips = []
|
||||
try:
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
|
||||
s.connect(("8.8.8.8", 80))
|
||||
ip = s.getsockname()[0]
|
||||
if ip and not ip.startswith("127.") and ip not in ips:
|
||||
ips.append(ip)
|
||||
except OSError:
|
||||
pass
|
||||
try:
|
||||
for info in socket.getaddrinfo(socket.gethostname(), None, socket.AF_INET):
|
||||
ip = info[4][0]
|
||||
if ip and not ip.startswith("127.") and ip not in ips:
|
||||
ips.append(ip)
|
||||
except OSError:
|
||||
pass
|
||||
return ips
|
||||
|
||||
|
||||
def _parent_alive(pid):
|
||||
# Windows: os.kill(pid, 0) KHONG kiem tra ton tai — no goi
|
||||
# TerminateProcess (giai thich: moi sig khac CTRL_C/BREAK deu terminate).
|
||||
@@ -100,7 +123,10 @@ def main():
|
||||
import uvicorn
|
||||
import app.main # noqa: F401 — import tuong minh de PyInstaller bundle du package app
|
||||
|
||||
config = uvicorn.Config(app.main.app, host="127.0.0.1", port=port,
|
||||
# Bind 0.0.0.0: client browser o may khac tren LAN mo app qua dia chi IP
|
||||
# (http://<LAN-IP>:port) — lam viec realtime voi may chay standalone.
|
||||
# Cua so Tauri (shell) van mo http://127.0.0.1:port nhu cu.
|
||||
config = uvicorn.Config(app.main.app, host="0.0.0.0", port=port,
|
||||
log_level="info", access_log=False)
|
||||
server = uvicorn.Server(config)
|
||||
|
||||
@@ -117,8 +143,14 @@ def main():
|
||||
return
|
||||
threading.Thread(target=_watchdog, daemon=True).start()
|
||||
|
||||
logging.getLogger("desktop_engine").info(
|
||||
"SonicForge engine listening on 127.0.0.1:%d", port)
|
||||
logger = logging.getLogger("desktop_engine")
|
||||
logger.info("SonicForge engine listening on 0.0.0.0:%d", port)
|
||||
lan_ips = _lan_ips()
|
||||
if lan_ips:
|
||||
logger.info("LAN access — mo browser o may khac: %s",
|
||||
" | ".join("http://%s:%d" % (ip, port) for ip in lan_ips))
|
||||
else:
|
||||
logger.warning("Khong phat hien dia chi LAN — client may khac khong truy cap duoc")
|
||||
server.run()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user