Spaces:
Runtime error
Runtime error
File size: 6,618 Bytes
498f51d |
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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
"""
internet_scanner.py - ماسح للبحث عن أجهزة DTS على الإنترنت
"""
import requests
import threading
import time
import socket
from concurrent.futures import ThreadPoolExecutor, as_completed
import logging
from peer_discovery import PORT
class InternetScanner:
def __init__(self):
self.discovered_peers = set()
self.scan_ranges = [
# نطاقات IP شائعة للخوادم العامة
"8.8.8.0/24", # Google DNS range
"1.1.1.0/24", # Cloudflare range
"208.67.222.0/24", # OpenDNS range
]
def scan_ip_range(self, ip_range: str, port: int = PORT):
"""مسح نطاق IP للبحث عن خوادم DTS"""
import ipaddress
try:
network = ipaddress.ip_network(ip_range, strict=False)
active_peers = []
with ThreadPoolExecutor(max_workers=50) as executor:
futures = []
for ip in network.hosts():
future = executor.submit(self.check_dts_node, str(ip), port)
futures.append(future)
for future in as_completed(futures, timeout=30):
try:
result = future.result()
if result:
active_peers.append(result)
except:
continue
return active_peers
except Exception as e:
logging.error(f"خطأ في مسح النطاق {ip_range}: {e}")
return []
def check_dts_node(self, ip: str, port: int = PORT) -> str:
"""فحص IP معين للتأكد من وجود خادم DTS مع المشروع"""
try:
# فحص صفحة الصحة العامة
health_url = f"http://{ip}:{port}/health"
response = requests.get(health_url, timeout=2)
if response.status_code == 200:
# فحص وجود المشروع الصحيح
run_url = f"http://{ip}:{port}/run"
# اختبار مهمة من المشروع للتأكد
test_payload = {
"func": "matrix_multiply",
"args": [2],
"kwargs": {}
}
test_response = requests.post(run_url, json=test_payload, timeout=3)
# فحص إضافي للتأكد من هوية المشروع
project_check = requests.get(f"http://{ip}:{port}/project_info", timeout=2)
if (test_response.status_code in [200, 404] and
project_check.status_code == 200):
project_data = project_check.json()
# التحقق من معرف المشروع الصحيح
if (project_data.get("project_name") == "distributed-task-system" and
project_data.get("version") == "1.0"):
logging.info(f"✅ اكتُشف خادم DTS صحيح: {ip}:{port}")
return run_url
else:
logging.warning(f"⚠️ خادم على {ip}:{port} لكن مشروع مختلف")
except:
pass
return None
def scan_public_repositories(self):
"""البحث في المستودعات العامة عن عناوين خوادم DTS"""
try:
# البحث في GitHub عن مشاريع DTS
github_api = "https://api.github.com/search/repositories"
params = {
"q": "distributed task system port:PORT",
"sort": "updated",
"per_page": 10
}
response = requests.get(github_api, params=params, timeout=10)
if response.status_code == 200:
repos = response.json().get("items", [])
for repo in repos:
# محاولة استخراج IPs من وصف المشروع أو README
if repo.get("description"):
self.extract_ips_from_text(repo["description"])
except Exception as e:
logging.warning(f"خطأ في البحث في المستودعات: {e}")
def extract_ips_from_text(self, text: str):
"""استخراج عناوين IP من النص"""
import re
ip_pattern = r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b'
ips = re.findall(ip_pattern, text)
for ip in ips:
try:
# التحقق من صحة IP
socket.inet_aton(ip)
peer_url = f"http://{ip}:PORT/run"
# فحص سريع
if self.check_dts_node(ip):
self.discovered_peers.add(peer_url)
except:
continue
def start_continuous_scan(self):
"""بدء المسح المستمر"""
def scan_loop():
while True:
try:
# مسح النطاقات المحددة
for ip_range in self.scan_ranges:
peers = self.scan_ip_range(ip_range)
for peer in peers:
self.discovered_peers.add(peer)
# البحث في المستودعات العامة
self.scan_public_repositories()
logging.info(f"اكتُشف {len(self.discovered_peers)} خادم على الإنترنت")
except Exception as e:
logging.error(f"خطأ في المسح المستمر: {e}")
# انتظار 30 دقيقة قبل المسح التالي
time.sleep(1800)
thread = threading.Thread(target=scan_loop, daemon=True)
thread.start()
logging.info("🔍 بدء المسح المستمر للإنترنت")
def get_discovered_peers(self):
"""الحصول على قائمة الأجهزة المكتشفة"""
return list(self.discovered_peers)
# إنشاء مثيل عام
internet_scanner = InternetScanner()
|