119 lines
3.6 KiB
Python
119 lines
3.6 KiB
Python
|
|
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('/<int:server_id>', 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('/<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):
|
||
|
|
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
|