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