dsh-ensp 0.1.2 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +212 -274
- package/docs/plugin-detail.en.md +14 -0
- package/docs/plugin-detail.zh.md +14 -0
- package/package.json +5 -15
- package/screenshots.json +3 -0
- package/src/core/index.mjs +9 -1
- package/src/core/launcher.mjs +284 -24
- package/src/core/provision.mjs +81 -0
- package/src/core/topology.mjs +23 -5
- package/src/dsh/index.mjs +595 -387
package/README.md
CHANGED
|
@@ -1,274 +1,212 @@
|
|
|
1
|
-
<p align="center">
|
|
2
|
-
<strong>中文</strong>
|
|
3
|
-
</p>
|
|
4
|
-
|
|
5
|
-
<p align="center">
|
|
6
|
-
<a href="https://www.npmjs.com/package/dsh-ensp"><img alt="npm" src="https://img.shields.io/npm/v/dsh-ensp?style=flat-square&color=6c5ce7"></a>
|
|
7
|
-
<a href="https://www.npmjs.com/package/dsh-ensp"><img alt="npm downloads" src="https://img.shields.io/npm/dm/dsh-ensp?style=flat-square&color=4b6fff"></a>
|
|
8
|
-
<a href="https://github.com/lizi600jin/dsh-ensp/stargazers"><img alt="GitHub stars" src="https://img.shields.io/github/stars/lizi600jin/dsh-ensp?style=flat-square&color=eab308"></a>
|
|
9
|
-
<a href="LICENSE"><img alt="license" src="https://img.shields.io/badge/license-GPL--3.0--or--later-blue?style=flat-square"></a>
|
|
10
|
-
</p>
|
|
11
|
-
|
|
12
|
-
# dsh-ensp
|
|
13
|
-
|
|
14
|
-
面向华为 eNSP
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
- CLI
|
|
19
|
-
- MCP Server
|
|
20
|
-
- DeepSeek Harness
|
|
21
|
-
|
|
22
|
-
##
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
在
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
<interface sztype="Ethernet" interfacename="GE" count="1" /> <!-- GE0/0/0 -->
|
|
214
|
-
<interface sztype="Ethernet" interfacename="GE" count="2" /> <!-- GE0/0/1~2 -->
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
若合并为一个 `count="3"`,eNSP 打开后画布为空,且不产生任何错误提示。
|
|
218
|
-
|
|
219
|
-
### PC 的接口名在文件与命令行中不一致
|
|
220
|
-
|
|
221
|
-
拓扑文件中写作 `interfacename="GE"`,命令行中对应 `Ethernet0/0/1`。
|
|
222
|
-
|
|
223
|
-
### 正则单词边界对 `GigabitEthernet0` 不成立
|
|
224
|
-
|
|
225
|
-
`GigabitEthernet` 与紧随的 `0` 均为单词字符,两者之间不存在单词边界,`\b` 断言因此失败且不报错,进而导致主机名解析错误和视图判断错误。
|
|
226
|
-
|
|
227
|
-
### 视图切换存在竞态
|
|
228
|
-
|
|
229
|
-
执行 `interface GigabitEthernet0/0/2` 后立即发送下一条命令时,设备可能尚未完成视图切换,该命令会被丢弃。需要等该命令本身回显之后,才能确认切换完成。
|
|
230
|
-
|
|
231
|
-
## 致谢与许可
|
|
232
|
-
|
|
233
|
-
### 开源协议
|
|
234
|
-
|
|
235
|
-
本项目采用 [GPL-3.0-or-later](LICENSE),即 GNU General Public License 第 3 版或更新版本。
|
|
236
|
-
|
|
237
|
-
该协议与发布者的意愿对应如下:
|
|
238
|
-
|
|
239
|
-
| 期望 | GPL-3.0 的对应条款 |
|
|
240
|
-
|---|---|
|
|
241
|
-
| 允许任何人修改 | 第 2 条,可自由修改与分发 |
|
|
242
|
-
| 二次分发时注明原作者 | 第 5 条要求保留版权声明;本项目另依据第 7(b) 条增加署名要求 |
|
|
243
|
-
| 二次修改的作品同样开源 | 第 5 条,衍生作品须以同一协议发布 |
|
|
244
|
-
|
|
245
|
-
基于本项目修改并对外分发时,需要做到三点:
|
|
246
|
-
|
|
247
|
-
1. 保留 `LICENSE` 中的版权声明。
|
|
248
|
-
2. 在源码及随附文档中注明原项目名称 `dsh-ensp` 与仓库地址 <https://github.com/lizi600jin/dsh-ensp>。
|
|
249
|
-
3. 使所分发的作品同样以 GPL-3.0-or-later 授权。
|
|
250
|
-
|
|
251
|
-
仅自行使用而不对外分发时,上述要求不适用。
|
|
252
|
-
|
|
253
|
-
未选用 MIT 或 Apache-2.0 的原因在于,这两者允许二次修改后闭源,与“二次修改也须开源”的意愿冲突。
|
|
254
|
-
|
|
255
|
-
### 致谢
|
|
256
|
-
|
|
257
|
-
- Huawei eNSP:仿真器本体。本项目的格式规则均来自对其自带 40 个样例拓扑的分析。
|
|
258
|
-
- dsh-ops:本 README 的组织方式参考了该项目。
|
|
259
|
-
- 在 issue 中反馈问题的使用者。
|
|
260
|
-
|
|
261
|
-
## 免责声明
|
|
262
|
-
|
|
263
|
-
本项目是一个自动化外壳,不包含 eNSP,也不包含任何华为软件或镜像。使用前请自行安装,并遵守华为的软件许可。
|
|
264
|
-
|
|
265
|
-
自动化操作图形界面存在固有风险,例如窗口被遮挡、eNSP 版本升级、系统缩放变化。插件在检测到异常时会明确报错,但仍建议先在非关键环境中验证。
|
|
266
|
-
|
|
267
|
-
## 相关文档
|
|
268
|
-
|
|
269
|
-
| 文档 | 内容 |
|
|
270
|
-
|---|---|
|
|
271
|
-
| [`docs/ENSP-FORMAT.md`](docs/ENSP-FORMAT.md) | `.topo` 格式的完整规则,基于 40 个样例统计得出 |
|
|
272
|
-
| [`docs/UI-ANCHORS.md`](docs/UI-ANCHORS.md) | 界面坐标、DPI 处理与启动流程 |
|
|
273
|
-
| [`docs/SCENARIOS.md`](docs/SCENARIOS.md) | 23 个场景预设的详细说明 |
|
|
274
|
-
| [`scripts/survey-topologies.mjs`](scripts/survey-topologies.mjs) | 重新统计样例格式,供 eNSP 升级后核对 |
|
|
1
|
+
<p align="center">
|
|
2
|
+
<strong>中文</strong>
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<a href="https://www.npmjs.com/package/dsh-ensp"><img alt="npm" src="https://img.shields.io/npm/v/dsh-ensp?style=flat-square&color=6c5ce7"></a>
|
|
7
|
+
<a href="https://www.npmjs.com/package/dsh-ensp"><img alt="npm downloads" src="https://img.shields.io/npm/dm/dsh-ensp?style=flat-square&color=4b6fff"></a>
|
|
8
|
+
<a href="https://github.com/lizi600jin/dsh-ensp/stargazers"><img alt="GitHub stars" src="https://img.shields.io/github/stars/lizi600jin/dsh-ensp?style=flat-square&color=eab308"></a>
|
|
9
|
+
<a href="LICENSE"><img alt="license" src="https://img.shields.io/badge/license-GPL--3.0--or--later-blue?style=flat-square"></a>
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
# dsh-ensp
|
|
13
|
+
|
|
14
|
+
面向华为 eNSP 的自动化工具。生成拓扑、启动设备、按顺序下发配置,并在每条命令后核对结果。
|
|
15
|
+
|
|
16
|
+
提供三种调用方式,共用同一套核心:
|
|
17
|
+
|
|
18
|
+
- CLI:适合脚本化批量操作
|
|
19
|
+
- MCP Server:接入 Claude Desktop、Cursor 等客户端
|
|
20
|
+
- DeepSeek Harness 插件:以模型工具的形式在会话内使用
|
|
21
|
+
|
|
22
|
+
## 功能
|
|
23
|
+
|
|
24
|
+
### 生成拓扑
|
|
25
|
+
|
|
26
|
+
生成 eNSP 可直接打开并正常显示的 `.topo` 文件。支持内置场景,也可自定义设备与链路。
|
|
27
|
+
|
|
28
|
+
```js
|
|
29
|
+
import { twoPcLab, writeTopology } from 'dsh-ensp'
|
|
30
|
+
|
|
31
|
+
await writeTopology('lab.topo', twoPcLab({ vlan: 10 }))
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
```js
|
|
35
|
+
import { buildTopology, autoLayout } from 'dsh-ensp'
|
|
36
|
+
|
|
37
|
+
const topo = autoLayout(
|
|
38
|
+
buildTopology()
|
|
39
|
+
.add('R1', 'AR2220', { x: 180, y: 120 })
|
|
40
|
+
.add('R2', 'AR2220', { x: 460, y: 260 })
|
|
41
|
+
.link('R1', 'GigabitEthernet0/0/0', 'R2', 'GigabitEthernet0/0/0')
|
|
42
|
+
.finish()
|
|
43
|
+
)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
拓扑格式有几处约束来自 eNSP 本身:接口分组必须与机型一致,链路锚点必须落在图标包围盒内。写错任意一项,eNSP 会打开一个没有任何设备的空白画布,并且不报错。规则见 [`docs/ENSP-FORMAT.md`](docs/ENSP-FORMAT.md)。
|
|
47
|
+
|
|
48
|
+
### 启动与停止设备
|
|
49
|
+
|
|
50
|
+
自动定位工具栏按钮,无需手动点击。启动后按设备逐一确认就绪,窗口随即最小化,桌面可继续使用。
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
ensp probe # 重新标定按钮位置
|
|
54
|
+
ensp up lab.topo # 打开、启动、确认就绪、最小化
|
|
55
|
+
ensp stop # 关闭全部设备
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
eNSP 只允许运行一个实例,异常退出时可能留下不占线程的僵尸进程,它会一直持有这个单实例锁,使下一次启动打开空白窗口。工具在启动前会识别并清理这种进程。
|
|
59
|
+
|
|
60
|
+
### 下发配置
|
|
61
|
+
|
|
62
|
+
逐条发送,每条命令确认提示符返回后才继续。任一命令出错即中断,并回报行号、命令与设备原始输出。
|
|
63
|
+
|
|
64
|
+
```js
|
|
65
|
+
import { pushConfig } from 'dsh-ensp'
|
|
66
|
+
|
|
67
|
+
const result = await pushConfig({
|
|
68
|
+
device: 'SW1',
|
|
69
|
+
port: 2000,
|
|
70
|
+
script: `
|
|
71
|
+
system-view
|
|
72
|
+
vlan 10
|
|
73
|
+
quit
|
|
74
|
+
interface GigabitEthernet0/0/1
|
|
75
|
+
port link-type access
|
|
76
|
+
port default vlan 10
|
|
77
|
+
quit
|
|
78
|
+
`,
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
if (!result.ok) {
|
|
82
|
+
console.log(result.failedAt.line, result.failedAt.command, result.failedAt.error)
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 等待协议收敛
|
|
87
|
+
|
|
88
|
+
路由协议是异步收敛的,配置下发完不代表邻居已经建立。这类断言一律走轮询,直到状态达成或超时。
|
|
89
|
+
|
|
90
|
+
```js
|
|
91
|
+
import { waitForOspfFull, waitForOspfRoute, waitForOutput } from 'dsh-ensp'
|
|
92
|
+
|
|
93
|
+
await waitForOspfFull({ port: 2000, neighbourId: '2.2.2.2' })
|
|
94
|
+
await waitForOspfRoute({ port: 2000, prefix: '2.2.2.2/32' })
|
|
95
|
+
await waitForOutput({ port: 2000, command: 'display ip routing-table', until: /2\.2\.2\.2/ })
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
三个函数都返回 `{ ok, converged, output, attempts, waitedMs }`。固定等待一段时间再查询,在慢机器上会误判为失败,在快机器上纯属浪费。
|
|
99
|
+
|
|
100
|
+
### 场景预设
|
|
101
|
+
|
|
102
|
+
内置 23 个场景,覆盖 VLAN、STP、静态路由、RIP、OSPF、BGP、NAT、DHCP、ACL、IPsec、IPv6、WLAN、IS-IS 等主题。
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
ensp preset # 按难度列出全部
|
|
106
|
+
ensp preset ospf-single # 查看某个场景
|
|
107
|
+
ensp preset --search bgp # 按关键词搜索
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
每个场景给出三项信息:需要创建的对象、配置顺序、用于确认结果的检查命令。具体命令由使用者按设备补全。
|
|
111
|
+
|
|
112
|
+
## 安装
|
|
113
|
+
|
|
114
|
+
### 作为 DSH 插件
|
|
115
|
+
|
|
116
|
+
在插件市场搜索 `dsh-ensp` 并安装,或:
|
|
117
|
+
|
|
118
|
+
```console
|
|
119
|
+
dsh plugin --profile desktop add dsh-ensp
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 作为 CLI 或库
|
|
123
|
+
|
|
124
|
+
```console
|
|
125
|
+
npm install -g dsh-ensp
|
|
126
|
+
ensp status
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 作为 MCP Server
|
|
130
|
+
|
|
131
|
+
```json
|
|
132
|
+
{
|
|
133
|
+
"mcpServers": {
|
|
134
|
+
"ensp": {
|
|
135
|
+
"command": "npx",
|
|
136
|
+
"args": ["-y", "dsh-ensp", "mcp"]
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
提供 12 个工具:`ensp_status`、`ensp_build_topology`、`ensp_open`、`ensp_start`、`ensp_stop`、`ensp_apply`、`ensp_apply_dir`、`ensp_query`、`ensp_probe`、`ensp_scenarios`、`ensp_scenario`、`ensp_preset_config`。
|
|
143
|
+
|
|
144
|
+
## 环境要求
|
|
145
|
+
|
|
146
|
+
| 项 | 要求 |
|
|
147
|
+
|---|---|
|
|
148
|
+
| 操作系统 | Windows。eNSP 仅有 Windows 版本 |
|
|
149
|
+
| eNSP | 已安装且可正常运行,需要管理员权限 |
|
|
150
|
+
| Node.js | 18 或更高版本 |
|
|
151
|
+
| 权限 | 插件与 eNSP 需处于相同权限级别 |
|
|
152
|
+
|
|
153
|
+
系统缩放设为 125% 或 150% 时,程序会自行完成坐标换算,不需要手动调分辨率。若 eNSP 升级后按钮位置改变,执行 `ensp probe` 重新标定。
|
|
154
|
+
|
|
155
|
+
## 快速开始
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
ensp preset vlan-access # 查看场景方向
|
|
159
|
+
|
|
160
|
+
node -e "import('dsh-ensp').then(async m => {
|
|
161
|
+
await m.writeTopology('lab.topo', m.twoPcLab())
|
|
162
|
+
})"
|
|
163
|
+
|
|
164
|
+
ensp up lab.topo # 启动设备
|
|
165
|
+
ensp status --topology lab.topo # 查看控制台状态
|
|
166
|
+
ensp apply ./configs --topology lab.topo --save
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
一次两级 OSPF 实验的完整耗时(本机实测,Windows 11、i5、系统缩放 150%):
|
|
170
|
+
|
|
171
|
+
| 阶段 | 耗时 |
|
|
172
|
+
|---|---|
|
|
173
|
+
| 生成 `.topo` | 2s |
|
|
174
|
+
| 打开并渲染拓扑 | 14s |
|
|
175
|
+
| 两台 AR2220 启动到可登录 | 64s |
|
|
176
|
+
| 下发两侧各 9 条配置 | 8s |
|
|
177
|
+
| OSPF 邻居到 Full | 40s |
|
|
178
|
+
|
|
179
|
+
## 致谢与许可
|
|
180
|
+
|
|
181
|
+
### 开源协议
|
|
182
|
+
|
|
183
|
+
采用 [GPL-3.0-or-later](LICENSE)。
|
|
184
|
+
|
|
185
|
+
基于本项目修改并对外分发时,需要:
|
|
186
|
+
|
|
187
|
+
1. 保留 `LICENSE` 中的版权声明;
|
|
188
|
+
2. 在源码及随附文档中注明原项目名称 `dsh-ensp` 与仓库地址 <https://github.com/lizi600jin/dsh-ensp>;
|
|
189
|
+
3. 使所分发的作品同样以 GPL-3.0-or-later 授权。
|
|
190
|
+
|
|
191
|
+
仅自行使用而不对外分发时,上述要求不适用。
|
|
192
|
+
|
|
193
|
+
未选用 MIT 或 Apache-2.0,是因为这两者允许二次修改后闭源,与"二次修改也须开源"的意愿冲突。
|
|
194
|
+
|
|
195
|
+
### 致谢
|
|
196
|
+
|
|
197
|
+
- Huawei eNSP:仿真器本体。
|
|
198
|
+
- 在 issue 中反馈问题的使用者。
|
|
199
|
+
|
|
200
|
+
## 免责声明
|
|
201
|
+
|
|
202
|
+
本项目是一个自动化外壳,不包含 eNSP,也不包含任何华为软件或镜像。使用前请自行安装,并遵守华为的软件许可。
|
|
203
|
+
|
|
204
|
+
自动化操作图形界面存在固有风险,例如窗口被遮挡、eNSP 版本升级、系统缩放变化。建议先在非关键环境中验证。
|
|
205
|
+
|
|
206
|
+
## 相关文档
|
|
207
|
+
|
|
208
|
+
| 文档 | 内容 |
|
|
209
|
+
|---|---|
|
|
210
|
+
| [`docs/ENSP-FORMAT.md`](docs/ENSP-FORMAT.md) | `.topo` 格式规则 |
|
|
211
|
+
| [`docs/UI-ANCHORS.md`](docs/UI-ANCHORS.md) | 界面坐标与启动流程 |
|
|
212
|
+
| [`docs/SCENARIOS.md`](docs/SCENARIOS.md) | 场景预设说明 |
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
|
|
2
|
+
# dsh-ensp
|
|
3
|
+
|
|
4
|
+
Automation for Huawei eNSP: generate topologies, boot devices, push configuration line by line and verify every command's result.
|
|
5
|
+
|
|
6
|
+
- Generates `.topo` files eNSP opens directly, from built-in scenarios or custom devices and links
|
|
7
|
+
- Locates the toolbar buttons to start and stop devices, confirms each one individually, then minimises the window
|
|
8
|
+
- Pushes configuration one command at a time; the first error aborts the batch and reports the line, the command and the device's raw output
|
|
9
|
+
- Ships 23 scenario presets covering VLAN, STP, routing, BGP, NAT, ACL, IPsec, IPv6, WLAN and IS-IS
|
|
10
|
+
- Usable as a CLI, an MCP server, or a DeepSeek Harness plugin
|
|
11
|
+
|
|
12
|
+
Scroll down and open "dsh-ensp>" under the included components to reach its settings.
|
|
13
|
+
|
|
14
|
+
Full documentation: [repository](https://github.com/lizi600jin/dsh-ensp#readme).
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
|
|
2
|
+
# dsh-ensp
|
|
3
|
+
|
|
4
|
+
面向华为 eNSP 的自动化工具:生成拓扑、启动设备、逐条下发配置并核对每条命令的结果。
|
|
5
|
+
|
|
6
|
+
- 生成 eNSP 可直接打开的 `.topo` 文件,支持内置场景与自定义设备、链路
|
|
7
|
+
- 自动定位工具栏按钮完成设备启停,启动后按设备逐一确认就绪,窗口随即最小化
|
|
8
|
+
- 逐条下发配置,任一命令出错即中断并回报行号、命令与设备原始输出
|
|
9
|
+
- 内置 23 个场景预设,覆盖 VLAN、STP、路由、BGP、NAT、ACL、IPsec、IPv6、WLAN、IS-IS 等主题
|
|
10
|
+
- 提供 CLI、MCP Server 与 DeepSeek Harness 插件三种调用方式
|
|
11
|
+
|
|
12
|
+
向下翻页后点击“包含的组件”内的“dsh-ensp>”进入设置界面。
|
|
13
|
+
|
|
14
|
+
完整说明见 [仓库文档](https://github.com/lizi600jin/dsh-ensp#readme)。
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-ensp",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Automate Huawei eNSP labs
|
|
3
|
+
"version": "0.1.6",
|
|
4
|
+
"description": "Automate Huawei eNSP labs: generate .topo files, start and stop devices, and push configuration one command at a time with per-command error reporting.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dsh",
|
|
7
7
|
"dsh-plugin",
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
"huawei",
|
|
11
11
|
"vrp",
|
|
12
12
|
"network-simulation",
|
|
13
|
-
"mcp"
|
|
13
|
+
"mcp",
|
|
14
|
+
"automation"
|
|
14
15
|
],
|
|
15
16
|
"type": "module",
|
|
16
17
|
"license": "GPL-3.0-or-later",
|
|
@@ -37,6 +38,7 @@
|
|
|
37
38
|
"docs",
|
|
38
39
|
"scripts",
|
|
39
40
|
"cordis.patch.yml",
|
|
41
|
+
"screenshots.json",
|
|
40
42
|
"README.md",
|
|
41
43
|
"LICENSE"
|
|
42
44
|
],
|
|
@@ -52,18 +54,6 @@
|
|
|
52
54
|
"patch": "./cordis.patch.yml"
|
|
53
55
|
}
|
|
54
56
|
},
|
|
55
|
-
"peerDependencies": {
|
|
56
|
-
"@deepseek-ai/dsh-client-ui": "*",
|
|
57
|
-
"@deepseek-ai/dsh-tools": "*"
|
|
58
|
-
},
|
|
59
|
-
"peerDependenciesMeta": {
|
|
60
|
-
"@deepseek-ai/dsh-client-ui": {
|
|
61
|
-
"optional": true
|
|
62
|
-
},
|
|
63
|
-
"@deepseek-ai/dsh-tools": {
|
|
64
|
-
"optional": true
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
57
|
"author": {
|
|
68
58
|
"name": "lizi600jin"
|
|
69
59
|
},
|
package/screenshots.json
ADDED
package/src/core/index.mjs
CHANGED
|
@@ -49,7 +49,15 @@ export {
|
|
|
49
49
|
DEFAULT_ANCHORS,
|
|
50
50
|
} from './calibrate.mjs'
|
|
51
51
|
|
|
52
|
-
export {
|
|
52
|
+
export {
|
|
53
|
+
pushConfig,
|
|
54
|
+
pushConfigMany,
|
|
55
|
+
queryDevice,
|
|
56
|
+
parseScript,
|
|
57
|
+
waitForOutput,
|
|
58
|
+
waitForOspfFull,
|
|
59
|
+
waitForOspfRoute,
|
|
60
|
+
} from './provision.mjs'
|
|
53
61
|
|
|
54
62
|
export {
|
|
55
63
|
SCENARIOS,
|