feat(webcrt): add CRT-style browser terminal for managed and UME NEs

Ship an ops WebCRT module with xterm.js UI, WebSocket session bridge reusing hop/bastion login, searchable paged targets, and session audit limits.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-07-29 17:23:45 +08:00
parent 88479245bb
commit 873f2bfe34
21 changed files with 1868 additions and 45 deletions

View file

@ -26,6 +26,8 @@ const en = {
managedNeDesc: "Multi-vendor SSH/Telnet NEs & connectivity test",
collect: "Batch Collect",
collectDesc: "Run custom CLI commands on connected NEs and save logs",
webcrt: "WebCRT",
webcrtDesc: "Interactive browser login to connected NEs (SSH/Telnet)",
},
},
layout: {
@ -33,6 +35,7 @@ const en = {
titleUme: "UME Sync",
titleManagedNe: "NE Management",
titleCollect: "Batch Collect",
titleWebcrt: "WebCRT",
navUme: "UME",
netxApi: "netx api",
oclawBridge: "oclaw WSS",
@ -135,6 +138,7 @@ const en = {
importing: "Importing…",
edit: "Edit",
delete: "Delete",
openTerminal: "Terminal",
confirmDelete: "Delete this network element?",
batchDelete: "Batch delete",
batchDeleting: "Deleting…",
@ -535,6 +539,42 @@ const en = {
noHostName: "No host_name (sync inventory first)",
},
},
webcrt: {
title: "WebCRT",
sessionManager: "Sessions",
connect: "Connect",
hint: "Pick a connected NE and open an interactive terminal in the browser. Credentials stay on the server.",
hintCrt: "Select an NE on the left, then double-click or press ⚡. Includes managed and UME inventory; search + paging for large fleets.",
filterKeyword: "Filter",
filterKeywordPh: "Filter by name / IP / tag",
empty: "No matching NEs. Switch source or refine the search.",
open: "Open terminal",
opening: "Connecting…",
opened: "Opened {{name}}",
disconnect: "Disconnect",
closed: "Session closed",
termPlaceholder: "No terminal session open",
sessionMeta: "{{name}} · {{ip}}",
source: {
all: "All",
managed: "Managed",
ume: "UME",
},
status: {
idle: "Idle",
connecting: "Connecting",
connected: "Connected",
error: "Error",
closed: "Closed",
},
err: {
sessionLimit: "Session limit reached; close other terminals first",
neNotFound: "Network element not found",
credsIncomplete: "Incomplete username/password on this NE",
cliProfile: "UME NEs require a CLI connect profile (default account / hop)",
connectFailed: "Device login failed: {{detail}}",
},
},
};
export default en;

View file

@ -26,6 +26,8 @@ const zh = {
managedNeDesc: "多厂商 SSH/Telnet 网元与连通性测试",
collect: "批量采集",
collectDesc: "对已连通网元执行定制 CLI 命令并保存日志",
webcrt: "WebCRT",
webcrtDesc: "浏览器内交互登录已连通网元(SSH/Telnet)",
},
},
layout: {
@ -33,6 +35,7 @@ const zh = {
titleUme: "UME同步",
titleManagedNe: "网元管理",
titleCollect: "批量采集",
titleWebcrt: "WebCRT",
navUme: "UME 对接",
netxApi: "netx api",
oclawBridge: "oclaw WSS",
@ -134,6 +137,7 @@ const zh = {
importing: "导入中…",
edit: "编辑",
delete: "删除",
openTerminal: "终端",
confirmDelete: "确定删除该网元?",
batchDelete: "批量删除",
batchDeleting: "删除中…",
@ -533,6 +537,42 @@ const zh = {
noHostName: "无 host_name(需先同步网元)",
},
},
webcrt: {
title: "WebCRT",
sessionManager: "会话管理",
connect: "连接",
hint: "选择已连通网元,在浏览器中打开交互式终端。凭据由服务端解密,不会下发到前端。",
hintCrt: "在左侧选择网元后双击或点 ⚡ 连接;支持托管网元与 UME 网元,可用搜索与分页浏览上万台设备。",
filterKeyword: "筛选",
filterKeywordPh: "按名称 / IP / 标签筛选",
empty: "没有匹配的网元。可切换来源或调整搜索关键字。",
open: "打开终端",
opening: "连接中…",
opened: "已打开 {{name}}",
disconnect: "断开",
closed: "会话已断开",
termPlaceholder: "尚未打开终端会话",
sessionMeta: "{{name}} · {{ip}}",
source: {
all: "全部",
managed: "托管",
ume: "UME",
},
status: {
idle: "空闲",
connecting: "连接中",
connected: "已连接",
error: "错误",
closed: "已关闭",
},
err: {
sessionLimit: "并发会话已达上限,请先关闭其他终端",
neNotFound: "网元不存在",
credsIncomplete: "网元账号或密码不完整",
cliProfile: "UME 网元需要先配置 CLI 连接模板(默认账号/跳板)",
connectFailed: "登录设备失败:{{detail}}",
},
},
};
export default zh;