From f738913dca8f8d9e93d2a5594885cedb6f864300 Mon Sep 17 00:00:00 2001 From: jingrow Date: Mon, 28 Jul 2025 00:57:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=9B=E5=BB=BA=E5=AF=86?= =?UTF-8?q?=E9=92=A5=E5=AF=B9api=E7=AB=AF=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jcloud/api/aliyun_server_light.py | 98 +++++++++++++++++++ .../pagetype/jsite_server/jsite_server.json | 14 +-- .../pagetype/jsite_server/jsite_server.py | 2 +- 3 files changed, 106 insertions(+), 8 deletions(-) diff --git a/jcloud/api/aliyun_server_light.py b/jcloud/api/aliyun_server_light.py index 2aac8f0..efa9cae 100644 --- a/jcloud/api/aliyun_server_light.py +++ b/jcloud/api/aliyun_server_light.py @@ -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) diff --git a/jcloud/jcloud/pagetype/jsite_server/jsite_server.json b/jcloud/jcloud/pagetype/jsite_server/jsite_server.json index 280913f..5703db0 100644 --- a/jcloud/jcloud/pagetype/jsite_server/jsite_server.json +++ b/jcloud/jcloud/pagetype/jsite_server/jsite_server.json @@ -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", diff --git a/jcloud/jcloud/pagetype/jsite_server/jsite_server.py b/jcloud/jcloud/pagetype/jsite_server/jsite_server.py index b505a1a..c559280 100644 --- a/jcloud/jcloud/pagetype/jsite_server/jsite_server.py +++ b/jcloud/jcloud/pagetype/jsite_server/jsite_server.py @@ -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