Files
pit-router/app/routes/gateways.py

100 lines
2.6 KiB
Python

"""
Gateway 路由
"""
from flask import Blueprint, request, jsonify
from flask_jwt_extended import jwt_required
from datetime import datetime
import bcrypt
from app.models import db, Gateway
gateways_bp = Blueprint('gateways', __name__)
@gateway_bp.route('/', methods=['GET'])
@jwt_required()
def get_gateways():
"""获取 Gateway 列表"""
gateways = Gateway.query.all()
return jsonify({'gateways': [g.to_dict() for g in gateways]}), 200
@gateway_bp.route('/', methods=['POST'])
@jwt_required()
def register_gateway():
"""注册 Gateway"""
data = request.get_json()
name = data.get('name')
url = data.get('url')
token = data.get('token')
if not all([name, url]):
return jsonify({'error': 'Missing required fields'}), 400
if Gateway.query.filter_by(name=name).first():
return jsonify({'error': 'Gateway name already exists'}), 400
# Token 哈希
token_hash = None
if token:
token_hash = bcrypt.hashpw(
token.encode('utf-8'),
bcrypt.gensalt()
).decode('utf-8')
gateway = Gateway(
name=name,
url=url,
token_hash=token_hash,
status='offline'
)
db.session.add(gateway)
db.session.commit()
return jsonify({'gateway': gateway.to_dict()}), 201
@gateway_bp.route('/<gateway_id>', methods=['DELETE'])
@jwt_required()
def delete_gateway(gateway_id):
"""注销 Gateway"""
gateway = Gateway.query.get(gateway_id)
if not gateway:
return jsonify({'error': 'Gateway not found'}), 404
db.session.delete(gateway)
db.session.commit()
return jsonify({'message': 'Gateway deleted'}), 200
@gateway_bp.route('/<gateway_id>/status', methods=['GET'])
@jwt_required()
def get_gateway_status(gateway_id):
"""获取 Gateway 状态"""
gateway = Gateway.query.get(gateway_id)
if not gateway:
return jsonify({'error': 'Gateway not found'}), 404
return jsonify({
'gateway_id': gateway.id,
'status': gateway.status,
'agent_count': gateway.agent_count,
'last_heartbeat': gateway.last_heartbeat.isoformat() if gateway.last_heartbeat else None
}), 200
@gateway_bp.route('/<gateway_id>/heartbeat', methods=['POST'])
def gateway_heartbeat(gateway_id):
"""Gateway 心跳上报"""
gateway = Gateway.query.get(gateway_id)
if not gateway:
return jsonify({'error': 'Gateway not found'}), 404
gateway.last_heartbeat = datetime.utcnow()
gateway.status = 'online'
db.session.commit()
return jsonify({'status': 'ok'}), 200