Spaces:
Running
Running
| #!/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 ุชูุฒูุน ุงูู ูุงู โโโโโโโโโโโโโโโ | |
| 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 ุชุญุฏูุซ ุญุงูุฉ ุงูุฃุฌูุฒุฉ โโโโโโโโโโโโโโโ | |
| 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 โโโโโโโโโโโโโโโ | |
| def index(): | |
| return render_template("dashboard.html") | |
| # โโโโโโโโโโโโโโโ ุฏุฑุฏุดุฉ โโโโโโโโโโโโโโโ | |
| 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 =PORT) | |