Skip to content

feat: 安装脚本与面板支持指定统计的网卡(--iface);重跑沿用 --interval - #27

Merged
stqfdyr merged 10 commits into
mainfrom
feat/iface
Sep 19, 2026
Merged

stqfdyr merged 10 commits into
mainfrom
feat/iface

Conversation

@stqfdyr

@stqfdyr stqfdyr commented Sep 18, 2026 •

Copy link
Copy Markdown
Collaborator

背景

配套 monitor-probe/agent#6。agent 新增 --iface / MONITOR_IFACE,用来指定哪些网卡计入流量,主要用于软路由、PVE 宿主机这类会转发流量的机器。本 PR 让安装脚本和面板都能设置它。

本 PR 叠在 #24 上(base 为 feat/uninstall-agent):面板直接复用 #24 的 scriptCommand 与 Command,同一个命令框不写两份。#24 合并后,把本分支 rebase 到 main 再合。

安装脚本

  • install.sh --iface LIST:写入 agent.env 的 MONITOR_IFACE。
  • 重跑时不带 --iface,就沿用 agent.env 里原来的值,并打印一行 keeping --iface ...;显式传 --iface '' 才清除。原因:批量注册命令由整个机队共用,带不了每台机器各自的网卡名,而升级方式就是重跑安装命令,不沿用的话一次升级就把设置冲掉,重复计数又悄悄回来。
  • 沿用的值原样写回(有多行时取最后一行,和 systemd、OpenRC 的取值一致),不再校验。值是 root 自己写的,两边都已经在读;如果再校验,手改时加了引号的 'eth1' 会让之后每次升级都退出。
  • 显式传入的值按 agent 的写法规则校验:逗号分隔的完整网卡名,每项可以带一个前导 -。否则 agent 启动即退出、无限重启,而脚本却报告安装成功。字符集只允许字母、数字和 ._,-(因此也不收 *),因为 OpenRC 会用 shell 载入 agent.env。
  • db::accumulate 注释补充:agent 会把所计网卡集合的摘要拼进 boot_id,集合一变就重新对基线。hub 逻辑不变。对基线的日志改为「reports a new boot_id」:重启和网卡集合变化都会触发,hub 不去拆 boot_id 分辨是哪一种,免得多一处要与 agent 同步的格式约定。日志里不写 boot_id 本身:那是 agent 给的文本,可以带换行伪造日志行。

--interval 同样沿用:不带 --interval 重跑时,从上次写下的 systemd unit(ExecStart)或 OpenRC 服务脚本(command_args)读回原值,打印 keeping --interval N from the previous install,首次安装才取 1。批量命令从不带这个参数,重跑升级原来会把调长的间隔悄悄改回 1 秒;节点多的人调长间隔多半是为了减轻 hub 的负担。面板生成的单台安装命令仍总带着框里的值,所见即所得。

面板

  • 安装弹窗和批量添加弹窗都新增「指定统计的网卡」卡片,打开后展开「只统计」「不统计」两栏,合成 --iface,下方的安装命令随输入实时更新。
    • 关闭:不带 --iface,install.sh 沿用机器原有的设置。
    • 打开且两栏都留空:生成 --iface '',恢复默认规则。
  • 在线节点会从 agent 上报的 metrics.iface 读出当前的 --iface,显示为「当前:只统计 eth1;不统计 eth0」,并据此预填。hub 不用改;公开页的指标是白名单输出,这个字段不外泄(已实测未登录的 /api/nodes)。
  • 单台弹窗关闭开关时,提示写明「沿用机器上原有的设置」。要恢复默认规则,需要打开开关、两栏留空。
  • 名字不合法时,提示具体是哪一个,标红它所在的输入框,并暂停生成命令,避免复制出一条会让 agent 启动失败的命令。
  • 安装弹窗改成「安装选项 / 安装命令」两段。上报间隔改成和开关一致的卡片样式,输入框收到右侧。
  • 上报间隔输入框改为只收数字的文本框:没有上下箭头,滚轮也不会改动它。默认 1,命令里总带着框里的值。
  • 修正了批量添加说明文字里的多余空格:JSX 的换行在中文句子中间会变成一个空格。
  • 上报间隔与网卡卡片改用 feat: 删除节点时附带 agent 卸载命令;install.sh 支持 --uninstall #24 的 OptionRow,它新增 below:开关打开后展开的两栏留在同一张卡片里。边框因此挪到外层,外层改为纵向 flex、行 flex-1,两列网格里被拉高的卡片(节点编辑的「公开显示」「离线通知」说明长短不一时)整行撑满,标题与开关垂直居中,点卡片任意处都能切换。

验证

install.sh:在 Alpine + OpenRC 容器里,用临时 hub 下发的脚本逐项实测。

操作 结果
--iface LIST 写入 agent.env 的 MONITOR_IFACE
重跑,不带 --iface 打印 keeping --iface … from the previous install,值保留
--iface '' 后再重跑 值被清除,之后也不再出现
--iface 'eth0;reboot'、--iface 'eth0 eth1' 退出码 2,拒绝写入
agent.env 里是 MONITOR_IFACE='eth1',或有两行 MONITOR_IFACE 原样沿用最后一行,不报错
--iface 不带值 退出码 2,--iface needs a value

另外用临时 systemd 单元确认过,EnvironmentFile 能原样传递以 - 开头的值。

面板:本地用 HTTPS 代理加 vite 开发服务器,以 https://hub.example.com:8443 访问临时 hub,用浏览器实际操作并截图检查。

  • 三种节点状态(agent 为 agent#6 的最新提交,走 metrics.iface):
    • 在线且带 --iface:开关自动打开并预填,命令里带上这个值
    • 在线且用默认规则:显示「当前:默认规则」
    • 离线:不显示「当前」
  • 开关打开、两栏留空时生成 --iface '';有非法名字时标红并暂停出命令。
  • 批量添加的命令随「指定统计的网卡」实时变化。
  • 390 px 宽度下两栏改为上下排列,页面和命令框都没有横向溢出;深色模式正常。

检查:sh -n 通过;shellcheck 只有两条原本就有的 SC2015 提示;cargo test 108 个全部通过;面板 tsc -b、oxlint、npm test 全部通过(新增 ifaceSpec / badIfaceName / ifaceChoice / currentIface 的断言)。

rebase 到 #24 的新提交之后:cargo test 108 个、面板 tsc -b、oxlint、npm test、npm run build 通过。浏览器复测安装与批量添加两个弹窗(浅色、深色、390 px):agent 带 --iface 在线时开关自动打开并预填,点标题文字即可切换开关,关掉后命令里不带 --iface;页面与命令框都没有横向溢出。

--interval 沿用:Ubuntu 24.04 + systemd 与 Alpine + OpenRC 两个容器,各跑同一组步骤:

步骤 结果
--interval 5 写入 --interval 5
不带参数重跑 打印 keeping --interval 5 …,仍是 5
--interval 2 改为 2
--interval 7 --insecure 后不带间隔重跑 沿用 7,--insecure 保留
--interval 0 退出码 2
--uninstall 后不带参数安装 取 1,不打印 keeping

浏览器:间隔框默认 1,命令带 --interval 1;输入 5a0 得到 50;删空时命令按 1 生成;输入框没有占位字、没有上下箭头;1280 px 与 390 px 下布局正常。

校验规则三方对照

  • 18 种写法,agent 与 install.sh(dash、busybox)逐一对照,面板的正则由单元测试覆盖。-、eth0,-、--eth0、eth0 eth1 三方都拒绝;eth1、eth1,pppoe-wan、-ens19、eth1,-eth0、vmbr0、enp1s0.100、wg_0、eth0,,eth1 三方都接受;eth*、*、-*、e*h0、eth0;reboot、eth0' 只有 install.sh 与面板拒绝:两者只收字母、数字和 ._-,agent 只检查写法
  • 浏览器:两栏留空生成 --iface '';只统计 eth1、不统计 ens19 生成 --iface eth1,-ens19,名字不加引号;填 eth* 标红并暂停出命令

兼容

@stqfdyr
stqfdyr changed the base branch from main to feat/uninstall-agent September 18, 2026 23:19
@stqfdyr stqfdyr changed the title feat(install): 支持 --iface,重跑安装时沿用已设置的网卡 feat: 安装脚本与面板支持指定统计的网卡(--iface) Sep 18, 2026
@stqfdyr stqfdyr changed the title feat: 安装脚本与面板支持指定统计的网卡(--iface) feat: 安装脚本与面板支持指定统计的网卡(--iface);重跑沿用 --interval Sep 19, 2026
Base automatically changed from feat/uninstall-agent to main September 19, 2026 13:47
- --iface 写入 agent.env 的 MONITOR_IFACE;重跑不带 --iface 时沿用,--iface '' 清除。
  批量注册命令由整个机队共用,带不了每台机器的网卡名
- 值只允许网卡名、逗号、开头的 - 与末尾的 *:OpenRC 以 shell 方式载入 agent.env
- accumulate 注释补充:agent 设了 --iface 时会拼进 boot_id,改设置即重新对基线
- 安装与批量添加弹窗新增「指定统计的网卡」:只统计 / 不统计两栏,合成 --iface;
  关闭时不带 --iface,install.sh 沿用机器原有设置;打开且两栏留空即恢复默认规则
- 在线节点从 boot_id 读出当前 --iface,显示为「当前:…」并预填
- 名字不合法时指出是哪一个、标红所在输入框,命令暂不生成
- 安装弹窗改为「安装选项 / 安装命令」两段,上报间隔改成与开关一致的卡片样式
- 修正批量添加说明中 JSX 换行在中文里留下的空格
- install.sh:显式传入的 --iface 按 agent 同一套规则拒绝(单独的 *、-*、-- 开头、* 不在末尾),
  避免装完 agent 起不来而脚本报成功;沿用 agent.env 的值原样写回(取最后一行),手改带引号
  不再挡住之后的升级;写入改用 printf
- 面板:当前设置改读 agent 上报的 metrics.iface;单台弹窗关闭开关时提示「沿用原有设置」;
  示例改为 WAN / LAN 口
- accumulate 注释:boot_id 后接的是所计网卡集合的摘要
- OptionRow 加 below,开关打开后展开的内容留在同一张卡片里;网卡卡片与上报间隔不再手抄行结构。
- agent 在 boot_id 后接所计网卡集合的摘要以后,「reports a new boot」不再只意味着重启。
  日志改为打印新旧两个值:只有 `/` 之后变了,就是网卡集合变了。
- install.sh 删掉一句过期注释:root 检查已经挪到了它前面。
- 上一版把新旧 boot_id 原样写进 hub 日志。那是 agent 给的文本,可以带换行伪造日志行,长度只受
  帧上限约束。改为 hub 比较 `/` 之前的部分,只记「重启」或「网卡集合变了」两种固定文案。
- OptionRow 的边框移到外层之后,两列网格里较矮的卡片被拉高时,里面的 label 不跟着撑开:标题与
  开关贴顶,下半截点不动。外层改为纵向 flex,行 flex-1。
- install.sh 不带 --interval 时,从上次写下的 systemd unit 或 OpenRC 服务脚本里读回原值,首次安装才取 1。
  批量命令从不带这个参数,面板的安装命令原来总带着 --interval 1,重跑升级就把机器上调长的间隔
  改回 1 秒;上百台节点调长间隔多半是为了减轻 hub 的负担,这样一改负担悄悄回到原样。
  与 --iface 的沿用规则一致。
- 面板安装弹窗的间隔默认留空,留空不带 --interval;填了才写进命令。
与 agent 同步:只保留列出与 `-` 排除两种写法。install.sh 与面板的校验随之简化,写了 `*` 同样拒绝;
面板生成的命令不再需要给名字加引号,只有清除设置时的 `--iface ''` 还带着。
面板的间隔框留空表示沿用,靠一行说明才看得懂。改回所见即所得:默认 1,命令里总带着框里的值。
沿用只留在 install.sh:不带 --interval 的命令(批量命令、手写命令)重跑时不再把间隔改回 1。
输入框改为只收数字的文本框,没有上下箭头,滚轮也不会改动它。
区分「重启」与「网卡集合变了」要按 `/` 拆开 boot_id,hub 因此得知道 agent 的格式,两边多一处要同步的
约定,换来的只是日志好读一点。改为只记 boot_id 变了,值本身仍不进日志。
@stqfdyr
stqfdyr merged commit 3decb03 into main Sep 19, 2026
1 check passed
@stqfdyr
stqfdyr deleted the feat/iface branch September 19, 2026 13:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant