GitHub Action commited on
Commit
8e795e3
·
1 Parent(s): e0dbde1

Sync from GitHub with Git LFS

Browse files
Files changed (1) hide show
  1. agents/peer_sync.py +63 -28
agents/peer_sync.py CHANGED
@@ -6,6 +6,7 @@ import time
6
  import json
7
  import uuid
8
  import ipaddress
 
9
  from tools.storage import Storage
10
  from datetime import datetime
11
 
@@ -14,36 +15,60 @@ my_id = storage.get_config_value("agent_id", str(uuid.uuid4()))
14
  agent_name = storage.get_config_value("agent_name", "HMP-Agent")
15
 
16
  # ======================
17
- # Формируем TCP/UDP порты для прослушивания
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  # ======================
19
  def get_listening_ports():
20
  tcp_ports = set()
21
  udp_ports = set()
22
-
23
  for key in ["global_addresses", "local_addresses"]:
24
- addresses = json.loads(storage.get_config_value(key, "[]"))
25
  for a in addresses:
26
- proto, hostport = a.split("://")
27
- host, port = hostport.split(":")
28
- port = int(port)
29
- if proto == "tcp":
30
- tcp_ports.add(port)
31
- elif proto in ["udp", "utp"]:
32
- udp_ports.add(port)
33
- elif proto == "any":
34
- tcp_ports.add(port)
35
- udp_ports.add(port)
36
-
 
 
 
 
37
  return sorted(tcp_ports), sorted(udp_ports)
38
 
39
  tcp_ports, udp_ports = get_listening_ports()
40
 
41
  # ======================
42
- # LAN Discovery
43
  # ======================
44
  def lan_discovery():
45
- DISCOVERY_INTERVAL = 300 # каждые 5 минут
46
- udp_port_set = set(udp_ports)
 
 
 
 
 
47
 
48
  while True:
49
  local_ip = get_local_ip()
@@ -59,7 +84,11 @@ def lan_discovery():
59
  try:
60
  sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
61
  sock.settimeout(0.5)
62
- msg = json.dumps({"id": my_id, "name": agent_name}).encode("utf-8")
 
 
 
 
63
  sock.sendto(msg, (str(ip), port))
64
  sock.close()
65
  except:
@@ -81,7 +110,7 @@ def get_local_ip():
81
  # ======================
82
  def udp_discovery_listener():
83
  sockets = []
84
- for port in udp_ports:
85
  sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
86
  sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
87
  sock.bind(("", port))
@@ -90,11 +119,11 @@ def udp_discovery_listener():
90
  while True:
91
  for sock in sockets:
92
  try:
93
- data, addr = sock.recvfrom(1024)
94
  msg = json.loads(data.decode("utf-8"))
95
  peer_id = msg.get("id")
96
  if peer_id == my_id:
97
- continue # не добавляем себя
98
 
99
  name = msg.get("name", "unknown")
100
  addresses = msg.get("addresses", [f"{addr[0]}:{sock.getsockname()[1]}"])
@@ -113,15 +142,21 @@ def udp_discovery_listener():
113
  continue
114
 
115
  # ======================
116
- # UDP Discovery Sender
117
  # ======================
118
  def udp_discovery_sender():
119
  sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
120
  sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
121
 
122
- global_addresses = json.loads(storage.get_config_value("global_addresses", "[]"))
123
  msg = {"id": my_id, "name": agent_name, "addresses": global_addresses}
124
 
 
 
 
 
 
 
125
  last_broadcast = 0
126
  DISCOVERY_INTERVAL = 60
127
  BROADCAST_INTERVAL = 600
@@ -129,11 +164,11 @@ def udp_discovery_sender():
129
  while True:
130
  now = time.time()
131
  if int(now) % DISCOVERY_INTERVAL == 0:
132
- for port in udp_ports:
133
  sock.sendto(json.dumps(msg).encode("utf-8"), ("239.255.0.1", port))
134
  if now - last_broadcast > BROADCAST_INTERVAL:
135
  sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
136
- for port in udp_ports:
137
  sock.sendto(json.dumps(msg).encode("utf-8"), ("255.255.255.255", port))
138
  last_broadcast = now
139
  time.sleep(1)
@@ -148,7 +183,7 @@ def peer_exchange():
148
  for peer in peers:
149
  peer_id, addresses = peer["id"], peer["addresses"]
150
  if peer_id == my_id:
151
- continue # пропускаем себя
152
 
153
  try:
154
  addr_list = json.loads(addresses)
@@ -160,10 +195,10 @@ def peer_exchange():
160
  if proto not in ["tcp", "any"]:
161
  continue
162
  try:
163
- host, port = hostport.split(":")
164
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
165
  s.settimeout(2)
166
- s.connect((host, int(port)))
167
  s.sendall(b"PEER_EXCHANGE_REQUEST")
168
  s.close()
169
  break
 
6
  import json
7
  import uuid
8
  import ipaddress
9
+ import re
10
  from tools.storage import Storage
11
  from datetime import datetime
12
 
 
15
  agent_name = storage.get_config_value("agent_name", "HMP-Agent")
16
 
17
  # ======================
18
+ # Парсер host:port
19
+ # ======================
20
+ def parse_hostport(hostport):
21
+ if hostport.startswith("["): # IPv6
22
+ match = re.match(r"\[(.+)\]:(\d+)", hostport)
23
+ if match:
24
+ host = match.group(1)
25
+ port = int(match.group(2))
26
+ return host, port
27
+ else: # IPv4
28
+ if ":" in hostport:
29
+ host, port = hostport.rsplit(":", 1)
30
+ return host, int(port)
31
+ return None, None
32
+
33
+ # ======================
34
+ # Сбор TCP/UDP портов для прослушивания
35
  # ======================
36
  def get_listening_ports():
37
  tcp_ports = set()
38
  udp_ports = set()
 
39
  for key in ["global_addresses", "local_addresses"]:
40
+ addresses = storage.get_config_value(key, [])
41
  for a in addresses:
42
+ try:
43
+ proto, hostport = a.split("://", 1)
44
+ host, port = parse_hostport(hostport)
45
+ if host is None or port is None:
46
+ continue
47
+ if proto == "tcp":
48
+ tcp_ports.add((host, port))
49
+ elif proto in ["udp", "utp"]:
50
+ udp_ports.add((host, port))
51
+ elif proto == "any":
52
+ tcp_ports.add((host, port))
53
+ udp_ports.add((host, port))
54
+ except Exception as e:
55
+ print(f"[PeerSync] Ошибка разбора адреса {a}: {e}")
56
+ continue
57
  return sorted(tcp_ports), sorted(udp_ports)
58
 
59
  tcp_ports, udp_ports = get_listening_ports()
60
 
61
  # ======================
62
+ # LAN Discovery (только local_addresses)
63
  # ======================
64
  def lan_discovery():
65
+ DISCOVERY_INTERVAL = 300
66
+ local_addresses = storage.get_config_value("local_addresses", [])
67
+ udp_port_set = set()
68
+ for a in local_addresses:
69
+ _, port = parse_hostport(a.split("://", 1)[1])
70
+ if port:
71
+ udp_port_set.add(port)
72
 
73
  while True:
74
  local_ip = get_local_ip()
 
84
  try:
85
  sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
86
  sock.settimeout(0.5)
87
+ msg = json.dumps({
88
+ "id": my_id,
89
+ "name": agent_name,
90
+ "addresses": local_addresses
91
+ }).encode("utf-8")
92
  sock.sendto(msg, (str(ip), port))
93
  sock.close()
94
  except:
 
110
  # ======================
111
  def udp_discovery_listener():
112
  sockets = []
113
+ for _, port in udp_ports:
114
  sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
115
  sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
116
  sock.bind(("", port))
 
119
  while True:
120
  for sock in sockets:
121
  try:
122
+ data, addr = sock.recvfrom(2048)
123
  msg = json.loads(data.decode("utf-8"))
124
  peer_id = msg.get("id")
125
  if peer_id == my_id:
126
+ continue
127
 
128
  name = msg.get("name", "unknown")
129
  addresses = msg.get("addresses", [f"{addr[0]}:{sock.getsockname()[1]}"])
 
142
  continue
143
 
144
  # ======================
145
+ # UDP Discovery Sender (только global_addresses)
146
  # ======================
147
  def udp_discovery_sender():
148
  sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
149
  sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
150
 
151
+ global_addresses = storage.get_config_value("global_addresses", [])
152
  msg = {"id": my_id, "name": agent_name, "addresses": global_addresses}
153
 
154
+ udp_port_set = set()
155
+ for a in global_addresses:
156
+ _, port = parse_hostport(a.split("://", 1)[1])
157
+ if port:
158
+ udp_port_set.add(port)
159
+
160
  last_broadcast = 0
161
  DISCOVERY_INTERVAL = 60
162
  BROADCAST_INTERVAL = 600
 
164
  while True:
165
  now = time.time()
166
  if int(now) % DISCOVERY_INTERVAL == 0:
167
+ for port in udp_port_set:
168
  sock.sendto(json.dumps(msg).encode("utf-8"), ("239.255.0.1", port))
169
  if now - last_broadcast > BROADCAST_INTERVAL:
170
  sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
171
+ for port in udp_port_set:
172
  sock.sendto(json.dumps(msg).encode("utf-8"), ("255.255.255.255", port))
173
  last_broadcast = now
174
  time.sleep(1)
 
183
  for peer in peers:
184
  peer_id, addresses = peer["id"], peer["addresses"]
185
  if peer_id == my_id:
186
+ continue
187
 
188
  try:
189
  addr_list = json.loads(addresses)
 
195
  if proto not in ["tcp", "any"]:
196
  continue
197
  try:
198
+ host, port = parse_hostport(hostport)
199
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
200
  s.settimeout(2)
201
+ s.connect((host, port))
202
  s.sendall(b"PEER_EXCHANGE_REQUEST")
203
  s.close()
204
  break