增加创建密钥对api端点

This commit is contained in:
jingrow 2025-07-28 00:57:56 +08:00
parent c86761e977
commit f738913dca
3 changed files with 106 additions and 8 deletions

View File

@ -290,6 +290,53 @@ class AliyunLightServerManager:
jingrow.log_error("获取地域列表失败", f"获取地域列表时发生错误: {str(e)}")
return {'success': False, 'error': str(e), 'message': '获取地域列表失败'}
def create_instance_key_pair(self, instance_id, key_pair_name, region_id='cn-shanghai'):
"""为实例创建密钥对"""
client = self._get_client(region_id)
try:
request = swas__open20200601_models.CreateInstanceKeyPairRequest(
region_id=region_id,
instance_id=instance_id,
key_pair_name=key_pair_name
)
runtime = util_models.RuntimeOptions()
response = client.create_instance_key_pair_with_options(request, runtime)
return {'success': True, 'data': self._convert_response_to_dict(response.body), 'message': '密钥对创建成功'}
except Exception as e:
jingrow.log_error("创建密钥对失败", f"为实例 {instance_id} 创建密钥对 {key_pair_name} 时发生错误: {str(e)}")
return {'success': False, 'error': str(e), 'message': '密钥对创建失败'}
def list_instance_key_pairs(self, instance_id, region_id='cn-shanghai'):
"""获取实例的密钥对列表"""
client = self._get_client(region_id)
try:
request = swas__open20200601_models.ListInstanceKeyPairsRequest(
region_id=region_id,
instance_id=instance_id
)
runtime = util_models.RuntimeOptions()
response = client.list_instance_key_pairs_with_options(request, runtime)
return {'success': True, 'data': self._convert_response_to_dict(response.body), 'message': '获取密钥对列表成功'}
except Exception as e:
jingrow.log_error("获取密钥对列表失败", f"获取实例 {instance_id} 密钥对列表时发生错误: {str(e)}")
return {'success': False, 'error': str(e), 'message': '获取密钥对列表失败'}
def delete_instance_key_pair(self, instance_id, key_pair_name, region_id='cn-shanghai'):
"""删除实例的密钥对"""
client = self._get_client(region_id)
try:
request = swas__open20200601_models.DeleteInstanceKeyPairRequest(
region_id=region_id,
instance_id=instance_id,
key_pair_name=key_pair_name
)
runtime = util_models.RuntimeOptions()
response = client.delete_instance_key_pair_with_options(request, runtime)
return {'success': True, 'data': self._convert_response_to_dict(response.body), 'message': '密钥对删除成功'}
except Exception as e:
jingrow.log_error("删除密钥对失败", f"删除实例 {instance_id} 密钥对 {key_pair_name} 时发生错误: {str(e)}")
return {'success': False, 'error': str(e), 'message': '密钥对删除失败'}
# 全局管理器实例
_aliyun_manager = None
@ -375,6 +422,26 @@ def get_aliyun_regions():
manager = _get_manager()
return manager.get_regions()
@jingrow.whitelist()
def create_aliyun_instance_key_pair(instance_id, key_pair_name, region_id='cn-shanghai'):
"""为实例创建密钥对"""
manager = _get_manager()
return manager.create_instance_key_pair(instance_id, key_pair_name, region_id)
@jingrow.whitelist()
def list_aliyun_instance_key_pairs(instance_id, region_id='cn-shanghai'):
"""获取实例的密钥对列表"""
manager = _get_manager()
return manager.list_instance_key_pairs(instance_id, region_id)
@jingrow.whitelist()
def delete_aliyun_instance_key_pair(instance_id, key_pair_name, region_id='cn-shanghai'):
"""删除实例的密钥对"""
manager = _get_manager()
return manager.delete_instance_key_pair(instance_id, key_pair_name, region_id)
# 服务器订单和创建相关
@jingrow.whitelist()
@ -487,6 +554,37 @@ def create_server_async(order_name):
server.instance_id = instance_id
server.save(ignore_permissions=True)
# 自动创建密钥对
try:
key_pair_name = f"{region_id}-{instance_id[:8]}"
key_pair_result = create_aliyun_instance_key_pair(instance_id, key_pair_name, region_id)
# 打印密钥对创建结果到后台日志
jingrow.log_error("密钥对创建结果", f"实例 {instance_id} 的密钥对创建结果: {key_pair_result}")
if key_pair_result and key_pair_result.get('success'):
jingrow.log_error("密钥对创建成功", f"实例 {instance_id} 自动创建密钥对 {key_pair_name} 成功")
# 获取并保存密钥对信息
key_pair_data = key_pair_result.get('data', {})
private_key = key_pair_data.get('private_key')
if private_key:
# 保存私钥到服务器记录中(阿里云不返回公钥,会自动配置到实例中)
server.key_pair_name = key_pair_name
server.private_key = private_key
# 公钥字段留空,因为阿里云会自动处理
server.public_key = ""
jingrow.log_error("私钥已保存", f"实例 {instance_id} 的私钥已保存到服务器记录中,公钥由阿里云自动配置")
else:
jingrow.log_error("私钥获取失败", f"实例 {instance_id} 创建密钥对成功但未获取到私钥")
server.save(ignore_permissions=True)
else:
jingrow.log_error("密钥对创建失败", f"实例 {instance_id} 自动创建密钥对失败: {key_pair_result.get('message', '未知错误')}")
except Exception as key_error:
jingrow.log_error("密钥对创建异常", f"实例 {instance_id} 自动创建密钥对时发生异常: {str(key_error)}")
# 更新订单状态
order.status = "交易成功"
order.save(ignore_permissions=True)

View File

@ -28,7 +28,7 @@
"ssh_user",
"ssh_port",
"column_break_20",
"root_public_key"
"private_key"
],
"fields": [
{
@ -87,11 +87,6 @@
"fieldname": "column_break_20",
"fieldtype": "Column Break"
},
{
"fieldname": "root_public_key",
"fieldtype": "Code",
"label": "Root公钥"
},
{
"fieldname": "column_break_aliyun",
"fieldtype": "Column Break"
@ -181,11 +176,16 @@
"hidden": 1,
"label": "购买时长(月)",
"read_only": 1
},
{
"fieldname": "private_key",
"fieldtype": "Text",
"label": "Private Key私钥"
}
],
"index_web_pages_for_search": 1,
"links": [],
"modified": "2025-07-27 23:51:17.953839",
"modified": "2025-07-28 00:57:19.288916",
"modified_by": "Administrator",
"module": "Jcloud",
"name": "Jsite Server",

View File

@ -24,8 +24,8 @@ class JsiteServer(Document):
order_id: DF.Data | None
period: DF.Int
planid: DF.Data | None
private_key: DF.Text | None
region: DF.Data | None
root_public_key: DF.Code | None
running_status: DF.Literal["", "\u8fd0\u884c\u4e2d", "\u5df2\u505c\u673a"]
ssh_port: DF.Int
ssh_user: DF.Data | None