fix(web,agent,frp): frps 配置预览脱敏、日志界面倒序与来源中文化,agent 0.12.4 重写日志日期格式(v1.2.12)
CI / verify (push) Canceled after 0s
CI / verify (push) Canceled after 0s
- frps.toml 同源配置预览泄露明文密钥:FRPSServerConfig(对外预览入口)改为走 maskFRPSSecrets,auth.token / auth.oidc.clientSecret 的值换成 ********(键名与结构保留、注释行不动);下发路径 PushFRPSConfigToAgent 与安装流程仍用未脱敏内容。弹窗补说明,「复制」改「复制(已脱敏)」 - agent 0.12.4:frps 日志 6 行 → 最近 20 行、最新在最上面;日期由 short-iso 的 2026-09-22T18:43:34+08:00 RainYun-XXX 重写为 2026-09-22 18:43:34 进程: 消息(去掉 T 分隔、时区偏移与每行重复的主机名),frps/action 失败日志一并统一 - 日志界面:FRP 日志「来源」列由 Go 源码文件名(client/control.go:174)改为中文模块名;规则详情「日志」页签倒序;「公网服务端」弹窗改为显示 VPS 上的 frps 服务日志 - 测试:maskFRPSSecrets 脱敏(明文不出现、非敏感行不误伤)与注释行不改写;gofmt / go build / go vet / go test / vue-tsc / vite build 全绿 - AgentVersion 0.12.2 → 0.12.4,双架构内嵌二进制已重编:需在 VPS 上点一次「升级 Agent」才生效
This commit is contained in:
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "fonu-web",
|
||||
"private": true,
|
||||
"version": "1.2.11",
|
||||
"version": "1.2.12",
|
||||
"packageManager": "npm@10.9.4",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@@ -336,11 +336,13 @@
|
||||
<p class="form-hint">
|
||||
由 Fonu 本地生成;点「下发 frps 配置」后写入 VPS 的
|
||||
<span class="mono">{{ agentStatus?.frps_config_path || '/etc/frp/frps.toml' }}</span>,重启 frps 后生效。
|
||||
<br />
|
||||
密钥类字段(如 <span class="mono">auth.token</span>)在这里显示为掩码,下发时仍使用真实值。
|
||||
</p>
|
||||
<pre class="code-block config-modal__code">{{ configContent || '# 暂无内容' }}</pre>
|
||||
</div>
|
||||
<div class="config-modal__footer">
|
||||
<n-button size="small" :disabled="!configContent" @click="copyConfig">复制</n-button>
|
||||
<n-button size="small" :disabled="!configContent" @click="copyConfig">复制(已脱敏)</n-button>
|
||||
<n-button size="small" type="primary" @click="configModal = false">关闭</n-button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -561,15 +563,14 @@
|
||||
<n-modal v-model:show="showServerLogs">
|
||||
<div class="frp-card-modal">
|
||||
<div class="proxy-modal__header">
|
||||
<h3 class="modal-title">公网服务端运行日志 - {{ serverLogsTarget?.name ?? '' }}</h3>
|
||||
<h3 class="modal-title">frps 服务日志 - {{ serverLogsTarget?.name ?? '' }}</h3>
|
||||
<n-button size="small" quaternary @click="showServerLogs = false">关闭</n-button>
|
||||
</div>
|
||||
<div class="proxy-modal__scroll">
|
||||
<div class="logs-toolbar">
|
||||
<span class="table-muted">{{ serverLogsTarget?.server_addr }}:{{ serverLogsTarget?.server_port }} · frpc-server-{{ serverLogsTarget?.id }}.log</span>
|
||||
<n-button size="small" :loading="serverLogsLoading" @click="loadServerLogs">刷新</n-button>
|
||||
<span class="table-muted">VPS 上的 frps 服务日志(journalctl,最近 20 行、新的在上)· {{ serverLogsTarget?.server_addr }}:{{ serverLogsTarget?.server_port }}</span>
|
||||
</div>
|
||||
<pre class="logs-box">{{ serverLogLines.length ? serverLogLines.join('\n') : '暂无该服务端的运行日志' }}</pre>
|
||||
<pre class="logs-box">{{ agentStatus?.frps_log_tail || '暂无 frps 日志:可能是 VPS 上 frps 未启动,或 agent 版本低于 0.12.3' }}</pre>
|
||||
</div>
|
||||
<div class="modal-footer"><n-button @click="showServerLogs = false">关闭</n-button></div>
|
||||
</div>
|
||||
|
||||
@@ -921,7 +921,10 @@ function closeProxyDetail() {
|
||||
|
||||
async function loadProxyLogs(proxyID: number) {
|
||||
proxyLogsLoading.value = true
|
||||
try { proxyLogLines.value = asList(await api.getFrpProxyLogs(proxyID)) }
|
||||
try {
|
||||
// 日志文件按时间升序返回,倒过来让最新一条在最上面,与「FRP 日志」页签的展示一致
|
||||
proxyLogLines.value = asList(await api.getFrpProxyLogs(proxyID)).reverse()
|
||||
}
|
||||
catch (error) { message.error(error instanceof Error ? error.message : '读取规则日志失败') }
|
||||
finally { proxyLogsLoading.value = false }
|
||||
}
|
||||
|
||||
@@ -413,6 +413,31 @@ const frpLevelText: Record<string, string> = { I: '信息', W: '警告', E: '错
|
||||
// 工具条的级别选项值是 INFO / WARN / ERROR,而 frpc 的级别是单字母 I/W/E/D,需转换后再比较
|
||||
const frpLevelAlias: Record<string, string> = { INFO: 'I', WARN: 'W', ERROR: 'E' }
|
||||
|
||||
// frpc 的「来源」是 Go 源码文件行号(如 client/control.go:174),对用户没有意义;
|
||||
// 这里按文件前缀映射成中文模块名,认不出来的(例如回落到的组件名)原样保留。
|
||||
const FRP_SOURCE_LABELS: { prefix: string; label: string }[] = [
|
||||
{ prefix: 'client/control.go', label: '连接' },
|
||||
{ prefix: 'client/service.go', label: '登录' },
|
||||
{ prefix: 'client/proxy.go', label: '连接' },
|
||||
{ prefix: 'client/', label: '客户端' },
|
||||
{ prefix: 'proxy/proxy_manager.go', label: '代理' },
|
||||
{ prefix: 'proxy/', label: '代理' },
|
||||
{ prefix: 'sub/root.go', label: '服务' },
|
||||
{ prefix: 'sub/', label: '服务' },
|
||||
{ prefix: 'config/', label: '配置' },
|
||||
{ prefix: 'health/', label: '健康检查' },
|
||||
{ prefix: 'server/', label: '服务端' },
|
||||
{ prefix: 'pkg/', label: '组件' },
|
||||
]
|
||||
|
||||
function frpSourceLabel(source: string): string {
|
||||
const file = source.split(':')[0] ?? ''
|
||||
for (const item of FRP_SOURCE_LABELS) {
|
||||
if (file === item.prefix || file.startsWith(item.prefix)) return item.label
|
||||
}
|
||||
return file || source
|
||||
}
|
||||
|
||||
// frpc 行有两种形态:
|
||||
// 2026-09-23 15:20:31.123 [I] [service.go:295] login to server success
|
||||
// [web] 2026-09-20 19:38:51.771 [I] [client/control.go:174] [trace-id] [web-http] start proxy success
|
||||
@@ -426,7 +451,7 @@ function parseFrpLogLine(line: string): FrpLogEntry {
|
||||
return {
|
||||
time: matched[2],
|
||||
level: matched[3].toUpperCase(),
|
||||
source: matched[4] || component,
|
||||
source: frpSourceLabel(matched[4] || component),
|
||||
message: matched[5] ?? '',
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user