fix(agent,acme,cert,web): 修 frps 安装 404 与 nginx 探测两处,证书颁发机构用 LiteSSL 替换 Buypass(v1.2.14)
- frps 安装/升级一直 404:frp 官方校验文件名始终是 frp_sha256_checksums.txt(不带版本号),代码却拼 frp_<版本>_sha256sums.txt;现按候选名依次尝试并在失败时列出尝试项。同一条 bug 也存在于本机下载 frpc 的路径,一并修复(SHA-256 校验逻辑未改) - nginx 探测(agent):nginxPath() 不再回落到配置里的裸名字 nginx(否则「未安装」被误报为配置校验失败,且一键安装入口永不出现);vhost 目录探测不再要求被加载文件带 .conf 后缀(Debian 的 sites-enabled/default 不带,导致只剩主配置目录可试,报「均无法放置完整 server 配置」),失败信息补上具体原因 - 证书 CA:LiteSSL(亚数 TrustAsia,90 天,支持单域名/通配符/多域名)替换 Buypass。LiteSSL 目录 meta.externalAccountRequired=true,强制 EAB——在 FreeSSL 创建后填 Kid/HMAC 即可,HMAC 只回掩码;Buypass 保留常量与展示元数据但不再可选 - 前端申请证书弹窗的颁发机构卡片改为前端可控清单(原先后端 /api/certs/options 的结果不参与渲染,后端改了弹窗不变) - 测试:internal/frp 校验文件候选名与 sha256sum 解析;internal/acme LiteSSL 目录/别名/通配符/Buypass 停用提示。gofmt / go build / go vet / go test / vue-tsc / vite build 全绿 - AgentVersion 0.12.4 → 0.12.7,双架构二进制已重编:VPS 上需点「升级 Agent」
This commit is contained in:
+33
-8
@@ -168,21 +168,46 @@ func downloadOfficialBinary(ctx context.Context, frpDir string, release Release,
|
||||
return extractClientBinary(archivePath, frpDir, release)
|
||||
}
|
||||
|
||||
// checksumAssetNames 官方校验文件名候选(按优先级)。
|
||||
// frp 从早期版本起就一直是 frp_sha256_checksums.txt(不带版本号),
|
||||
// 下面保留一个旧名字兼底,避开上游再次改名时整条下载链路直接 404。
|
||||
func checksumAssetCandidates(version string) []string {
|
||||
return []string{
|
||||
"frp_sha256_checksums.txt",
|
||||
"frp_" + version + "_sha256sums.txt",
|
||||
}
|
||||
}
|
||||
|
||||
func fetchChecksum(ctx context.Context, release Release) (string, error) {
|
||||
version := strings.TrimPrefix(release.Version, "v")
|
||||
name := "frp_" + version + "_sha256sums.txt"
|
||||
url := officialAssetURL(release.Version, name)
|
||||
data, err := fetchBytes(ctx, url, 1<<20)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("下载 FRP 官方校验文件失败:%w", err)
|
||||
candidates := checksumAssetCandidates(version)
|
||||
var lastErr error
|
||||
for _, name := range candidates {
|
||||
data, err := fetchBytes(ctx, officialAssetURL(release.Version, name), 1<<20)
|
||||
if err != nil {
|
||||
lastErr = err
|
||||
continue
|
||||
}
|
||||
if sum, ok := findChecksumLine(data, release.AssetName); ok {
|
||||
return sum, nil
|
||||
}
|
||||
lastErr = fmt.Errorf("FRP 官方校验文件 %s 中未找到 %s", name, release.AssetName)
|
||||
}
|
||||
if lastErr == nil {
|
||||
lastErr = fmt.Errorf("没有可用的官方校验文件")
|
||||
}
|
||||
return "", fmt.Errorf("下载 FRP 官方校验文件失败:%v(已尝试:%s)", lastErr, strings.Join(candidates, "、"))
|
||||
}
|
||||
|
||||
// findChecksumLine 解析 sha256sum 格式(<hash> <文件名>,文件名可能带 * 前缀)。
|
||||
func findChecksumLine(data []byte, assetName string) (string, bool) {
|
||||
for _, line := range strings.Split(string(data), "\n") {
|
||||
fields := strings.Fields(line)
|
||||
if len(fields) >= 2 && strings.TrimPrefix(fields[1], "*") == release.AssetName {
|
||||
return fields[0], nil
|
||||
if len(fields) >= 2 && strings.TrimPrefix(fields[1], "*") == assetName {
|
||||
return fields[0], true
|
||||
}
|
||||
}
|
||||
return "", fmt.Errorf("FRP 官方校验文件中未找到 %s", release.AssetName)
|
||||
return "", false
|
||||
}
|
||||
|
||||
func downloadArchive(ctx context.Context, frpDir string, release Release, checksum, proxy string, report downloadReporter) (string, error) {
|
||||
|
||||
Reference in New Issue
Block a user