- 自动备份:每日一份(按最新备份是否在 24h 内判定,重启不重复)、保留份数可配、列表/下载/恢复/删除,恢复前先校验归档;顺手修 writeArchive 逐个检查 tar/gzip/文件 Close()(审查报告 §二) - 健康持续化:只存状态变更(up/down/unknown)并推导可用率与不可用区间;公开状态页默认关闭、访问码存 SHA-256、按 IP 限流、只暴露域名与可用率 - 隧道判定修复:RouteHealthCandidate 新增 tunnel_known,frps 管理接口不可用时不再把「判不出来」当成「不通」(此前会误报「隧道连续不通」);汇总与徽标同样区分「无法判定」 - 指标历史:metrics_samples 纵向点表(本机 CPU/内存/磁盘 + 每规则上下行,30 天保留、查询按桶平均、不做降采样表);仪表盘趋势卡支持 1h/24h/7d - 仪表盘布局:运行状态并入顶部统计区(运行时长补进「服务」卡);性能并入系统资源那一行,整行 4 列 - 测试:backup/metrics/frp/api/app 新增用例;gofmt、go build/vet/test、vue-tsc、vite build 全绿 - agent 无改动,AgentVersion 保持 0.12.2
36 lines
1.4 KiB
Go
36 lines
1.4 KiB
Go
package frp
|
|
|
|
import "testing"
|
|
|
|
func TestSummarizeRouteHealth(t *testing.T) {
|
|
items := []RouteHealthCandidate{
|
|
{DNSOK: true, CertOK: true, TunnelOK: true, TunnelKnown: true, ServiceOK: true},
|
|
{DNSOK: true, CertOK: false, TunnelOK: true, TunnelKnown: true, ServiceOK: false},
|
|
{DNSOK: false, CertOK: true, TunnelOK: false, TunnelKnown: true, ServiceOK: true},
|
|
// frps 管理接口不可用:隧道状态判不出来,既不算通也不是不通
|
|
{DNSOK: true, CertOK: true, ServiceOK: true},
|
|
}
|
|
summary := summarizeRouteHealth(2, []string{"vps-b"}, items)
|
|
|
|
if summary.Servers != 2 || summary.Routes != 4 || summary.Healthy != 1 {
|
|
t.Fatalf("unexpected summary counts: %+v", summary)
|
|
}
|
|
if summary.DNSFailed != 1 || summary.CertMissing != 1 || summary.TunnelDown != 1 ||
|
|
summary.TunnelUnknown != 1 || summary.ServiceDown != 1 {
|
|
t.Fatalf("unexpected segment counts: %+v", summary)
|
|
}
|
|
if len(summary.FailedServers) != 1 || summary.FailedServers[0] != "vps-b" {
|
|
t.Fatalf("unexpected failed servers: %+v", summary.FailedServers)
|
|
}
|
|
}
|
|
|
|
func TestSummarizeRouteHealthEmpty(t *testing.T) {
|
|
summary := summarizeRouteHealth(0, nil, nil)
|
|
if summary.Servers != 0 || summary.Routes != 0 || summary.Healthy != 0 {
|
|
t.Fatalf("expected empty summary, got %+v", summary)
|
|
}
|
|
if len(summary.FailedServers) != 0 {
|
|
t.Fatalf("expected no failed servers, got %+v", summary.FailedServers)
|
|
}
|
|
}
|