This commit is contained in:
ciomek committed 2026-01-27 22:26:03 +01:00
1 parent 12137abe0f
commit e5ebdd59c9
18 files changed
+42 -51

No files matched your search

+72
View File
@@ -0,0 +1,72 @@
import datetime
from enum import Enum
from colony.core.network.requests import CommandRequest
from colony.core.storage import DEFAULT_STORAGE_FILES
from colony.core.roles.role import Role
from colony.core.roles.unit.role import Unit
from colony.core.roles.vaultwarden.role import VaultWarden
from colony.transport.discover import Discover
from colony.transport.whisperer import Whisperer
class Explorer(Role):
CONTINUOUS = True
LOOP_SECONDS_WAIT = 60
class COMMANDS(Enum):
pass
def __init__(self, context):
commands = {
}
super().__init__(commands, context)
def loop(self):
self.logger.info("Getting network snapshot")
snapshot = self.get_snapshot()['result']
self.logger.debug(f"Loaded snapshot")
discovered_peers = self.discover_peers()
self.logger.info(f"Discovered peers: {list(discovered_peers.keys())}")
for ip, port in discovered_peers.items():
self.logger.info(f"Sending SHOW_STATS command to {ip}:{port}")
stats = self.fetch_stats_from_peer(ip, port)
self.logger.debug(f"Received stats from {ip}")
snapshot[ip] = stats | {'last_update': datetime.datetime.now().isoformat(), 'last_seen': datetime.datetime.now().isoformat(), 'status': 'reachable'}
missing_ips = set(snapshot.keys()) - set(discovered_peers.keys())
for ip in missing_ips:
self.logger.warning(f"Peer {ip} was in snapshot but not reachable. Marking as unreachable")
snapshot[ip]['last_update'] = datetime.datetime.now().isoformat()
snapshot[ip]['status'] = 'unreachable'
self.set_snapshot(snapshot)
self.logger.info("Snapshot updated successfully")
def get_snapshot(self):
return self.context.execute(VaultWarden.COMMANDS.OPEN, DEFAULT_STORAGE_FILES.COLONY_SNAPSHOT.value)
def set_snapshot(self, snapshot):
return self.context.execute(VaultWarden.COMMANDS.OVERWRITE, DEFAULT_STORAGE_FILES.COLONY_SNAPSHOT.value, snapshot)
def discover_peers(self):
peers = {}
# for ip in get_local_subnet().hosts():
for ip in ['192.168.65.101', '192.168.65.102']:
try:
port = Discover.request(str(ip))
peers[str(ip)] = port
except (TimeoutError, ConnectionRefusedError):
continue
return peers
def fetch_stats_from_peer(self, ip, port):
return self.context.execute_to_unregistered_node(ip, port, Unit.COMMANDS.SHOW_STATS)