Skip to content

[Bug]: 负载均衡页面前端 JS 选择器失效,导致已配置的末行端口被强制覆写为上一行端口 #4507

Closed

Description

@ugvfpdcuwfnh

描述您遇到的bug

在「负载均衡」设置中,如果末行配置了一个新的独立端口(例如前面节点均为 1183,末行新增节点配置为 1185),保存生效后,底层 UCI 与 HAProxy 运行配置均正确(1185)。
但是,每次进入或刷新 LuCI 的「负载均衡」页面时,末行的端口输入框都会在页面加载后 300ms 内被前端脚本强行改写为上一行的端口号(1183)。若用户此时点击“保存并应用”,会导致 UCI 中的末行端口配置被错误篡改覆盖。

复现此Bug的步骤

  1. 进入 Passwall -> 「负载均衡」页面;
  2. 假设已有若干节点监听在端口 A(如 1183);
  3. 点击“添加”按钮新增一个节点,将其“Haproxy 端口”手动修改为不同端口 B(如 1185),点击“保存并应用”;
  4. 此时查看 /etc/config/passwall 或 HAProxy 监控面板(1188),端口确实是 1185;
  5. 在浏览器中刷新「负载均衡」页面;
  6. 观察末行的“Haproxy 端口”输入框:页面加载 300ms 后,自动由 1185 被强行改写为上一行的 1183。

您想要实现的目的

刷新「负载均衡」页面时,已保存节点的 Haproxy 端口保持其真实的配置值,不被前端脚本错误覆写。

日志信息

相关逻辑位于前端视图模板 luasrc/view/passwall/haproxy/js.htm(PassWall 2 对应 luasrc/view/passwall2/haproxy/js.htm),无后端报错日志。
问题代码:

const lbssHiddenInput = lastRow.querySelector("div.cbi-dropdown > div > input[type='hidden'][name$='.lbss']");
if (!lbssHiddenInput) {
    if (lastVal !== secondLastVal && secondLastVal !== "" && secondLastVal !== "0") {
        lastInput.value = secondLastVal;
    }
}

截图

No response

系统相关信息

• 插件版本:PassWall / PassWall 2 最新 master 源码及官方编译包
• OpenWrt 架构/固件版本:OpenWrt 24.10.x (x86_64)
• 浏览器版本:Chrome / Edge / Safari 等主流现代浏览器

其他信息

根因分析:
脚本初衷是在点击“添加”新建空行时继承上一行的端口号。但由于节点下拉组件已重构为 .v-dropdown-container,旧选择器 div.cbi-dropdown > div > input[type='hidden'][name$='.lbss'] 永远返回 null。导致脚本误判最后一行永远是“未配置节点的空行”,在页面加载后强行用倒数第二行的端口覆盖末行。
修复建议 (Suggested Fix):
建议修改 js.htm:

const lbssInput = lastRow.querySelector("input[name$='.lbss']");
const hasNodeSelected = lbssInput && lbssInput.value && lbssInput.value.trim() !== "";
if (!hasNodeSelected) {
    if (lastVal !== secondLastVal && secondLastVal !== "" && secondLastVal !== "0") {
        lastInput.value = secondLastVal;
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions