Skip to content

Releases: YunoSeng/dsh-ensp

v0.2.3

Choose a tag to compare

@YunoSeng YunoSeng released this 29 Oct 11:23

实机跑「实训任务1 ARP攻击防范」时暴露的三个问题:纯截图版还得手写脚本、S5700 的 save 卡在文件名提问、模板里的空文本框占位填不进去。

Added

  • ensp_doc 新增 template_path:直接拿老师发的原始题目 .docx 当「纯截图版」的底,原文、题号、排版一个字不动,每个 section 的截图依次填进对应 步骤N 标题下面的空位。
    • section.heading 写 步骤3 这种短标识即可,也能用 anchor 指定任意行首文字;找不到锚点会报错并列出缺哪些。
    • 实测任务4:模板 9 个非空文字段落 → 输出仍是 9 段,图片 1 → 10;任务1:267 段 / 3 图 → 267 段 / 11 图,正文逐段比对 True。
    • 以前这步要临时写 python-docx 脚本,半小时起步;现在是一次工具调用的参数。

Fixed

  • save 在 S5700 上卡死:[Y/N] 之后它还会问 Please input the file name ( *.cfg, *.zip ) [vrpcfg.zip]:,旧逻辑等提示符等到超时、saved.ok 一直是 false——本次实测就因此让交换机没存盘。现在识别到这个提问就补一个回车用默认文件名,回显 Save the configuration successfully.。
  • ensp_doc 的截图相对路径失效:python 子进程的工作目录不是 DSH 工作区,传 工作区/截图/x.png 会报 missing image。现在图片路径进 manifest 之前统一按工作区解析。
  • 模板里的「空文本框」被当成非空行:老师给的模板常用无图片的文本框当照片框,旧判定见 w:drawing/w:pict 就跳过,截图会滑到下一个标题下面。现在只有真正带图片关系的段落才算已占用,图片放进文本框内部并按框宽收窄。

Docs

  • SKILL 交付清单补「纯截图版用 template_path 填原题文档」,并说明空文本框占位的处理。

v0.2.2

Choose a tag to compare

@YunoSeng YunoSeng released this 29 Oct 10:33

真机测试踩到的三个坑:防火墙首次登录会强制改密、AR2220 上 save 必然失败、以及只做设备 save 不「保存拓扑」会让重开的配置全部复位。

Added

  • ensp_cli 新增 new_password:USG6000V 用出厂口令首次登录会强制改密(The password needs to be changed. Change now? [Y/N]:)。传 new_password 后工具按 Y → 旧口令 → 新口令 → 确认新口令 走完再登录,实测 admin / Admin@123 → Huawei@123,改完拿到 <USG6000V1> 提示符。

Fixed

  • 防火墙控制台登录判定失效:waitFor() 返回文本后会清空缓冲区,loginIfNeeded() 再读 this.buffer 就是空的,用户名和口令被当成命令打进 Username: 提示符。改为把 waitFor() 的返回文本传进登录流程;顺带处理 Please Press ENTER. 和「又出现一次 Username: 即口令错误」,报错从超时变成 console authentication failed for user "admin" (wrong password?)。
  • save 在 AR2220 上必然失败:旧实现等确认提示再发 y,而 AR 已经把提示符弹回来了,这个 y 就成了 Error: Unrecognized command found at '^' position.,saved.ok 恒为 false。改成一次写 save\ny\n(LF 换行),S3700 / AR2220 / USG6000V 三型设备实测都能拿到 Save the configuration successfully / Configuration file had been saved successfully。

Docs

  • SKILL / README / 插件提示词补上 save 之后还要按 Ctrl+S 保存拓扑:设备 save 只写设备 flash,eNSP 只在保存拓扑时把设备文件回写 .topo 目录。实测不按 Ctrl+S 重开拓扑会回到初始配置;按了之后 vrpcfg.cfg 0 → 4,913 B、flash.efz 9,348 → 11,188 B,重开设备名、接口地址、NAT 策略、改过的口令都在,ping 8.8.8.8 仍 5/5。
  • 明确「纯截图版」交付规范:以用户给的原始题目文档为底,原文字、原题号、原排版一律不动,只在对应题号下面的空白处插图。

v0.2.1

Choose a tag to compare

@YunoSeng YunoSeng released this 28 Oct 17:02

真机测试发现并修复一个会让实验截图交不出去的 bug。

Fixed

  • ensp_cli 的 echo_to_window 从来不提交命令:回显把每行结尾写成 \r,而 lib/bridge.py 的 type_text 明确跳过 \r、只把 \n 映射成 VK_RETURN。于是命令被逐字打进设备窗口后一直躺在输入缓冲里,截图里只有命令行、没有回显输出。改成 \n 后实测正常执行并截到完整输出。
  • 回显默认停顿加大:echo_gap_ms 600 → 900,echo_settle_ms 1200 → 1800,避免长回显还没打印完就截图。

Docs

  • SKILL 错误目录补两条实测记录:首条命令超时且 partial output 只有 ##(设备没就绪,加大 command_timeout_ms 重试即可)、回显截图缺输出(旧版 \r 问题)。

真机验证(MCP 通道,eNSP 1.3.00.100 已开启)

动作 结果
ensp_status(含 telnet 探测) 618 ms,识别到 pid 19896、eNSP 1.2.0.500、11 台设备、4 个控制台端口
ensp_shot target=main 578 ms,1440×810 PNG
ensp_gui {op:open} 打开拓扑 4.5 s(含 4 s 等待)
ensp_gui start_all 12.9 s,4 个端口全部开放,鼠标已还原
ensp_cli SW1 display clock / version 213 ms,回显正确
ensp_cli R1(首次) 20 s 超时、partial ##:设备冷启动未就绪;加大超时重试 269 ms 成功
ensp_cli SW1 + echo_to_window + 截图 4.5 s,截图里命令与输出都在(修复后)
ensp_gui open_console R1 / ensp_shot device / close_console 图标点击 1206,437 命中;截图 693 ms;关闭 1.1 s
ensp_cli 改配置自动 save 533 ms,saved.performed=true / ok=true,回显 Save the configuration successfully.
ensp_gui stop_all 2.6 s,端口全部关闭(恢复测试前状态)

v0.2.0

Choose a tag to compare

@YunoSeng YunoSeng released this 28 Oct 16:44

在 DSH 插件之外增加一个 MCP 服务器:同一套六个工具,Claude Desktop / Claude Code / Cursor / Trae / Cline 等客户端可直接用。

怎么做的

  • mcp/server.js 调 apply() 用替身上下文注册工具,拿到的是 DSH 插件用的同一批工具对象(同名、同 schema、同 handler)——不复制代码,两边行为不会漂移
  • mcp/protocol.js 手写 newline-delimited JSON-RPC 传输,插件保持零运行时依赖
  • mcp/instructions.js 把 SKILL.md 的硬规则搬成 MCP server instructions(换客户端也不丢实测经验)
  • bin/dsh-ensp-mcp.mjs 入口,支持 --workspace、--no-restrict、--mode job|serve、--python、--version、--help

启动

node bin/dsh-ensp-mcp.mjs --workspace E:/labs
{
  "mcpServers": {
    "ensp": {
      "command": "node",
      "args": [
        "E:/dsh-plugins/dsh-ensp/bin/dsh-ensp-mcp.mjs",
        "--workspace",
        "E:/labs"
      ]
    }
  }
}

--workspace 决定相对路径基准与沙箱边界;--no-restrict 关闭边界检查。

能力

能力 状态
tools(6 个,JSON Schema + 必填项) ✅
initialize / notifications / ping / 错误码 ✅
server instructions ✅
resources / prompts / 进度通知 ⏳ 最小可用版暂未实现

验证

新增离线冒烟测试 npm test:24 项断言(协议握手与版本回落、schema 映射与必填项、拓扑解析、工作区边界、未知工具/方法错误码),不需要 eNSP、Python 或管理员权限。

真机端到端也验过:真实 stdio 会话下 initialize → tools/list → tools/call,ensp_status 返回 bridge.available=true / elevated=true,ensp_shot target=screen 输出 1920×1080 PNG,工作区外路径与死端口都按 isError 正确回传。

说明

MCP 不改变速度(瓶颈仍在 GUI 驱动),改变的是谁能用。只想搭拓扑的话社区项目 Heaxu/ensp-mcp 更专业,两者可在同一客户端并存。

v0.1.0

Choose a tag to compare

@YunoSeng YunoSeng released this 27 Oct 12:42

首个可用版本:让 AI 更好地使用华为 eNSP 做网络实验。

六个工具

  • ensp_status 开工前探明:提权桥状态、已打开的实例、本机安装的版本、已打开的设备窗口、.topo 设备清单与控制台端口
  • ensp_gui 一次调用跑完整套界面动作(start_all / stop_all / open_console / close_console + 全部底层 op),一整套点击只付一次提权进程启动成本
  • ensp_shot 窗口 DC 截图,主窗口被遮挡也能截,不抢焦点;设备窗口自动确保真可见(隐藏/最小化的窗口会返回旧画面)
  • ensp_cli telnet 下发 VRP 命令,自动处理分屏、提示符、AAA 登录;改配置后自动 save(答 [Y/N]);可选真实键盘回显 + 截图
  • ensp_topo 纯文件读写 .topo:改名、改 PC/Server IP、重排控制台端口(永不原地改源文件)
  • ensp_doc 生成说明版 + 纯截图版两份 docx 实验报告

稳定性

  • 真实点击带 expect 归属校验:用户开着全屏窗口盖住 eNSP 时拒绝点击而不是乱点
  • 激活链 SwitchToThisWindow → SetForegroundWindow → 置顶 → 点标题栏,抢不到前台就拒绝打字
  • 设备窗口只走双击画布图标这条人类路径(外部 ShowWindow 会被 eNSP 立刻撤销)
  • 主窗口/控制台被最小化时自动 SW_RESTORE 再操作(最小化窗口坐标是 -32000 废值)
  • 点完工具栏自动轮询 com_port,不用猜设备启动要几秒

安装

{
  "dependencies": {
    "dsh-ensp": "link:E:/dsh-plugins/dsh-ensp"
  },
  "dsh": {
    "profile": {
      "bundles": ["dsh-ensp"]
    }
  }
}

或 pnpm add github:YunoSeng/dsh-ensp#v0.1.0。重启 DSH 后技能目录出现 ensp-automation。

实测环境:Windows 10/11 + eNSP 1.3.00.100(client 1.2.0.500)。详细坐标、坑与耗时见 README 与 skills/ensp-automation/SKILL.md。