Skip to content

fix: 通知巡检状态与安装脚本 PATH 的几处遗漏 - #12

Merged
stqfdyr merged 2 commits into
mainfrom
fix/notify-state
Sep 16, 2026
Merged

stqfdyr merged 2 commits into
mainfrom
fix/notify-state

Conversation

@stqfdyr

@stqfdyr stqfdyr commented Sep 16, 2026

Copy link
Copy Markdown
Collaborator

问题

review #10、#8 时发现四处,均有测试或实测复现。

  1. 没配渠道时,流量档位和到期汇总照样记成已发。 离线通知专门做了「没有渠道不标记 down_since」,这两条没跟上:节点先跨过 80%、之后才配渠道,这条提醒永远不发;当天 9 点后才配渠道,汇总要等到次日。
  2. 新节点继承已删节点的巡检状态。 Watch 按节点 id 存,而 id 是 rowid,删掉最新的节点再建一台会拿到同一个 id。实测新节点在同一周期内用量到 90% 不报(继承了旧节点的档位)。
  3. 新装的节点头一个小时按抖动处理。 从没上报过的节点也被记缺席,安装耗时超过宽限期时,它第一次连上就算「从一次超过宽限期的掉线回来」,接下来一小时内的掉线要满 30 分钟才报。
  4. Debian 上经 su(不带 -)切 root 安装失败。 fix: agent 改用固定系统用户,修复部分 LXC 容器启动失败 #8 引入的 useradd 在 /usr/sbin,而 Debian 的 login.defs 不设 ALWAYS_SET_PATH,su 保留调用者的 PATH,里面没有 sbin。失败发生在下载与注册之前,不破坏已有节点。

修改

src/notify.rs

  • 流量读取条件加上 armed,expiry_digest 在没有渠道时提前返回、不写日期。先跨过阈值再配渠道的,配好后下一轮巡检补报一条
  • 每轮巡检先按现存节点 id 裁剪 absent / returned / traffic。一轮(30 秒)之内删了又建仍会继承,代码里用 ponytail: 标明
  • last_seen = 0 的节点不记缺席,离线判定里原有的 last_seen > 0 随之去掉
  • signed_in 去掉多余的 to_canonical(),client_ip 已经规范化过

install.sh:set -eu 之后把 /usr/sbin:/sbin 追加到 PATH。

测试

cargo fmt --check、cargo clippy --all-targets(无警告)、cargo test(98 个)通过。

  • 新增 a_new_node_starts_with_no_absence_return_or_traffic_step,流量与到期汇总两个测试补上「无渠道 → 配渠道」一段
  • 变异检查:分别去掉裁剪、去掉 last_seen = 0 判断、去掉 armed 条件,对应测试各自失败
  • install.sh:sh -n 通过;PATH=/usr/local/bin:/usr/bin:/bin 下 command -v useradd 找不到,追加后解析到 /usr/sbin/useradd

兼容

无 schema、接口、agent 协议变化。行为变化只有一处:没配渠道期间跨过的流量阈值,在配好渠道后会补报一次。

离线通知在没有渠道时不标记 down_since,流量档位和到期汇总日期此前没有照做:
先跨过阈值、后配渠道,这条提醒永远不发;当天 9 点后才配渠道,汇总要等到次日。
两处都改为没有渠道时不记。

巡检的内存状态按节点 id 存,而 id 是 rowid,删掉最新的节点再新建会拿到同一个
id,新节点继承旧节点的流量档位(同周期内跨线不报)和抖动状态。每轮巡检先按
现存 id 裁剪。从未上报过的节点不再记缺席,否则新装的节点第一次连上就被算作
从一次超过宽限期的掉线回来,头一个小时的掉线要满 30 分钟才报。

signed_in 去掉多余的 to_canonical,client_ip 已经规范化过。
useradd 在 /usr/sbin。Debian 的 su 不带 - 时保留调用者的 PATH(login.defs 未设
ALWAYS_SET_PATH),其中没有 sbin,安装在建用户这一步失败。脚本开头把
/usr/sbin 与 /sbin 追加到 PATH。
@stqfdyr
stqfdyr merged commit 78dbf63 into main Sep 16, 2026
1 check passed
@stqfdyr
stqfdyr deleted the fix/notify-state branch September 16, 2026 14:41
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