diff --git a/dashboard/src2/components/JsiteServerFirewallRules.vue b/dashboard/src2/components/JsiteServerFirewallRules.vue index 1dde3c4..acd19d0 100644 --- a/dashboard/src2/components/JsiteServerFirewallRules.vue +++ b/dashboard/src2/components/JsiteServerFirewallRules.vue @@ -339,6 +339,14 @@ export default { changePage(page) { if (page >= 1 && page <= this.pagination.pagecount) { this.pagination.pageno = page; + // 更新资源参数并立即重新加载 + this.$resources.firewallRules.update({ + params: { + instance_id: this.$jsiteServer.pg?.instance_id, + limit: this.pagination.limit, + pageno: this.pagination.pageno + } + }); this.$resources.firewallRules.reload(); } }, diff --git a/jcloud/api/aliyun_server_light.py b/jcloud/api/aliyun_server_light.py index da5352b..457d620 100644 --- a/jcloud/api/aliyun_server_light.py +++ b/jcloud/api/aliyun_server_light.py @@ -453,17 +453,68 @@ class AliyunLightServerManager: jingrow.log_error("创建防火墙规则失败", f"为实例 {instance_id} 创建防火墙规则时发生错误: {str(e)}") return {'success': False, 'error': str(e), 'message': '创建防火墙规则失败'} - def list_firewall_rules(self, instance_id, region_id='cn-shanghai'): - """获取实例的防火墙规则列表""" + def list_firewall_rules(self, instance_id, region_id='cn-shanghai', page_size=10, page_number=1): + """获取实例的防火墙规则列表 + Args: + instance_id: 实例ID + region_id: 地域ID + page_size: 每页记录数,默认10,如果设置为-1则获取全部数据 + page_number: 页码,默认1 + """ client = self._get_client(region_id) try: - request = swas__open20200601_models.ListFirewallRulesRequest( - region_id=region_id, - instance_id=instance_id - ) - runtime = util_models.RuntimeOptions() - response = client.list_firewall_rules_with_options(request, runtime) - return {'success': True, 'data': self._convert_response_to_dict(response.body), 'message': '获取防火墙规则列表成功'} + if page_size == -1: + # 获取全部数据 + all_rules = [] + current_page = 1 + request_page_size = 50 # 每次请求50条记录,减少API调用次数 + + while True: + request = swas__open20200601_models.ListFirewallRulesRequest( + region_id=region_id, + instance_id=instance_id, + page_size=request_page_size, + page_number=current_page + ) + runtime = util_models.RuntimeOptions() + response = client.list_firewall_rules_with_options(request, runtime) + + response_data = self._convert_response_to_dict(response.body) + current_rules = response_data.get('firewall_rules', []) + + if not current_rules: + break + + all_rules.extend(current_rules) + + # 如果当前页记录数少于request_page_size,说明已经是最后一页 + if len(current_rules) < request_page_size: + break + + current_page += 1 + + # 构造返回结果 + result_data = response_data.copy() + result_data['firewall_rules'] = all_rules + result_data['total_count'] = len(all_rules) + + return {'success': True, 'data': result_data, 'message': f'获取防火墙规则列表成功,共{len(all_rules)}条记录'} + else: + # 分页获取数据 + request = swas__open20200601_models.ListFirewallRulesRequest( + region_id=region_id, + instance_id=instance_id, + page_size=page_size, + page_number=page_number + ) + runtime = util_models.RuntimeOptions() + response = client.list_firewall_rules_with_options(request, runtime) + + response_data = self._convert_response_to_dict(response.body) + rules_count = len(response_data.get('firewall_rules', [])) + + return {'success': True, 'data': response_data, 'message': f'获取防火墙规则列表成功,第{page_number}页,共{rules_count}条记录'} + except Exception as e: jingrow.log_error("获取防火墙规则列表失败", f"获取实例 {instance_id} 防火墙规则列表时发生错误: {str(e)}") return {'success': False, 'error': str(e), 'message': '获取防火墙规则列表失败'} @@ -1698,12 +1749,18 @@ def create_aliyun_firewall_rule(instance_id, rule_protocol, port, remark=None, r return {"success": False, "error": str(e), "message": "创建防火墙规则失败"} @jingrow.whitelist() -def get_aliyun_firewall_rules(instance_id, region_id='cn-shanghai'): - """获取阿里云轻量应用服务器防火墙规则列表""" +def get_aliyun_firewall_rules(instance_id, region_id='cn-shanghai', page_size=10, page_number=1): + """获取阿里云轻量应用服务器防火墙规则列表 + Args: + instance_id: 实例ID + region_id: 地域ID,默认cn-shanghai + page_size: 每页记录数,默认10,如果设置为-1则获取全部数据 + page_number: 页码,默认1 + """ try: # 调用管理器获取防火墙规则列表 manager = _get_manager() - result = manager.list_firewall_rules(instance_id, region_id) + result = manager.list_firewall_rules(instance_id, region_id, page_size, page_number) return result @@ -1742,8 +1799,8 @@ def sync_firewall_rules(instance_id): if not region_id: return {"success": False, "message": "服务器记录缺少region信息"} - # 获取阿里云防火墙规则 - firewall_result = get_aliyun_firewall_rules(instance_id, region_id) + # 获取阿里云防火墙规则(获取全部数据) + firewall_result = get_aliyun_firewall_rules(instance_id, region_id, page_size=-1) if not firewall_result or not firewall_result.get('success'): error_msg = f"获取阿里云防火墙规则失败: {firewall_result.get('message', '未知错误')}" jingrow.log_error("同步防火墙规则失败", error_msg)