dxcqcv [1] filed a deletion request for v2raya [2]:

[AUR/PKGBUILD] v2raya_core 的版本号被注入单引号,误报 "core version
mismatch"(2.5.10-1 仍存在)

### 版本、安装方式、系统

1. v2rayA 2.5.7-1(已确认 AUR 最新 2.5.10-1 同样受影响)
2. AUR,`yay -S v2raya`,core 由包内 PKGBUILD 自行编译(非官方 installer 包)
3. Arch Linux x86_64,kernel 7.2.9-arch1-1

### 描述问题

Web UI 会一直显示一块无法关闭的红色横幅:

> 核心版本不匹配:v2raya_core 的版本必须与 v2rayA 版本完全一致。
> core version mismatch: the core reports version "'2.5.7'" but v2rayA
is "2.5.7"; v2rayA needs the v2raya_core binary of the same version,
not xray-core or v2ray-core

但**两个二进制本来就是同一份 v2.5.7 源码树编出来的**,core 也确实是 `v2raya_core` 而非 xray-
core/v2ray-core,属误报。原因不是"核心版本不一致",而是 **AUR PKGBUILD 把版本号连同一对单引号一起编进了
core 二进制**。

#### 根因

AUR PKGBUILD(`commit 916ca30` v2.5.7,当前 2.5.10-1 仍在)中两行写法不一致:

```bash
# 第 24 行 service:单引号在 shell 层,会被 shell 剥掉 → 正确,conf.Version = "2.5.7"
go build -trimpath -ldflags '-X
github.com/v2rayA/v2rayA/conf.Version='$pkgver' -s -w' -o v2raya
# 第 26 行 core:单引号在双引号内部,shell 不处理,原样交给链接器 → Version = "'2.5.7'"
go build -trimpath -ldflags "-X main.Version='$pkgver' -s -w" -o
v2raya_core ./main
```

对照官方 `build.sh:20` 的写法是正确的:`-ldflags="-X main.Version=$version -s
-w"`。

后面这条链路把引号变成了误报:

1. core 把版本号原样打印 —— `core/main/version.go:31`:
   `V2RAYA_CORE %s (based on xray-core %s)` → 实际输出 `V2RAYA_CORE
'2.5.7' (based on xray-core 26.7.28)`
2. v2rayA 解析时不剥引号 —— `service/kernel/v2ray/where/where.go:71-75`:
   ```go
   fields := strings.Fields(strings.TrimSpace(output.String()))
   ver = fields[1]        // "'2.5.7'",含单引号
   ```
3. 校验是严格相等 —— `service/kernel/v2ray/service/service.go:63`:
   `if coreVer != serviceVer` → `'2.5.7'` != `2.5.7`
4. 报错用 `%q` 格式化(`service.go:67-73`),所以显示成 `"'2.5.7'"` vs
`"2.5.7"`,看起来"两边都是 2.5.7"。

#### 影响

`lastKernelExit: "running"`、`serviceValid:
true`,核心启动/配置生成/代理转发都不经过该校验(`CheckCoreVersionMatch()`
全仓库只有一个调用点:`service/server/controller/version.go:35`),所以**功能不受影响,但**:

1. 该横幅是 `dismissible: false`(`gui/src/AppShell.vue:214`),关不掉,且状态写进
localStorage;
2. **它会掩盖真正的故障提示**:`AppShell.vue:214-226` 里 `coreVersionValid ===
false` 与 `serviceValid === false` 是 `if / else if` 关系,属于前者时后者永远不显示;
3. `/api/version` 会一直返回 `"coreVersionValid":
false`,依赖该字段的脚本/面板会读到错误状态。

### 复现问题的步骤

无需安装,直接用 AUR 包构建即可:

```bash
git clone https://aur.archlinux.org/v2raya.git && cd v2raya
makepkg -s --noconfirm
./src/v2rayA-2.5.10/core/v2raya_core version   # 注意版本号带单引号

# 对比:
./src/v2rayA-2.5.10/service/v2raya --report config | head -1   #
或安装后跑下面的对比
v2raya --version                               # 2.5.10
v2raya_core version | awk '{print $2}'         # '2.5.10'  ←
多了单引号,即不匹配
```

安装后打开 Web UI 即可看到红色横幅。

### v2rayA/v2ray运行日志:

本问题不产生日志,它只是 `/api/version` 的一个字段。`journalctl -u v2raya`
里没有任何相关报错,界面也正常,例如:

```json
$ curl -s http://127.0.0.1:2017/api/version
{
  "code": "SUCCESS",
  "data": {
    "coreVersion": "'2.5.7'",
    "coreVersionErr": "core version mismatch: the core reports version
\"'2.5.7'\" but v2rayA is \"2.5.7\"; ...",
    "coreVersionValid": false,
    "lastKernelExit": "running",
    "serviceValid": true,
    "variant": "V2rayaCore",
    "version": "2.5.7"
  }
}
```

### 建议修复

PKGBUILD 第 26 行(与官方 build.sh 对齐):

```diff
-go build -trimpath -ldflags "-X main.Version='$pkgver' -s -w" -o
v2raya_core ./main
+go build -trimpath -ldflags "-X main.Version=$pkgver -s -w" -o
v2raya_core ./main
```

可选的健壮性改进(次要,不替代上面的修复):`where.GetV2rayServiceVersion()` 取值时顺手剥掉引号,例如
`ver = strings.Trim(fields[1], "'\"")`,以免将来任何打包方式引入引号时又变成误报。

### v2rayA设置以及相关截图

如有需要我可以补充横幅截图。我的环境未启用 TUN,使用默认的 socks/http 入站(20170/20171)与
DNS(127.2.0.17:53),代理功能一切正常。


PKGBUILD line 26 的版号注入多了一对单引号,会把 '2.5.10' 连引号一起编进 v2raya_core:

  go build ... -ldflags "-X main.Version='$pkgver' -s -w" -o
v2raya_core ./main

core 因此自报 `V2RAYA_CORE '2.5.10' (...)`,而 service 侧是干净的 `2.5.10`
(对比同文件 line 24 与上游 build.sh:20),导致 CheckCoreVersionMatch 误报
"core version mismatch",Web UI 一直挂着关不掉的红色横幅。

修复:
-  -ldflags "-X main.Version='$pkgver' -s -w"
+  -ldflags "-X main.Version=$pkgver -s -w"

[1] https://aur.archlinux.org/account/dxcqcv/
[2] https://aur.archlinux.org/pkgbase/v2raya/

Reply via email to