cloudPlat/backend/routes/servers.py

139 lines
4.5 KiB
Python
Raw Normal View History

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