本文档描述如何在不改动现有低级接口(login_post, acl_post.get_acl_rules, add_acl_post.add_acl_rule, edit_acl_post.edit_acl_rule, del_acl_post.del_acl_rule)的前提下,设计并实现一组高级接口,用于集中管理以备注前缀(例如 Test_)分组的 ACL 目的地址集合。
Test_(可在 config.json 中配置)为前缀的规则(例如 Test_1, Test_2 等)。dst_addr 字段的所有 IP(逗号分隔),合并为一个全局去重的文本数组(字符串列表)。Test_1)超过容量限制(例如 1000),则创建或选用下一个编号的 Test_n 规则;必要时使用添加或编辑低级接口来写回。重复 IP 不执行任何操作。config.json 中新增或使用字段:
test_prefix(string, 默认 "Test_") — 用来匹配规则备注前缀。rule_ip_limit(int, 默认 1000) — 单条 ACL 规则允许的最大 IP 数量。示例:
{
"base_url": "http://103.236.55.143:8080/",
"test_prefix": "Test_",
"rule_ip_limit": 1000
}
acl_post.get_acl_rules() 获取全部规则(Data.data 列表)。test_prefix。comment 字段以 test_prefix 开头的规则(例如 Test_1, Test_2)。dst_addr 字段;如果 dst_addr 为空则跳过。否则:
注意点:
dst_addr 可能包含 IP 段(例如 1.2.3.4-1.2.3.10)或单个IP,当前实现策略是直接作为字符串项存储,不做IP范围展开。输入:单个字符串 ip(例如 8.8.8.8 或 1.2.3.4)。
输出:操作结果字典,含是否添加成功、目标规则名/ID 等。
步骤:
ip 已存在,直接返回 {"added": False, "message": "already exists"}。ip 放入某个 Test_n 规则中:
acl_post.get_acl_rules() 获取所有匹配 test_prefix 的规则,并按 comment 中的编号从小到大排序(例如 Test_1, Test_2)。同时记录每个规则的 dst_addr 列表与 id(rule id)。current_count + 1 <= rule_ip_limit,则向该规则进行编辑(使用 edit_acl_post.edit_acl_rule(rule_id=..., dst_addr=new_dst_str, comment=...)),将新的 IP 附加到 dst_addr(注意去重),并返回该规则的信息(rule id/comment)。Test_* 规则,则创建 Test_1(使用 add_acl_post.add_acl_rule(dst_addr=ip, comment=f"{test_prefix}1"));Test_{k+1}(k 为当前最大的编号),使用 add_acl_post.add_acl_rule(dst_addr=ip, comment=f"{test_prefix}{k+1}")。创建成功后返回新创建的 RowId。错误与回滚考虑:
并发处理:
输入:单个字符串 ip。
步骤:
acl_post.get_acl_rules() 获取所有匹配 test_prefix 的规则,并解析每条规则的 dst_addr 到列表形式。
ip 的所有规则(即支持在多个规则中删除)。对于每个匹配的规则:dst_addr 列表中移除该 ip。edit_acl_post.edit_acl_rule(rule_id=..., dst_addr=new_dst_str, comment=...) 更新该规则;del_acl_post.del_acl_rule(rule_id=...)),不保留空规则,以保持规则集合整洁并避免无用占位。rule_id、comment、action:edited 或 deleted),以及整体操作状态。边缘情况:
add_ip 对已存在的 IP 操作应当是幂等的(不重复添加)。del_ip 对不存在的 IP 操作也应当返回成功/无操作结果。sess_key 管理,不需要额外的认证步骤;但调用者应确保先执行登录流程并设置好全局 sess_key。log_util.log_request 记录每次低级请求及响应。