- {a.probes.map((p) => (
-
+ {a.dialers.map((p) => (
+
|
- {probeName(p.probe_id)} {p.ip_version === 'ipv6' ? 'IPv6' : 'IPv4'}
- {p.probe_id}
+ {dialerName(p.dialer_id)} {p.ip_version === 'ipv6' ? 'IPv6' : 'IPv4'}
+ {p.dialer_id}
|
{p.version ?? '—'} |
{p.remote ?? '—'} |
@@ -205,7 +207,7 @@ export function AgentDetail() {
-
+
测试
@@ -213,7 +215,7 @@ export function AgentDetail() {
type="button"
className="btn small danger"
onClick={async () => {
- await run(() => api.post(`/api/admin/agents/${a.id}/probes/${p.probe_id}/disconnect`), '已断开(Probe 会自动重连,除非已被吊销)')
+ await run(() => api.post(`/api/admin/agents/${a.id}/dialers/${p.dialer_id}/disconnect`), '已断开;线路开启时对端会自动重连')
agent.reload()
}}
>
@@ -255,10 +257,12 @@ export function AgentDetail() {
{a.ipv6?.has_global_address == null ? '未知' : a.ipv6.has_global_address ? '已获得' : '未获得'}
IPv6 默认路由
{a.ipv6?.has_default_route == null ? '未知' : a.ipv6.has_default_route ? '存在' : '缺失'}
+ 监听
+ {a.listens ? '已开启' : '已关闭'}
控制端口
- {a.probe_tcp_port}/tcp
+ {a.tcp_port}/tcp
数据端口
- {a.probe_quic_ports.map((p) => `${p}/udp (QUIC)`).join(', ') || '—'}
+ {a.quic_ports.map((p) => `${p}/udp (QUIC)`).join(', ') || '—'}
版本
{a.agent_version ?? '—'}
展示页可见
diff --git a/web/admin/src/pages/Agents.tsx b/web/admin/src/pages/Agents.tsx
index ddc64ef..1d81b78 100644
--- a/web/admin/src/pages/Agents.tsx
+++ b/web/admin/src/pages/Agents.tsx
@@ -30,7 +30,7 @@ function AddAgentDialog({ onClose, onCreated }: { onClose: () => void; onCreated
const [created, setCreated] = useState()
const [controllers, setControllers] = useState(null)
- if (created) return
+ if (created) return
return (
|
@@ -171,7 +171,7 @@ export function Agents() {
{a.public_host || '—'} |
{a.agent_version ?? '—'} |
- 0 ? 'ok' : ''}>{a.probes.length} 个
+ 0 ? 'ok' : ''}>{a.outgoing.length} / {a.dialers.length}
|
{fmtAgo(a.last_seen_at)} |
diff --git a/web/admin/src/pages/CapabilityPicker.tsx b/web/admin/src/pages/CapabilityPicker.tsx
index cf40b07..335d67d 100644
--- a/web/admin/src/pages/CapabilityPicker.tsx
+++ b/web/admin/src/pages/CapabilityPicker.tsx
@@ -6,7 +6,7 @@ import { Chip } from '@shared/ui'
/** 能力的中文名和说明。目录(分组、依赖、预设)来自后端,这里只管显示文字。 */
const NAMES: Record = {
'public.read': ['查看展示数据', '看隐藏线路;站点私有时看展示页'],
- 'fleet.read': ['查看节点', 'Agent、Probe、线路、加入代码'],
+ 'fleet.read': ['查看节点', 'Agent、线路、加入代码'],
'fleet.write': ['修改节点', '改名、标签、可见性、地址、线路开关、断开会话'],
'fleet.enroll': ['添加节点', '生成加入代码、批准新节点'],
'fleet.revoke': ['吊销或删除节点', '破坏性操作'],
diff --git a/web/admin/src/pages/JoinTokenCreated.tsx b/web/admin/src/pages/JoinTokenCreated.tsx
index 7853cc4..305c724 100644
--- a/web/admin/src/pages/JoinTokenCreated.tsx
+++ b/web/admin/src/pages/JoinTokenCreated.tsx
@@ -3,12 +3,12 @@ import { fmtTime } from '@shared/format'
import { CommandTabs, CopyButton, Dialog, Field, guessPlatform, type CommandTab } from '@shared/ui'
/**
- * 加入令牌创建之后的对话框:Agent 和 Probe 共用同一份。
+ * 加入令牌创建之后的对话框:Agent 共用同一份。
* Podman 系(Linux)首选 Quadlet(Podman 4.6+):env、单元文件(核对哈希)、启动用户服务;单元 Pull=always,节点发现新版本后自己退出重启,所以默认自动更新。
* Docker(Linux、macOS、Windows)用 compose:把面板给的 .env 存下来,下载 compose.yaml,`compose up -d`;compose 不会自动更新,手动 `compose pull && compose up -d`。
* env/.env 里只有公开的值(面板地址、一次性码、信任根指纹和属主),没有任何私钥;一行安装脚本留作备用。
*/
-export function JoinTokenCreated({ created, kind, onClose }: { created: CreatedJoinTokenDto; kind: 'Agent' | 'Probe'; onClose: () => void }) {
+export function JoinTokenCreated({ created, onClose }: { created: CreatedJoinTokenDto; onClose: () => void }) {
const quadlet = created.quadlet
const compose = created.compose
const script = created.install_commands
@@ -20,7 +20,7 @@ export function JoinTokenCreated({ created, kind, onClose }: { created: CreatedJ
const initial = composeTabs.some((t) => t.id === guessPlatform()) ? guessPlatform() : 'linux'
return (
|