Add LLDP collect page with conservative fabric edge lifecycle.

Move scheduled discovery under Network → LLDP links, mark absent edges missing after one successful scan, purge only after four miss cycles, and expose unmatched/raw job detail.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-08-02 03:39:15 +08:00
parent 9674de221d
commit d05ba0f1f7
30 changed files with 4713 additions and 1870 deletions

View file

@ -32,7 +32,7 @@ const en = {
webcrt: "WebCRT",
webcrtDesc: "Interactive browser login to connected NEs (SSH/Telnet)",
topology: "Topology",
topologyDesc: "Drag NE topology maps; discover links via LLDP/CDP",
topologyDesc: "Fabric topology views; LLDP physical discovery; MCP paged graph query",
portTrafficWall: "Traffic wall",
portTrafficWallDesc: "Named traffic boards in dedicated tabs",
users: "Users",
@ -48,8 +48,10 @@ const en = {
nav: {
detail: "Network details",
tasks: "Monitoring tasks",
topologyMgmt: "Topology management",
devices: "Device list",
topology: "Topology",
lldpLinks: "LLDP links",
alarms: "Alarms",
configs: "Configurations",
webcrt: "WebCRT",
@ -225,6 +227,49 @@ const en = {
vendor: "Vendor",
},
},
lldpLinks: {
title: "LLDP links",
collectNow: "Collect now",
started: "LLDP collect started",
policyTitle: "Collect policy",
policySaved: "Policy saved",
enabled: "Enable scheduled collect",
autoAddUnmatched: "Create SSH placeholder NEs for unmatched neighbors",
intervalDays: "Interval (days)",
concurrency: "Concurrency",
scope: "Scope",
scopeAll: "All managed NEs",
scopeSelected: "Selected NEs",
savePolicy: "Save policy",
selectedCount: "{{count}} selected",
targetKeywordPh: "Name / IP / vendor",
jobsTitle: "Collect jobs",
jobDetailTitle: "Job details",
kpi: {
nodes: "Fabric nodes",
edges: "Active links",
missing: "Missing",
running: "In progress",
idle: "Idle",
last: "Last job",
nextDue: "Next due",
},
col: {
source: "Source",
name: "Device",
vendor: "Vendor",
trigger: "Trigger",
scope: "Scope",
status: "Status",
progress: "Progress",
edges: "Edges",
missingDelta: "Missing/purged",
started: "Started",
ended: "Ended",
neighbors: "Neighbors",
error: "Error",
},
},
configSync: {
title: "Config sync",
syncNow: "Sync now",
@ -924,7 +969,6 @@ const en = {
},
newSession: {
title: "New Session",
hint: "Enter host and protocol. SSH prompts for username/password (editable on retry); Telnet logs in interactively. Duplicate names become (1), (2)…; same IP is allowed.",
connect: "Connect",
connecting: "Connecting…",
protocol: "Protocol",
@ -1154,7 +1198,7 @@ const en = {
sourcePort: "Local port",
targetPort: "Remote port",
canvasHint:
"Use toolbar modes (select/pan/drag/connect), box-select, and layout. Blue dashed=discovered, red=missing. Shortcuts V/H/A/C, Ctrl+Z undo.",
"Add NEs from the palette, drag then save positions; LLDP discovery writes the global fabric. Blue dashed=discovered, red=stale.",
selected: "Selected",
selectedEdge: "Selected edge",
selectedCount: "{{count}} selected",

View file

@ -32,7 +32,7 @@ const zh = {
webcrt: "WebCRT",
webcrtDesc: "浏览器内交互登录已连通网元(SSH/Telnet)",
topology: "拓扑管理",
topologyDesc: "拖拽编排网元拓扑,支持 LLDP/CDP 发现链路",
topologyDesc: "Fabric 拓扑视图;LLDP 发现物理链路,MCP 可分页拉图",
portTrafficWall: "流量大屏",
portTrafficWallDesc: "独立页签打开命名流量大屏",
users: "用户管理",
@ -48,8 +48,10 @@ const zh = {
nav: {
detail: "网络详情",
tasks: "监控任务",
topologyMgmt: "拓扑管理",
devices: "设备列表",
topology: "拓扑信息",
lldpLinks: "LLDP 链路",
alarms: "告警信息",
configs: "配置信息",
webcrt: "WebCRT",
@ -225,6 +227,49 @@ const zh = {
vendor: "厂商",
},
},
lldpLinks: {
title: "LLDP 链路",
collectNow: "立即采集",
started: "已启动 LLDP 采集",
policyTitle: "采集策略",
policySaved: "策略已保存",
enabled: "启用周期调度",
autoAddUnmatched: "未纳管邻居建 SSH 占位网元",
intervalDays: "周期(天)",
concurrency: "并发",
scope: "范围",
scopeAll: "全部纳管网元",
scopeSelected: "指定网元",
savePolicy: "保存策略",
selectedCount: "已选 {{count}} 台",
targetKeywordPh: "名称 / IP / 厂商",
jobsTitle: "采集任务",
jobDetailTitle: "任务明细",
kpi: {
nodes: "Fabric 网元",
edges: "活跃链路",
missing: "未发现",
running: "进行中",
idle: "空闲",
last: "最近任务",
nextDue: "下次调度",
},
col: {
source: "来源",
name: "设备",
vendor: "厂商",
trigger: "触发",
scope: "范围",
status: "状态",
progress: "进度",
edges: "链路",
missingDelta: "未发现/清理",
started: "开始",
ended: "结束",
neighbors: "邻居",
error: "错误",
},
},
configSync: {
title: "配置同步",
syncNow: "立即全量同步",
@ -921,7 +966,6 @@ const zh = {
},
newSession: {
title: "新建会话",
hint: "填写主机与协议后连接。SSH 弹出用户名/密码(可改);Telnet 进终端交互登录。同名会话自动加 (1)、(2)…,允许相同 IP。",
connect: "连接",
connecting: "连接中…",
protocol: "协议",
@ -1151,7 +1195,7 @@ const zh = {
sourcePort: "本端端口",
targetPort: "对端端口",
canvasHint:
"工具栏切换选择/平移/拖动/连线;框选多选;布局可自动构图。蓝虚线=发现链路,红虚线=未发现。快捷键 V/H/A/C,Ctrl+Z 撤销。",
"从网元库上图,拖拽后保存坐标;LLDP 发现写入全局 Fabric。蓝虚线=发现链路,红虚线=stale。",
selected: "已选节点",
selectedEdge: "已选链路",
selectedCount: "已选 {{count}}",