From 0f1ae8d8b4bd8481da9d8b0441c80ffc22aaf669 Mon Sep 17 00:00:00 2001 From: jingrow Date: Sat, 9 Aug 2025 17:25:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=9B=E5=BB=BA=E9=98=B2?= =?UTF-8?q?=E7=81=AB=E5=A2=99=E8=A7=84=E5=88=99=E7=9A=84api=E7=AB=AF?= =?UTF-8?q?=E7=82=B9=E5=8F=8A=E5=9C=A8jsite=5Fserver.js=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E9=98=B2=E7=81=AB=E5=A2=99=E8=A7=84=E5=88=99?= =?UTF-8?q?=E7=9A=84=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jcloud/api/aliyun_server_light.py | 34 +++++++- .../pagetype/jsite_server/jsite_server.js | 77 +++++++++++++++++++ 2 files changed, 110 insertions(+), 1 deletion(-) diff --git a/jcloud/api/aliyun_server_light.py b/jcloud/api/aliyun_server_light.py index eabc46a..d620a29 100644 --- a/jcloud/api/aliyun_server_light.py +++ b/jcloud/api/aliyun_server_light.py @@ -435,6 +435,24 @@ class AliyunLightServerManager: jingrow.log_error("执行命令失败", f"在实例 {instance_id} 上执行命令时发生错误: {str(e)}") return {'success': False, 'error': str(e), 'message': '命令执行失败'} + def create_firewall_rule(self, instance_id, rule_protocol, port, remark=None, region_id='cn-shanghai'): + """为实例创建防火墙规则""" + client = self._get_client(region_id) + try: + request = swas__open20200601_models.CreateFirewallRuleRequest( + region_id=region_id, + instance_id=instance_id, + rule_protocol=rule_protocol, + port=port, + remark=remark + ) + runtime = util_models.RuntimeOptions() + response = client.create_firewall_rule_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': '创建防火墙规则失败'} + # 全局管理器实例 _aliyun_manager = None @@ -1627,4 +1645,18 @@ def get_jsite_server(instance_id=None, name=None): except Exception as e: jingrow.log_error("获取Jsite Server记录失败", f"获取服务器记录时发生错误: {str(e)}") - return {"success": False, "message": f"获取服务器记录失败: {str(e)}"} \ No newline at end of file + return {"success": False, "message": f"获取服务器记录失败: {str(e)}"} + +@jingrow.whitelist() +def create_aliyun_firewall_rule(instance_id, rule_protocol, port, remark=None, region_id='cn-shanghai'): + """创建阿里云轻量应用服务器防火墙规则""" + try: + # 调用管理器创建防火墙规则 + manager = _get_manager() + result = manager.create_firewall_rule(instance_id, rule_protocol, port, remark, region_id) + + return result + + except Exception as e: + jingrow.log_error("创建防火墙规则失败", f"为实例 {instance_id} 创建防火墙规则时发生错误: {str(e)}") + return {"success": False, "error": str(e), "message": "创建防火墙规则失败"} \ No newline at end of file diff --git a/jcloud/jcloud/pagetype/jsite_server/jsite_server.js b/jcloud/jcloud/pagetype/jsite_server/jsite_server.js index 15c43fd..fbfdf2d 100644 --- a/jcloud/jcloud/pagetype/jsite_server/jsite_server.js +++ b/jcloud/jcloud/pagetype/jsite_server/jsite_server.js @@ -58,6 +58,55 @@ jingrow.ui.form.on("Jsite Server", { } ); }); + + frm.add_custom_button(__('创建防火墙规则'), function() { + // 弹出防火墙规则创建对话框 + let dialog = new jingrow.ui.Dialog({ + title: __('创建防火墙规则'), + fields: [ + { + fieldtype: 'Select', + label: __('协议'), + fieldname: 'rule_protocol', + options: [ + {label: 'TCP', value: 'TCP'}, + {label: 'UDP', value: 'UDP'}, + {label: 'ICMP', value: 'ICMP'} + ], + reqd: 1, + default: 'TCP' + }, + { + fieldtype: 'Data', + label: __('端口'), + fieldname: 'port', + reqd: 1, + description: __('单个端口号或端口范围(例如:80 或 8000/9000)') + }, + { + fieldtype: 'Data', + label: __('备注'), + fieldname: 'remark', + description: __('防火墙规则的说明(可选)') + } + ], + primary_action_label: __('创建'), + primary_action: function() { + let values = dialog.get_values(); + if (values.rule_protocol && values.port) { + create_firewall_rule(frm, values.rule_protocol, values.port, values.remark); + dialog.hide(); + } else { + jingrow.msgprint({ + title: __('错误'), + message: __('请填写协议和端口信息'), + indicator: 'red' + }); + } + } + }); + dialog.show(); + }); } // 为password字段添加眼睛图标 @@ -141,3 +190,31 @@ function reset_system(frm) { } }); } + +function create_firewall_rule(frm, rule_protocol, port, remark) { + jingrow.call({ + method: 'jcloud.api.aliyun_server_light.create_aliyun_firewall_rule', + args: { + instance_id: frm.pg.instance_id, + rule_protocol: rule_protocol, + port: port, + remark: remark, + region_id: frm.pg.region + }, + callback: function(r) { + if (r.message && r.message.success) { + jingrow.msgprint({ + title: __('成功'), + message: __('防火墙规则创建成功'), + indicator: 'green' + }); + } else { + jingrow.msgprint({ + title: __('错误'), + message: r.message ? r.message.message : __('创建防火墙规则失败'), + indicator: 'red' + }); + } + } + }); +}