from flask import Blueprint, request, jsonify from flask_jwt_extended import jwt_required, get_jwt_identity from models import Server from app import db import paramiko import socket servers_bp = Blueprint('servers', __name__) def check_server_status(ip, port, username): """检查服务器连接状态""" try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip, port=port, username=username, timeout=5) ssh.close() return 'online' except: return 'offline' @servers_bp.route('', methods=['GET']) @jwt_required() def get_servers(): servers = Server.query.all() result = [] for server in servers: # 实时检查服务器状态 server.status = check_server_status(server.ip, server.port, server.username) db.session.commit() result.append({ 'id': server.id, 'name': server.name, 'ip': server.ip, 'port': server.port, 'username': server.username, 'status': server.status, 'description': server.description, 'createdAt': server.created_at.strftime('%Y-%m-%d %H:%M:%S') }) return jsonify(result) @servers_bp.route('', methods=['POST']) @jwt_required() def create_server(): data = request.get_json() server = Server( name=data['name'], ip=data['ip'], port=data.get('port', 22), username=data.get('username', 'root'), description=data.get('description', '') ) # 检查服务器连接状态 server.status = check_server_status(server.ip, server.port, server.username) db.session.add(server) db.session.commit() return jsonify({'message': '服务器添加成功', 'id': server.id}), 201 @servers_bp.route('/', methods=['PUT']) @jwt_required() def update_server(server_id): server = Server.query.get_or_404(server_id) data = request.get_json() server.name = data.get('name', server.name) server.ip = data.get('ip', server.ip) server.port = data.get('port', server.port) server.username = data.get('username', server.username) server.description = data.get('description', server.description) # 重新检查服务器状态 server.status = check_server_status(server.ip, server.port, server.username) db.session.commit() return jsonify({'message': '服务器更新成功'}) @servers_bp.route('/', methods=['DELETE']) @jwt_required() def delete_server(server_id): server = Server.query.get_or_404(server_id) db.session.delete(server) db.session.commit() return jsonify({'message': '服务器删除成功'}) @servers_bp.route('//test', methods=['POST']) @jwt_required() def test_server_connection(server_id): server = Server.query.get_or_404(server_id) try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(server.ip, port=server.port, username=server.username, timeout=10) # 执行简单命令测试 stdin, stdout, stderr = ssh.exec_command('echo "connection test"') output = stdout.read().decode().strip() ssh.close() return jsonify({ 'status': 'success', 'message': '连接测试成功', 'output': output }) except Exception as e: return jsonify({ 'status': 'error', 'message': f'连接测试失败: {str(e)}' }), 400