main #2
@ -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)
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user