BBFbyOpus
This commit is contained in:
@@ -8,6 +8,10 @@ from typing import List, Dict
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Минимальный допустимый prefixlen (больше число = меньше сеть)
|
||||
# /16 = 65534 хоста, /8 = 16M хостов -- слишком много
|
||||
MIN_PREFIX_LEN = 16
|
||||
|
||||
|
||||
class DiscoveryService:
|
||||
def __init__(self, port: int = 38899):
|
||||
@@ -23,9 +27,25 @@ class DiscoveryService:
|
||||
"""
|
||||
env_network = os.getenv("SCAN_NETWORK")
|
||||
if env_network:
|
||||
return [s.strip() for s in env_network.split(",")]
|
||||
subnets = []
|
||||
for s in env_network.split(","):
|
||||
s = s.strip()
|
||||
try:
|
||||
net = ipaddress.IPv4Network(s, strict=False)
|
||||
if net.prefixlen < MIN_PREFIX_LEN:
|
||||
logger.warning(
|
||||
f"Подсеть {s} слишком большая (/{net.prefixlen}), "
|
||||
f"ограничиваю до /{MIN_PREFIX_LEN}"
|
||||
)
|
||||
net = ipaddress.IPv4Network(
|
||||
f"{net.network_address}/{MIN_PREFIX_LEN}", strict=False
|
||||
)
|
||||
subnets.append(str(net))
|
||||
except ValueError as e:
|
||||
logger.error(f"Неверный формат подсети {s}: {e}")
|
||||
return subnets if subnets else ["192.168.1.0/24"]
|
||||
|
||||
# Автоопределение (твой старый метод)
|
||||
# Автоопределение
|
||||
try:
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
|
||||
# Коннект не создает трафика, но заставляет ОС выбрать нужный интерфейс
|
||||
@@ -49,7 +69,7 @@ class DiscoveryService:
|
||||
loop = asyncio.get_running_loop()
|
||||
message = json.dumps(self.discover_msg).encode()
|
||||
|
||||
logger.debug(f"🚀 Начинаю сканирование сетей: {', '.join(subnets)}...")
|
||||
logger.debug(f"Начинаю сканирование сетей: {', '.join(subnets)}...")
|
||||
|
||||
# Рассылаем запросы по всем целевым сетям
|
||||
for subnet in subnets:
|
||||
@@ -61,7 +81,7 @@ class DiscoveryService:
|
||||
except Exception:
|
||||
continue
|
||||
except ValueError as e:
|
||||
logger.error(f"❌ Неверный формат подсети {subnet}: {e}")
|
||||
logger.error(f"Неверный формат подсети {subnet}: {e}")
|
||||
|
||||
# Собираем ответы
|
||||
start_time = loop.time()
|
||||
@@ -107,9 +127,7 @@ class DiscoveryService:
|
||||
found_devices = await self.scan_network()
|
||||
for dev_data in found_devices:
|
||||
state_manager.update_device(dev_data)
|
||||
logger.info(
|
||||
f"📡 Discovery: онлайн {len(state_manager.devices)} устройств"
|
||||
)
|
||||
logger.info(f"Discovery: онлайн {len(state_manager.devices)} устройств")
|
||||
except Exception as e:
|
||||
logger.error(f"❌ Discovery background error: {e}")
|
||||
logger.error(f"Discovery background error: {e}")
|
||||
await asyncio.sleep(interval)
|
||||
|
||||
Reference in New Issue
Block a user