新增创建防火墙规则的api端点及在jsite_server.js增加创建防火墙规则的按钮

This commit is contained in:
jingrow 2025-08-09 17:25:09 +08:00
parent dfab344be8
commit 0f1ae8d8b4
2 changed files with 110 additions and 1 deletions

View File

@ -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)}"}
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": "创建防火墙规则失败"}

View File

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