Test / external_server.py
mrwabnalas40's picture
Upload 10 files
eebf941 verified
#!/usr/bin/env python3
"""
external_server.py โ€” ุณูŠุฑูุฑ ู…ุฑูƒุฒูŠ ู„ุชูˆุฒูŠุน ุงู„ู…ู‡ุงู… + Dashboard ุชูุงุนู„ูŠ
"""
import logging
import requests
from flask import Flask, request, jsonify, render_template
from flask_cors import CORS
from flask_socketio import SocketIO, emit
from peer_discovery import PEERS
from peer_discovery import PORT
logging.basicConfig(level=logging.INFO)
app = Flask(__name__)
CORS(app, resources={r"/*": {"origins": "*"}})
socketio = SocketIO(app, cors_allowed_origins="*")
connected_peers = {} # {node_id: {"cpu":%, "ram":%, "gpu":%}}
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ุงุฎุชูŠุงุฑ ุฃูุถู„ Peer โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
def select_best_peer():
peers_list = list(PEERS)
if not peers_list:
logging.warning("โš ๏ธ ู„ุง ุชูˆุฌุฏ ุฃุฌู‡ุฒุฉ ู…ุณุฌู„ุฉ ุญุงู„ูŠุงู‹.")
return None
try:
peer_loads = []
for peer_url in peers_list:
try:
resp = requests.get(f"{peer_url.replace('/run_task','')}/status", timeout=2)
if resp.ok:
data = resp.json()
peer_loads.append((peer_url, data.get("cpu_load", 100)))
except:
continue
if not peer_loads:
return None
peer_loads.sort(key=lambda x: x[1])
return peer_loads[0][0]
except Exception as e:
logging.error(f"โŒ ุฎุทุฃ ููŠ ุงุฎุชูŠุงุฑ ุงู„ู€ Peer: {e}")
return None
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ API ุชูˆุฒูŠุน ุงู„ู…ู‡ุงู… โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
@app.route("/submit_task", methods=["POST"])
def submit_task():
data = request.get_json()
if not data or "task_id" not in data:
return jsonify({"error": "ูŠุฌุจ ุชุญุฏูŠุฏ task_id"}), 400
peer = select_best_peer()
if not peer:
return jsonify({"error": "ู„ุง ุชูˆุฌุฏ ุฃุฌู‡ุฒุฉ ู…ุชุงุญุฉ ุญุงู„ูŠุงู‹"}), 503
try:
resp = requests.post(peer, json=data, timeout=10)
if resp.ok:
return jsonify({"status": "success", "result": resp.json()})
else:
return jsonify({"error": "ูุดู„ ุฅุฑุณุงู„ ุงู„ู…ู‡ู…ุฉ"}), 500
except Exception as e:
logging.error(f"โŒ ุฎุทุฃ ููŠ ุฅุฑุณุงู„ ุงู„ู…ู‡ู…ุฉ: {e}")
return jsonify({"error": str(e)}), 500
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ API ุชุญุฏูŠุซ ุญุงู„ุฉ ุงู„ุฃุฌู‡ุฒุฉ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
@app.route("/update_status", methods=["POST"])
def update_status():
data = request.json
node_id = data.get("node_id")
if not node_id:
return jsonify({"error": "node_id ู…ุทู„ูˆุจ"}), 400
connected_peers[node_id] = {
"cpu": data.get("cpu"),
"ram": data.get("ram"),
"gpu": data.get("gpu")
}
socketio.emit("update_peers", connected_peers, broadcast=True)
return jsonify({"status": "ok"})
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ุตูุญุฉ Dashboard โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
@app.route("/")
def index():
return render_template("dashboard.html")
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ุฏุฑุฏุดุฉ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
@socketio.on("send_message")
def handle_message(data):
socketio.emit("receive_message", data, broadcast=True)
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ุชุดุบูŠู„ ุงู„ุณูŠุฑูุฑ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
if __name__ == "__main__":
logging.info("๐Ÿš€ ุจุฏุก ุงู„ุณูŠุฑูุฑ ุงู„ู…ุฑูƒุฒูŠ ู…ุน Dashboard ูˆุฏุฑุฏุดุฉ")
socketio.run(app, host="0.0.0.0", port =5005)