订阅线路不在内核的全局名字表里,入站的 proxy 指不到它(决策记录 0005)。做法是自动建 一个只装它的策略组再指过去,用户看到的只是「这个口固定走这条线」,组是实现细节: 不出现在策略组列表里,列表和详情里都显示成线路本身的名字,没人再引用时自动删掉。 筛选条件必须做对两件事,都写了测试:转义正则元字符(线路名形如 [vmess]DMIT.LAX.Pro 里的方括号和点不转义会匹配错),以及前后加锚点(内核是部分匹配,不加锚点时「香港01」 会把「香港011」也捞进来)。线路名含反引号时表达不了——那是内核切分多个筛选条件的 分隔符——这种情况明说做不到而不是生成一个会静默匹配错的组。 实测:生成的配置 mihomo -t 通过;起一个临时内核问 /proxies,这个组解析出来的成员 恰好只有那一条线路,且确实进了名字表所以入站指得到。
37 lines
1.7 KiB
TypeScript
37 lines
1.7 KiB
TypeScript
/**
|
|
* 验证「把入站固定到某条订阅线路」生成的配置内核真的接受。
|
|
*
|
|
* 这个功能会往用户的配置里塞一个自动生成的策略组,光靠单元测试只能证明字符串拼对了,
|
|
* 证明不了内核认。所以这里走一遍真实的写回路径,再交给 mihomo -t 校验。
|
|
*
|
|
* 用法:bun run scripts/verify-pin.ts <源配置> <输出路径> <线路名>
|
|
*/
|
|
import { readFileSync, writeFileSync } from 'node:fs'
|
|
import { openDocument } from '../vendor/config-editor/index.ts'
|
|
import type { ConfigObject } from '../vendor/config-editor/index.ts'
|
|
import { rewriteYaml } from '../server/config-store.ts'
|
|
import { generatedGroupName, makeFilterGroup, pruneGeneratedGroups } from '../shared/filter-groups.ts'
|
|
|
|
const [src, out, line] = process.argv.slice(2)
|
|
if (!src || !out || !line) {
|
|
console.error('用法:bun run scripts/verify-pin.ts <源配置> <输出路径> <线路名>')
|
|
process.exit(1)
|
|
}
|
|
|
|
const source = readFileSync(src, 'utf8')
|
|
const data = JSON.parse(JSON.stringify(openDocument(source).data)) as ConfigObject
|
|
|
|
// 模拟界面上的两个动作:新增一路入站,把它固定到某条订阅线路
|
|
data.listeners = [{ name: '容器A', type: 'mixed', port: 17895 }]
|
|
const group = makeFilterGroup(line, 'subs')
|
|
if (!group) {
|
|
console.error(`${line} 的名字里含反引号,无法生成筛选条件`)
|
|
process.exit(1)
|
|
}
|
|
data['proxy-groups'] = [...(data['proxy-groups'] as ConfigObject[]), group]
|
|
;(data.listeners as ConfigObject[])[0]!.proxy = generatedGroupName(line)
|
|
|
|
writeFileSync(out, rewriteYaml(source, pruneGeneratedGroups(data)), 'utf8')
|
|
console.log('生成的组:')
|
|
console.log(JSON.stringify(group, null, 2))
|