sdk/other/server.py

73 lines
2.3 KiB
Python

from flask import Flask, request, jsonify, send_from_directory
import csv, os
import config
app = Flask(__name__)
# 读取 CSV 文件
def read_csv(file_path):
if not os.path.exists(file_path):
return []
with open(file_path, newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
return list(reader)
# 写入 CSV 文件
def write_csv(file_path, fieldnames, rows):
os.makedirs(os.path.dirname(file_path) or ".", exist_ok=True)
with open(file_path, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(rows)
# 获取服务器镜像列表
@app.route("/api/images")
def get_images():
data = read_csv(config.SERVER_FILE)
for d in data:
d["download_url"] = f"/images/{d['image_path']}"
return jsonify(data)
# 接收客户端上报
@app.route("/api/client/update", methods=["POST"])
def update_client():
data = request.json
client_id = data.get("client_id")
images = data.get("images", [])
if not client_id or not images:
return jsonify({"status":"error","msg":"Invalid data"}), 400
# 读取原有客户端 CSV
client_data = read_csv(config.CLIENT_FILE)
client_dict = { row['image_name'] + "_" + row.get("client_id",""): row for row in client_data }
for img in images:
key = img["image_name"] + "_" + client_id
client_dict[key] = {
"client_id": client_id,
"image_name": img["image_name"],
"image_tag": img["image_tag"],
"last_updated": img["last_updated"]
}
# 写回 CSV
write_csv(config.CLIENT_FILE, config.CLIENT_FIELDS, list(client_dict.values()))
return jsonify({"status":"ok"})
# 提供镜像下载
@app.route("/images/<path:filename>")
def serve_image(filename):
return send_from_directory(config.IMG_DIR, filename)
if __name__ == "__main__":
# 确保 CSV 文件存在
if not os.path.exists(config.SERVER_FILE):
write_csv(config.SERVER_FILE, config.SERVER_FIELDS, [])
if not os.path.exists(config.CLIENT_FILE):
write_csv(config.CLIENT_FILE, config.CLIENT_FIELDS, [])
# 确保镜像目录存在
os.makedirs(config.IMG_DIR, exist_ok=True)
app.run(host=config.HOST, port=config.PORT, debug=config.DEBUG)