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' + }); + } + } + }); +}