This commit is contained in:
ciomek committed 2026-09-19 20:26:47 +02:00
1 parent d1b9ca0548
commit 76f9445697
18 files changed
+492 -210

No files matched your search

+30 -12
View File
@@ -1,32 +1,50 @@
import socket
import struct
import time
from colony.core.logger.logging import get_logger
class Discover:
DISCOVER_PORT = 28149
MAGIC = b"OK"
CLIENT_TIMEOUT = 2
@staticmethod
def listen(real_port, host="0.0.0.0"):
logger = get_logger(Discover.__name__)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, Discover.DISCOVER_PORT))
s.listen()
while True:
conn, _ = s.accept()
try:
data = conn.recv(2)
if data == Discover.MAGIC:
conn.sendall(struct.pack("!H", real_port))
finally:
conn.close()
conn, _ = s.accept()
except OSError as e:
logger.error(f"Accept failed: {e}")
time.sleep(1)
continue
with conn:
try:
conn.settimeout(Discover.CLIENT_TIMEOUT)
if conn.recv(len(Discover.MAGIC)) == Discover.MAGIC:
conn.sendall(struct.pack("!H", real_port))
except OSError as e:
logger.debug(f"Discovery request failed: {e}")
@staticmethod
def request(target_host, timeout=3):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(timeout)
s.connect((target_host, Discover.DISCOVER_PORT))
s.sendall(Discover.MAGIC)
data = s.recv(2)
s.close()
with socket.create_connection((target_host, Discover.DISCOVER_PORT), timeout=timeout) as s:
s.sendall(Discover.MAGIC)
data = b""
while len(data) < 2:
chunk = s.recv(2 - len(data))
if not chunk:
raise ConnectionError("Discovery response was cut short")
data += chunk
return struct.unpack("!H", data)[0]