File size: 2,036 Bytes
042d8bf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import socket
import time
from zeroconf import Zeroconf, ServiceBrowser, ServiceInfo
from peer_discovery import PORT

class Listener:
    def __init__(self):
        self.peers = []

    def add_service(self, zc, type_, name):
        info = zc.get_service_info(type_, name)
        if info:
            ip = socket.inet_ntoa(info.addresses[0])
            peer_data = {
                'ip': ip,
                'port': info.port,
                'load': float(info.properties.get(b'load', 0)),
                'node_id': info.properties.get(b'node_id', b'unknown').decode(),
                'last_seen': time.time()
            }
            if peer_data not in self.peers:
                self.peers.append(peer_data)

    def update_service(self, zc, type_, name):
        """مطلوب بواسطة Zeroconf"""
        self.add_service(zc, type_, name)

    def remove_service(self, zc, type_, name):
        """اختياري"""
        pass

def register_service(ip: str, port: int, load: float = 0.0):
    zc = Zeroconf()
    service_name = f"{socket.gethostname()}-{int(time.time())}._tasknode._tcp.local."
    service_info = ServiceInfo(
        "_tasknode._tcp.local.",
        service_name,
        addresses=[socket.inet_aton(ip)],
        port=port,
        properties={
            b'load': str(load).encode(),
            b'node_id': socket.gethostname().encode()
        }
    )
    zc.register_service(service_info)
    print(f"✅ Service registered: {service_name} @ {ip}:{port}")
    return zc  # أبقِ المرجع حياً

def discover_peers(timeout=2):
    zc = Zeroconf()
    listener = Listener()
    ServiceBrowser(zc, "_tasknode._tcp.local.", listener)
    time.sleep(timeout)
    zc.close()
    return listener.peers

if __name__ == "__main__":
    local_ip = socket.gethostbyname(socket.gethostname())
    port = PORT

    zc = register_service(local_ip, port, load=0.1)

    peers = discover_peers()
    print("✅ Available peers:", peers)

    input("🔵 Press Enter to exit...\n")
    zc.close()