ciscollm-cli 1.0.8 → 1.0.10
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/dist/core/agent/AgentLoop.d.ts +2 -0
- package/dist/core/agent/AgentLoop.js +42 -2
- package/dist/core/agent/AgentLoop.js.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/llm/LLMClient.js +33 -0
- package/dist/infrastructure/llm/LLMClient.js.map +1 -1
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.js +257 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/shell-simulator.d.ts +43 -0
- package/dist/server/shell-simulator.js +562 -0
- package/dist/server/shell-simulator.js.map +1 -0
- package/dist/server/ssh.d.ts +2 -0
- package/dist/server/ssh.js +214 -0
- package/dist/server/ssh.js.map +1 -0
- package/dist/server/telnet.d.ts +2 -0
- package/dist/server/telnet.js +167 -0
- package/dist/server/telnet.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,562 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ShellSimulator = void 0;
|
|
4
|
+
class ShellSimulator {
|
|
5
|
+
hostname = 'Switch1';
|
|
6
|
+
mode = 'PRIVILEGED_EXEC';
|
|
7
|
+
activeInterface = null;
|
|
8
|
+
interfaces = new Map([
|
|
9
|
+
['GigabitEthernet0/0', {
|
|
10
|
+
name: 'GigabitEthernet0/0',
|
|
11
|
+
ip: '192.168.1.254',
|
|
12
|
+
subnet: '255.255.255.0',
|
|
13
|
+
adminShutdown: false,
|
|
14
|
+
lineProtocolUp: true,
|
|
15
|
+
description: 'Management Uplink'
|
|
16
|
+
}],
|
|
17
|
+
['GigabitEthernet0/1', {
|
|
18
|
+
name: 'GigabitEthernet0/1',
|
|
19
|
+
ip: null,
|
|
20
|
+
subnet: null,
|
|
21
|
+
adminShutdown: true,
|
|
22
|
+
lineProtocolUp: false,
|
|
23
|
+
description: null
|
|
24
|
+
}],
|
|
25
|
+
['GigabitEthernet0/2', {
|
|
26
|
+
name: 'GigabitEthernet0/2',
|
|
27
|
+
ip: null,
|
|
28
|
+
subnet: null,
|
|
29
|
+
adminShutdown: true,
|
|
30
|
+
lineProtocolUp: false,
|
|
31
|
+
description: null
|
|
32
|
+
}]
|
|
33
|
+
]);
|
|
34
|
+
vlans = new Set([1]);
|
|
35
|
+
vlanNames = new Map([[1, 'default']]);
|
|
36
|
+
activeVlan = null;
|
|
37
|
+
routes = [
|
|
38
|
+
{
|
|
39
|
+
network: '192.168.1.0',
|
|
40
|
+
mask: '255.255.255.0',
|
|
41
|
+
nextHop: null,
|
|
42
|
+
outgoingInterface: 'GigabitEthernet0/0',
|
|
43
|
+
connected: true
|
|
44
|
+
}
|
|
45
|
+
];
|
|
46
|
+
shellEnabled = false;
|
|
47
|
+
shellVariables = {};
|
|
48
|
+
shellFunctions = {};
|
|
49
|
+
ospfEnabled = false;
|
|
50
|
+
ospfProcessId = null;
|
|
51
|
+
ipRoutingEnabled = true;
|
|
52
|
+
flashFiles = new Set(['c2960-lanbasek9-mz.150-2.SE4.bin']);
|
|
53
|
+
pendingCopyDest = null;
|
|
54
|
+
backupState = null;
|
|
55
|
+
saveBackupState() {
|
|
56
|
+
const interfacesCopy = new Map();
|
|
57
|
+
for (const [name, val] of this.interfaces.entries()) {
|
|
58
|
+
interfacesCopy.set(name, { ...val });
|
|
59
|
+
}
|
|
60
|
+
const routesCopy = this.routes.map(r => ({ ...r }));
|
|
61
|
+
const vlansCopy = new Set(this.vlans);
|
|
62
|
+
const vlanNamesCopy = new Map(this.vlanNames);
|
|
63
|
+
this.backupState = {
|
|
64
|
+
hostname: this.hostname,
|
|
65
|
+
interfaces: interfacesCopy,
|
|
66
|
+
routes: routesCopy,
|
|
67
|
+
vlans: vlansCopy,
|
|
68
|
+
vlanNames: vlanNamesCopy
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
restoreBackupState() {
|
|
72
|
+
if (!this.backupState)
|
|
73
|
+
return;
|
|
74
|
+
this.hostname = this.backupState.hostname;
|
|
75
|
+
this.interfaces = this.backupState.interfaces;
|
|
76
|
+
this.routes = this.backupState.routes;
|
|
77
|
+
this.vlans = this.backupState.vlans;
|
|
78
|
+
this.vlanNames = this.backupState.vlanNames;
|
|
79
|
+
}
|
|
80
|
+
constructor(initialHostname) {
|
|
81
|
+
if (initialHostname) {
|
|
82
|
+
this.hostname = initialHostname;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
getPrompt() {
|
|
86
|
+
switch (this.mode) {
|
|
87
|
+
case 'USER_EXEC':
|
|
88
|
+
return `${this.hostname}> `;
|
|
89
|
+
case 'PRIVILEGED_EXEC':
|
|
90
|
+
return `${this.hostname}# `;
|
|
91
|
+
case 'GLOBAL_CONFIG':
|
|
92
|
+
return `${this.hostname}(config)# `;
|
|
93
|
+
case 'INTERFACE_CONFIG':
|
|
94
|
+
return `${this.hostname}(config-if)# `;
|
|
95
|
+
case 'OSPF_CONFIG':
|
|
96
|
+
return `${this.hostname}(config-router)# `;
|
|
97
|
+
case 'DHCP_CONFIG':
|
|
98
|
+
return `${this.hostname}(config-dhcp)# `;
|
|
99
|
+
case 'ACL_CONFIG':
|
|
100
|
+
return `${this.hostname}(config-ext-nacl)# `;
|
|
101
|
+
default:
|
|
102
|
+
return `${this.hostname}# `;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
execute(line) {
|
|
106
|
+
const trimmed = line.trim();
|
|
107
|
+
if (this.pendingCopyDest) {
|
|
108
|
+
const dest = trimmed || this.pendingCopyDest;
|
|
109
|
+
this.flashFiles.add(dest);
|
|
110
|
+
this.saveBackupState();
|
|
111
|
+
this.pendingCopyDest = null;
|
|
112
|
+
return `1542 bytes copied in 0.456 secs (3381 bytes/sec)\n[OK]`;
|
|
113
|
+
}
|
|
114
|
+
if (!trimmed)
|
|
115
|
+
return '';
|
|
116
|
+
if (this.shellEnabled) {
|
|
117
|
+
const varMatch = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/);
|
|
118
|
+
if (varMatch) {
|
|
119
|
+
const [, name, val] = varMatch;
|
|
120
|
+
this.shellVariables[name] = val;
|
|
121
|
+
return '';
|
|
122
|
+
}
|
|
123
|
+
const funcMatch = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\(\)\s*{(.*)}$/);
|
|
124
|
+
if (funcMatch) {
|
|
125
|
+
const [, name, body] = funcMatch;
|
|
126
|
+
this.shellFunctions[name] = body.trim();
|
|
127
|
+
return '';
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
let commandToExecute = trimmed;
|
|
131
|
+
const tempArgs = commandToExecute.split(/\s+/);
|
|
132
|
+
const tempCmd = tempArgs[0].toLowerCase();
|
|
133
|
+
const isConfigMode = this.mode !== 'USER_EXEC' && this.mode !== 'PRIVILEGED_EXEC';
|
|
134
|
+
if (tempCmd === 'do' && isConfigMode) {
|
|
135
|
+
const doMatch = commandToExecute.match(/^do\s+(.+)$/i);
|
|
136
|
+
if (doMatch) {
|
|
137
|
+
commandToExecute = doMatch[1];
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const args = commandToExecute.split(/\s+/);
|
|
141
|
+
const cmd = args[0].toLowerCase();
|
|
142
|
+
if (cmd === 'exit') {
|
|
143
|
+
if (this.mode === 'INTERFACE_CONFIG' || this.mode === 'OSPF_CONFIG' || this.mode === 'DHCP_CONFIG' || this.mode === 'ACL_CONFIG') {
|
|
144
|
+
this.mode = 'GLOBAL_CONFIG';
|
|
145
|
+
this.activeInterface = null;
|
|
146
|
+
this.activeVlan = null;
|
|
147
|
+
return '';
|
|
148
|
+
}
|
|
149
|
+
else if (this.mode === 'GLOBAL_CONFIG') {
|
|
150
|
+
this.mode = 'PRIVILEGED_EXEC';
|
|
151
|
+
return '';
|
|
152
|
+
}
|
|
153
|
+
else if (this.mode === 'PRIVILEGED_EXEC') {
|
|
154
|
+
this.mode = 'USER_EXEC';
|
|
155
|
+
return '';
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
return 'exit';
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (cmd === 'end') {
|
|
162
|
+
if (this.mode !== 'USER_EXEC' && this.mode !== 'PRIVILEGED_EXEC') {
|
|
163
|
+
this.mode = 'PRIVILEGED_EXEC';
|
|
164
|
+
this.activeInterface = null;
|
|
165
|
+
this.activeVlan = null;
|
|
166
|
+
return '';
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (cmd === 'enable') {
|
|
170
|
+
if (this.mode === 'USER_EXEC') {
|
|
171
|
+
this.mode = 'PRIVILEGED_EXEC';
|
|
172
|
+
return '';
|
|
173
|
+
}
|
|
174
|
+
return '';
|
|
175
|
+
}
|
|
176
|
+
if (cmd === 'disable') {
|
|
177
|
+
if (this.mode !== 'USER_EXEC') {
|
|
178
|
+
this.mode = 'USER_EXEC';
|
|
179
|
+
return '';
|
|
180
|
+
}
|
|
181
|
+
return '';
|
|
182
|
+
}
|
|
183
|
+
if (trimmed.toLowerCase() === 'configure terminal' || trimmed.toLowerCase() === 'conf t') {
|
|
184
|
+
if (this.mode === 'PRIVILEGED_EXEC') {
|
|
185
|
+
this.mode = 'GLOBAL_CONFIG';
|
|
186
|
+
return 'Enter configuration commands, one per line. End with CNTL/Z.\n';
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
return `% Command rejected: Place in Privileged EXEC mode first.`;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (cmd === 'terminal' && args[1] === 'length' && args[2] === '0') {
|
|
193
|
+
return '';
|
|
194
|
+
}
|
|
195
|
+
if (cmd === 'screen-length' && args[1] === '0' && args[2] === 'temporary') {
|
|
196
|
+
return '';
|
|
197
|
+
}
|
|
198
|
+
if (cmd === 'set' && args[1] === 'cli' && args[2] === 'screen-length' && args[3] === '0') {
|
|
199
|
+
return '';
|
|
200
|
+
}
|
|
201
|
+
if (cmd === 'terminal' && args[1] === 'shell') {
|
|
202
|
+
this.shellEnabled = true;
|
|
203
|
+
return '';
|
|
204
|
+
}
|
|
205
|
+
if (cmd === 'shell' && args[1] === 'processing' && args[2] === 'full') {
|
|
206
|
+
this.shellEnabled = true;
|
|
207
|
+
return '';
|
|
208
|
+
}
|
|
209
|
+
if (this.mode === 'GLOBAL_CONFIG') {
|
|
210
|
+
if (cmd === 'hostname' && args[1]) {
|
|
211
|
+
this.hostname = args[1];
|
|
212
|
+
return '';
|
|
213
|
+
}
|
|
214
|
+
if (cmd === 'interface' && args[1]) {
|
|
215
|
+
const ifaceName = this.normalizeInterfaceName(args[1]);
|
|
216
|
+
this.mode = 'INTERFACE_CONFIG';
|
|
217
|
+
this.activeInterface = ifaceName;
|
|
218
|
+
if (!this.interfaces.has(ifaceName)) {
|
|
219
|
+
this.interfaces.set(ifaceName, {
|
|
220
|
+
name: ifaceName,
|
|
221
|
+
ip: null,
|
|
222
|
+
subnet: null,
|
|
223
|
+
adminShutdown: false,
|
|
224
|
+
lineProtocolUp: true,
|
|
225
|
+
description: null
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return '';
|
|
229
|
+
}
|
|
230
|
+
if (cmd === 'vlan' && args[1]) {
|
|
231
|
+
const vlanId = parseInt(args[1], 10);
|
|
232
|
+
if (!isNaN(vlanId)) {
|
|
233
|
+
this.vlans.add(vlanId);
|
|
234
|
+
this.activeVlan = vlanId;
|
|
235
|
+
this.mode = 'GLOBAL_CONFIG';
|
|
236
|
+
return '';
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (cmd === 'no' && args[1] === 'vlan' && args[2]) {
|
|
240
|
+
const vlanId = parseInt(args[2], 10);
|
|
241
|
+
if (!isNaN(vlanId)) {
|
|
242
|
+
this.vlans.delete(vlanId);
|
|
243
|
+
this.vlanNames.delete(vlanId);
|
|
244
|
+
return '';
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (cmd === 'ip' && args[1] === 'route' && args[2] && args[3]) {
|
|
248
|
+
const network = args[2];
|
|
249
|
+
const mask = args[3];
|
|
250
|
+
const next = args[4] || null;
|
|
251
|
+
this.routes.push({
|
|
252
|
+
network,
|
|
253
|
+
mask,
|
|
254
|
+
nextHop: next && !next.startsWith('Gig') && !next.startsWith('Loop') ? next : null,
|
|
255
|
+
outgoingInterface: next && (next.startsWith('Gig') || next.startsWith('Loop')) ? next : null,
|
|
256
|
+
connected: false
|
|
257
|
+
});
|
|
258
|
+
return '';
|
|
259
|
+
}
|
|
260
|
+
if (cmd === 'no' && args[1] === 'ip' && args[2] === 'route' && args[3] && args[4]) {
|
|
261
|
+
const network = args[3];
|
|
262
|
+
const mask = args[4];
|
|
263
|
+
this.routes = this.routes.filter(r => !(r.network === network && r.mask === mask));
|
|
264
|
+
return '';
|
|
265
|
+
}
|
|
266
|
+
if (cmd === 'ip' && args[1] === 'routing') {
|
|
267
|
+
this.ipRoutingEnabled = true;
|
|
268
|
+
return '';
|
|
269
|
+
}
|
|
270
|
+
if (cmd === 'no' && args[1] === 'ip' && args[2] === 'routing') {
|
|
271
|
+
this.ipRoutingEnabled = false;
|
|
272
|
+
return '';
|
|
273
|
+
}
|
|
274
|
+
if (cmd === 'router' && args[1] === 'ospf') {
|
|
275
|
+
this.mode = 'OSPF_CONFIG';
|
|
276
|
+
this.ospfProcessId = args[2] || null;
|
|
277
|
+
this.ospfEnabled = true;
|
|
278
|
+
return '';
|
|
279
|
+
}
|
|
280
|
+
if (cmd === 'no' && args[1] === 'router' && args[2] === 'ospf') {
|
|
281
|
+
this.ospfEnabled = false;
|
|
282
|
+
this.ospfProcessId = null;
|
|
283
|
+
return '';
|
|
284
|
+
}
|
|
285
|
+
if (cmd === 'ip' && args[1] === 'dhcp' && args[2] === 'pool' && args[3]) {
|
|
286
|
+
this.mode = 'DHCP_CONFIG';
|
|
287
|
+
return '';
|
|
288
|
+
}
|
|
289
|
+
if (cmd === 'ip' && args[1] === 'dhcp' && args[2] === 'excluded-address') {
|
|
290
|
+
return '';
|
|
291
|
+
}
|
|
292
|
+
if (cmd === 'ip' && args[1] === 'access-list') {
|
|
293
|
+
this.mode = 'ACL_CONFIG';
|
|
294
|
+
return '';
|
|
295
|
+
}
|
|
296
|
+
if (cmd === 'access-list') {
|
|
297
|
+
return '';
|
|
298
|
+
}
|
|
299
|
+
return `% Invalid input detected at '^' marker.`;
|
|
300
|
+
}
|
|
301
|
+
if (this.mode === 'INTERFACE_CONFIG' && this.activeInterface) {
|
|
302
|
+
const iface = this.interfaces.get(this.activeInterface);
|
|
303
|
+
if (cmd === 'shutdown') {
|
|
304
|
+
iface.adminShutdown = true;
|
|
305
|
+
iface.lineProtocolUp = false;
|
|
306
|
+
return '';
|
|
307
|
+
}
|
|
308
|
+
if (cmd === 'no' && args[1] === 'shutdown') {
|
|
309
|
+
iface.adminShutdown = false;
|
|
310
|
+
iface.lineProtocolUp = true;
|
|
311
|
+
return '';
|
|
312
|
+
}
|
|
313
|
+
if (cmd === 'ip' && args[1] === 'address' && args[2] && args[3]) {
|
|
314
|
+
iface.ip = args[2];
|
|
315
|
+
iface.subnet = args[3];
|
|
316
|
+
const network = this.calculateNetwork(args[2], args[3]);
|
|
317
|
+
this.routes = this.routes.filter(r => !(r.outgoingInterface === this.activeInterface && r.connected));
|
|
318
|
+
this.routes.push({
|
|
319
|
+
network,
|
|
320
|
+
mask: args[3],
|
|
321
|
+
nextHop: null,
|
|
322
|
+
outgoingInterface: this.activeInterface,
|
|
323
|
+
connected: true
|
|
324
|
+
});
|
|
325
|
+
return '';
|
|
326
|
+
}
|
|
327
|
+
if (cmd === 'no' && args[1] === 'ip' && args[2] === 'address') {
|
|
328
|
+
iface.ip = null;
|
|
329
|
+
iface.subnet = null;
|
|
330
|
+
this.routes = this.routes.filter(r => !(r.outgoingInterface === this.activeInterface && r.connected));
|
|
331
|
+
return '';
|
|
332
|
+
}
|
|
333
|
+
if (cmd === 'description') {
|
|
334
|
+
iface.description = args.slice(1).join(' ');
|
|
335
|
+
return '';
|
|
336
|
+
}
|
|
337
|
+
if (cmd === 'no' && args[1] === 'description') {
|
|
338
|
+
iface.description = null;
|
|
339
|
+
return '';
|
|
340
|
+
}
|
|
341
|
+
if (cmd === 'ip' && args[1] === 'access-group') {
|
|
342
|
+
return '';
|
|
343
|
+
}
|
|
344
|
+
if (cmd === 'ip' && args[1] === 'ospf') {
|
|
345
|
+
return '';
|
|
346
|
+
}
|
|
347
|
+
return `% Invalid input detected at '^' marker.`;
|
|
348
|
+
}
|
|
349
|
+
if (this.mode === 'OSPF_CONFIG') {
|
|
350
|
+
if (cmd === 'network' || cmd === 'router-id') {
|
|
351
|
+
return '';
|
|
352
|
+
}
|
|
353
|
+
if (cmd === 'passive-interface' || (cmd === 'no' && args[1] === 'passive-interface')) {
|
|
354
|
+
return '';
|
|
355
|
+
}
|
|
356
|
+
return `% Invalid input detected at '^' marker.`;
|
|
357
|
+
}
|
|
358
|
+
if (this.mode === 'DHCP_CONFIG') {
|
|
359
|
+
if (cmd === 'network' || cmd === 'default-router' || cmd === 'dns-server') {
|
|
360
|
+
return '';
|
|
361
|
+
}
|
|
362
|
+
return `% Invalid input detected at '^' marker.`;
|
|
363
|
+
}
|
|
364
|
+
if (this.mode === 'ACL_CONFIG') {
|
|
365
|
+
if (cmd === 'permit' || cmd === 'deny') {
|
|
366
|
+
return '';
|
|
367
|
+
}
|
|
368
|
+
return `% Invalid input detected at '^' marker.`;
|
|
369
|
+
}
|
|
370
|
+
const isShow = cmd === 'show' || cmd === 'sh' || (cmd === 'do' && (args[1]?.toLowerCase() === 'show' || args[1]?.toLowerCase() === 'sh'));
|
|
371
|
+
if (isShow) {
|
|
372
|
+
const showArgs = cmd === 'do' ? args.slice(2) : args.slice(1);
|
|
373
|
+
const showCmd = showArgs[0]?.toLowerCase();
|
|
374
|
+
if (showCmd === 'version' || showCmd === 'ver') {
|
|
375
|
+
return `Cisco IOS Software, C2960 Software (C2960-LANBASEK9-M), Version 15.0(2)SE4, RELEASE SOFTWARE (fc1)
|
|
376
|
+
Technical Support: http://www.cisco.com/techsupport
|
|
377
|
+
Copyright (c) 1986-2013 by Cisco Systems, Inc.
|
|
378
|
+
Compiled Wed 26-Jun-13 02:49 by prod_rel_team
|
|
379
|
+
|
|
380
|
+
ROM: Bootstrap program is 12.2(44)SE Version
|
|
381
|
+
BOOTLDR: C2960 Boot Loader (C2960-HBOOT-M) Version 12.2(44)SE, RELEASE SOFTWARE (fc1)
|
|
382
|
+
|
|
383
|
+
Switch1 uptime is 2 hours, 15 minutes
|
|
384
|
+
System returned to ROM by power-on
|
|
385
|
+
System image file is "flash:/c2960-lanbasek9-mz.150-2.SE4.bin"
|
|
386
|
+
|
|
387
|
+
This product contains cryptographic features and is subject to Y...
|
|
388
|
+
`;
|
|
389
|
+
}
|
|
390
|
+
if (showCmd === 'ip' && showArgs[1]?.startsWith('int') && showArgs[2]?.startsWith('br')) {
|
|
391
|
+
let out = 'Interface IP-Address OK? Method Status Protocol\n';
|
|
392
|
+
for (const [name, status] of this.interfaces.entries()) {
|
|
393
|
+
const ip = status.ip || 'unassigned';
|
|
394
|
+
const method = status.ip ? 'manual' : 'unset';
|
|
395
|
+
const adminStatus = status.adminShutdown ? 'administratively down' : 'up';
|
|
396
|
+
const protocolStatus = status.lineProtocolUp ? 'up' : 'down';
|
|
397
|
+
out += `${name.padEnd(26)} ${ip.padEnd(15)} YES ${method.padEnd(6)} ${adminStatus.padEnd(21)} ${protocolStatus}\n`;
|
|
398
|
+
}
|
|
399
|
+
return out;
|
|
400
|
+
}
|
|
401
|
+
if (showCmd?.startsWith('run')) {
|
|
402
|
+
let out = `Building configuration...\n\nCurrent configuration : 1542 bytes\n!\nversion 15.0\n!\nhostname ${this.hostname}\n!\n`;
|
|
403
|
+
for (const [name, status] of this.interfaces.entries()) {
|
|
404
|
+
out += `interface ${name}\n`;
|
|
405
|
+
if (status.description) {
|
|
406
|
+
out += ` description ${status.description}\n`;
|
|
407
|
+
}
|
|
408
|
+
if (status.ip) {
|
|
409
|
+
out += ` ip address ${status.ip} ${status.subnet}\n`;
|
|
410
|
+
}
|
|
411
|
+
if (status.adminShutdown) {
|
|
412
|
+
out += ` shutdown\n`;
|
|
413
|
+
}
|
|
414
|
+
out += `!\n`;
|
|
415
|
+
}
|
|
416
|
+
for (const r of this.routes) {
|
|
417
|
+
if (!r.connected) {
|
|
418
|
+
out += `ip route ${r.network} ${r.mask} ${r.nextHop || r.outgoingInterface}\n`;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
out += `!\nend\n`;
|
|
422
|
+
return out;
|
|
423
|
+
}
|
|
424
|
+
if (showCmd === 'ip' && showArgs[1]?.startsWith('ro')) {
|
|
425
|
+
if (!this.ipRoutingEnabled) {
|
|
426
|
+
return '% IP routing table is not enabled';
|
|
427
|
+
}
|
|
428
|
+
let out = `Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP\n\n`;
|
|
429
|
+
out += `Gateway of last resort is not set\n\n`;
|
|
430
|
+
for (const r of this.routes) {
|
|
431
|
+
const code = r.connected ? 'C' : 'S';
|
|
432
|
+
const target = r.nextHop ? `via ${r.nextHop}` : `directly connected, ${r.outgoingInterface || 'Null0'}`;
|
|
433
|
+
out += `${code} ${r.network}/${this.getPrefixLength(r.mask)} is ${target}\n`;
|
|
434
|
+
}
|
|
435
|
+
return out;
|
|
436
|
+
}
|
|
437
|
+
if (showCmd === 'ip' && showArgs[1] === 'ospf' && showArgs[2]?.startsWith('ne')) {
|
|
438
|
+
if (!this.ospfEnabled) {
|
|
439
|
+
return '% OSPF is not enabled';
|
|
440
|
+
}
|
|
441
|
+
return `Neighbor ID Pri State Dead Time Address Interface\n` +
|
|
442
|
+
`2.2.2.2 1 FULL/DR 00:00:35 192.168.1.2 GigabitEthernet0/0\n`;
|
|
443
|
+
}
|
|
444
|
+
if (showCmd === 'ip' && showArgs[1] === 'ospf' && showArgs[2]?.startsWith('in')) {
|
|
445
|
+
if (!this.ospfEnabled) {
|
|
446
|
+
return '% OSPF is not enabled';
|
|
447
|
+
}
|
|
448
|
+
return `GigabitEthernet0/0 is up, line protocol is up \n` +
|
|
449
|
+
` Internet Address 192.168.1.254/24, Area 0 \n` +
|
|
450
|
+
` Process ID ${this.ospfProcessId || '10'}, Router ID 192.168.1.254, Network Type BROADCAST, Cost: 1\n`;
|
|
451
|
+
}
|
|
452
|
+
if (showCmd === 'ip' && showArgs[1] === 'ospf' && !showArgs[2]) {
|
|
453
|
+
if (!this.ospfEnabled) {
|
|
454
|
+
return '% OSPF is not enabled';
|
|
455
|
+
}
|
|
456
|
+
return ` Routing Process "ospf ${this.ospfProcessId || '10'}" with ID 192.168.1.254\n` +
|
|
457
|
+
` Supports only single TOS(TOS0) routes\n` +
|
|
458
|
+
` Supports opaque LSA\n`;
|
|
459
|
+
}
|
|
460
|
+
if (showCmd?.startsWith('vl') && (showArgs[1]?.startsWith('br') || !showArgs[1])) {
|
|
461
|
+
let out = 'VLAN Name Status Ports\n';
|
|
462
|
+
out += '---- -------------------------------- --------- -------------------------------\n';
|
|
463
|
+
for (const vid of this.vlans) {
|
|
464
|
+
const name = this.vlanNames.get(vid) || `VLAN${vid.toString().padStart(4, '0')}`;
|
|
465
|
+
out += `${vid.toString().padEnd(4)} ${name.padEnd(32)} active \n`;
|
|
466
|
+
}
|
|
467
|
+
return out;
|
|
468
|
+
}
|
|
469
|
+
if (showCmd === 'cdp' && showArgs[1]?.startsWith('ne')) {
|
|
470
|
+
return `Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
|
|
471
|
+
S - Switch, H - Host, I - IGMP, r - Repeater, P - Phone
|
|
472
|
+
|
|
473
|
+
Device ID Local Intrfce Holdtme Capability Platform Port ID
|
|
474
|
+
Switch2 Gig 0/1 125 S I WS-C2960- Gig 0/1
|
|
475
|
+
`;
|
|
476
|
+
}
|
|
477
|
+
if (showCmd === 'lldp' && showArgs[1]?.startsWith('ne')) {
|
|
478
|
+
return `Device ID Local Intf Hold-time Capability Port ID
|
|
479
|
+
Switch2 Gi0/1 120 S Gi0/1
|
|
480
|
+
Total entries displayed: 1
|
|
481
|
+
`;
|
|
482
|
+
}
|
|
483
|
+
return `% Unrecognized show command: show ${showArgs.join(' ')}`;
|
|
484
|
+
}
|
|
485
|
+
if (cmd === 'write' || cmd === 'wr') {
|
|
486
|
+
return `Building configuration...\n[OK]`;
|
|
487
|
+
}
|
|
488
|
+
if (cmd === 'copy' && args[1]?.startsWith('run') && args[2]?.startsWith('sta')) {
|
|
489
|
+
return `Destination filename [startup-config]? \nBuilding configuration...\n[OK]`;
|
|
490
|
+
}
|
|
491
|
+
if (cmd === 'copy' && args[1]?.startsWith('run') && args[2]?.startsWith('flash:')) {
|
|
492
|
+
const destFile = args[2].replace(/^flash:/i, '');
|
|
493
|
+
this.pendingCopyDest = destFile || 'backup-agent.cfg';
|
|
494
|
+
return `Destination filename [${this.pendingCopyDest}]? `;
|
|
495
|
+
}
|
|
496
|
+
if (cmd === 'dir' && args[1] === 'flash:') {
|
|
497
|
+
let out = `Directory of flash:/\n\n`;
|
|
498
|
+
let index = 1;
|
|
499
|
+
let totalBytesUsed = 0;
|
|
500
|
+
out += ` ${index++} -rw- 4414921 Mar 01 1993 00:02:18 +00:00 c2960-lanbasek9-mz.150-2.SE4.bin\n`;
|
|
501
|
+
totalBytesUsed += 4414921;
|
|
502
|
+
if (this.flashFiles.has('backup-agent.cfg')) {
|
|
503
|
+
out += ` ${index++} -rw- 1542 May 31 2026 12:24:17 +00:00 backup-agent.cfg\n`;
|
|
504
|
+
totalBytesUsed += 1542;
|
|
505
|
+
}
|
|
506
|
+
const totalBytes = 32514048;
|
|
507
|
+
const freeBytes = totalBytes - totalBytesUsed;
|
|
508
|
+
out += `\n${totalBytes} bytes total (${freeBytes} bytes free)\n`;
|
|
509
|
+
return out;
|
|
510
|
+
}
|
|
511
|
+
if (cmd === 'configure' && args[1] === 'replace' && args[2]?.startsWith('flash:')) {
|
|
512
|
+
const file = args[2].replace(/^flash:/i, '');
|
|
513
|
+
if (!this.flashFiles.has(file)) {
|
|
514
|
+
return `% Error opening flash:${file} (No such file or directory)`;
|
|
515
|
+
}
|
|
516
|
+
this.restoreBackupState();
|
|
517
|
+
return `Total number of passes: 1\nRollback Done\n`;
|
|
518
|
+
}
|
|
519
|
+
if (cmd === 'ping' && args[1]) {
|
|
520
|
+
const ip = args[1];
|
|
521
|
+
return `Sending 5, 100-byte ICMP Echos to ${ip}, timeout is 2 seconds:
|
|
522
|
+
!!!!!
|
|
523
|
+
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/4 ms
|
|
524
|
+
`;
|
|
525
|
+
}
|
|
526
|
+
return `% Unrecognized command: ${trimmed}`;
|
|
527
|
+
}
|
|
528
|
+
normalizeInterfaceName(name) {
|
|
529
|
+
const lower = name.toLowerCase();
|
|
530
|
+
if (lower.startsWith('gi')) {
|
|
531
|
+
return 'GigabitEthernet' + name.substring(2);
|
|
532
|
+
}
|
|
533
|
+
if (lower.startsWith('lo')) {
|
|
534
|
+
return 'Loopback' + name.substring(2);
|
|
535
|
+
}
|
|
536
|
+
if (lower.startsWith('fa')) {
|
|
537
|
+
return 'FastEthernet' + name.substring(2);
|
|
538
|
+
}
|
|
539
|
+
return name;
|
|
540
|
+
}
|
|
541
|
+
getPrefixLength(mask) {
|
|
542
|
+
const parts = mask.split('.').map(Number);
|
|
543
|
+
let len = 0;
|
|
544
|
+
for (const p of parts) {
|
|
545
|
+
let b = p;
|
|
546
|
+
while (b > 0) {
|
|
547
|
+
if (b & 1)
|
|
548
|
+
len++;
|
|
549
|
+
b = b >> 1;
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
return len;
|
|
553
|
+
}
|
|
554
|
+
calculateNetwork(ip, mask) {
|
|
555
|
+
const ipParts = ip.split('.').map(Number);
|
|
556
|
+
const maskParts = mask.split('.').map(Number);
|
|
557
|
+
const netParts = ipParts.map((p, i) => p & maskParts[i]);
|
|
558
|
+
return netParts.join('.');
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
exports.ShellSimulator = ShellSimulator;
|
|
562
|
+
//# sourceMappingURL=shell-simulator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-simulator.js","sourceRoot":"","sources":["../../src/server/shell-simulator.ts"],"names":[],"mappings":"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"}
|