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.
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startSshServer = startSshServer;
4
+ const ssh2_1 = require("ssh2");
5
+ const crypto_1 = require("crypto");
6
+ const shell_simulator_1 = require("./shell-simulator");
7
+ const { privateKey } = (0, crypto_1.generateKeyPairSync)('rsa', {
8
+ modulusLength: 2048,
9
+ publicKeyEncoding: { type: 'spki', format: 'pem' },
10
+ privateKeyEncoding: { type: 'pkcs1', format: 'pem' }
11
+ });
12
+ function startSshServer(port, onLog) {
13
+ const server = new ssh2_1.Server({
14
+ hostKeys: [privateKey]
15
+ }, (client) => {
16
+ let username = '';
17
+ client.on('authentication', (ctx) => {
18
+ username = ctx.username;
19
+ onLog(`SSH Auth attempt: User "${ctx.username}" via method "${ctx.method}"`);
20
+ ctx.accept();
21
+ });
22
+ client.on('ready', () => {
23
+ onLog(`SSH Client ready: "${username}"`);
24
+ client.on('session', (accept, reject) => {
25
+ const session = accept();
26
+ session.on('pty', (accept, reject, info) => {
27
+ accept();
28
+ });
29
+ session.on('shell', (accept, reject) => {
30
+ const channel = accept();
31
+ onLog(`SSH Session: Shell channel opened for "${username}"`);
32
+ const simulator = new shell_simulator_1.ShellSimulator();
33
+ let lineBuffer = '';
34
+ let lastWasCr = false;
35
+ const welcomeBanner = `\r\nCisco IOS Software, C2960 Software (C2960-LANBASEK9-M), Version 15.0(2)SE4, RELEASE SOFTWARE (fc1)\r\nTechnical Support: http://www.cisco.com/techsupport\r\nCopyright (c) 1986-2013 by Cisco Systems, Inc.\r\nCompiled Wed 26-Jun-13 02:49 by prod_rel_team\r\n\r\n`;
36
+ channel.write(welcomeBanner + simulator.getPrompt());
37
+ const handleLine = () => {
38
+ channel.write('\r\n');
39
+ const cmd = lineBuffer.trim();
40
+ lineBuffer = '';
41
+ if (cmd.toLowerCase() === 'exit' && simulator.mode === 'USER_EXEC') {
42
+ channel.write('Connection closed by foreign host.\r\n');
43
+ channel.end();
44
+ return;
45
+ }
46
+ try {
47
+ const output = simulator.execute(cmd);
48
+ if (output) {
49
+ channel.write(output.replace(/\n/g, '\r\n') + '\r\n');
50
+ }
51
+ }
52
+ catch (err) {
53
+ channel.write(`% Error: ${err.message}\r\n`);
54
+ }
55
+ channel.write(simulator.getPrompt());
56
+ };
57
+ channel.on('data', (data) => {
58
+ const input = data.toString('utf8');
59
+ for (let i = 0; i < input.length; i++) {
60
+ const char = input.charCodeAt(i);
61
+ if (char === 13) {
62
+ lastWasCr = true;
63
+ handleLine();
64
+ }
65
+ else if (char === 10) {
66
+ if (lastWasCr) {
67
+ lastWasCr = false;
68
+ continue;
69
+ }
70
+ handleLine();
71
+ }
72
+ else if (char === 127 || char === 8) {
73
+ lastWasCr = false;
74
+ if (lineBuffer.length > 0) {
75
+ lineBuffer = lineBuffer.slice(0, -1);
76
+ channel.write('\b \b');
77
+ }
78
+ }
79
+ else if (char === 3) {
80
+ lastWasCr = false;
81
+ channel.write('^C\r\n');
82
+ lineBuffer = '';
83
+ channel.write(simulator.getPrompt());
84
+ }
85
+ else {
86
+ lastWasCr = false;
87
+ const rawChar = input[i];
88
+ lineBuffer += rawChar;
89
+ channel.write(rawChar);
90
+ }
91
+ }
92
+ });
93
+ channel.on('close', () => {
94
+ onLog(`SSH Session: Shell channel closed for "${username}"`);
95
+ });
96
+ });
97
+ session.on('subsystem', (accept, reject, info) => {
98
+ if (info.name === 'netconf') {
99
+ const channel = accept();
100
+ onLog(`SSH Session: NETCONF subsystem opened for "${username}"`);
101
+ let buffer = '';
102
+ let framing = '1.0';
103
+ const helloMsg = `<?xml version="1.0" encoding="UTF-8"?>
104
+ <hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
105
+ <capabilities>
106
+ <capability>urn:ietf:params:xml:ns:netconf:base:1.0</capability>
107
+ <capability>urn:ietf:params:netconf:base:1.1</capability>
108
+ </capabilities>
109
+ <session-id>42</session-id>
110
+ </hello>]]>]]>`;
111
+ channel.write(helloMsg);
112
+ channel.on('data', (data) => {
113
+ buffer += data.toString('utf8');
114
+ while (true) {
115
+ if (framing === '1.0') {
116
+ const delim = ']]>]]>';
117
+ const index = buffer.indexOf(delim);
118
+ if (index === -1)
119
+ break;
120
+ const msg = buffer.slice(0, index);
121
+ buffer = buffer.slice(index + delim.length);
122
+ processNetconfMessage(msg);
123
+ }
124
+ else {
125
+ const match = buffer.match(/^\r?\n#(\d+)\r?\n/);
126
+ if (!match)
127
+ break;
128
+ const header = match[0];
129
+ const len = parseInt(match[1], 10);
130
+ const payloadStart = match.index + header.length;
131
+ if (buffer.length < payloadStart + len + 4)
132
+ break;
133
+ const payload = buffer.slice(payloadStart, payloadStart + len);
134
+ const tail = buffer.slice(payloadStart + len, payloadStart + len + 4);
135
+ if (!tail.includes('##')) {
136
+ onLog(`NETCONF 1.1 Framing Error. Tail is: ${JSON.stringify(tail)}`);
137
+ channel.end();
138
+ break;
139
+ }
140
+ buffer = buffer.slice(payloadStart + len + 4);
141
+ processNetconfMessage(payload);
142
+ }
143
+ }
144
+ });
145
+ const sendResponse = (payload) => {
146
+ if (framing === '1.1') {
147
+ const len = Buffer.byteLength(payload, 'utf8');
148
+ channel.write(`\n#${len}\n${payload}\n##\n`);
149
+ }
150
+ else {
151
+ channel.write(`${payload}]]>]]>`);
152
+ }
153
+ };
154
+ const processNetconfMessage = (xml) => {
155
+ onLog(`NETCONF RPC Received: ${xml.trim().substring(0, 100)}...`);
156
+ if (xml.includes('<hello')) {
157
+ if (xml.includes('netconf:base:1.1')) {
158
+ framing = '1.1';
159
+ onLog(`NETCONF Framed Negotiated: 1.1`);
160
+ }
161
+ else {
162
+ framing = '1.0';
163
+ onLog(`NETCONF Framed Negotiated: 1.0`);
164
+ }
165
+ return;
166
+ }
167
+ const msgIdMatch = /message-id=["']([^"']+)["']/i.exec(xml);
168
+ const messageId = msgIdMatch ? msgIdMatch[1] : '1';
169
+ if (xml.includes('<edit-config>')) {
170
+ sendResponse(`<?xml version="1.0" encoding="UTF-8"?>
171
+ <rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="${messageId}">
172
+ <ok/>
173
+ </rpc-reply>`);
174
+ }
175
+ else if (xml.includes('<get-config>') || xml.includes('<get>')) {
176
+ sendResponse(`<?xml version="1.0" encoding="UTF-8"?>
177
+ <rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="${messageId}">
178
+ <data>
179
+ <native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">
180
+ <hostname>Switch1</hostname>
181
+ </native>
182
+ </data>
183
+ </rpc-reply>`);
184
+ }
185
+ else {
186
+ sendResponse(`<?xml version="1.0" encoding="UTF-8"?>
187
+ <rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="${messageId}">
188
+ <ok/>
189
+ </rpc-reply>`);
190
+ }
191
+ };
192
+ channel.on('close', () => {
193
+ onLog(`SSH Session: NETCONF subsystem closed for "${username}"`);
194
+ });
195
+ }
196
+ else {
197
+ reject();
198
+ }
199
+ });
200
+ });
201
+ });
202
+ client.on('close', () => {
203
+ onLog(`SSH Connection closed for "${username || 'unauthenticated'}"`);
204
+ });
205
+ client.on('error', (err) => {
206
+ onLog(`SSH Connection error: ${err.message}`);
207
+ });
208
+ });
209
+ server.listen(port, '0.0.0.0', () => {
210
+ onLog(`SSH & NETCONF Server listening on port ${port}`);
211
+ });
212
+ return server;
213
+ }
214
+ //# sourceMappingURL=ssh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/server/ssh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import * as net from 'net';
2
+ export declare function startTelnetServer(port: number, onLog: (msg: string) => void): net.Server;
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.startTelnetServer = startTelnetServer;
37
+ const net = __importStar(require("net"));
38
+ const shell_simulator_1 = require("./shell-simulator");
39
+ function startTelnetServer(port, onLog) {
40
+ const server = net.createServer((socket) => {
41
+ onLog(`Telnet Connection established from ${socket.remoteAddress}:${socket.remotePort}`);
42
+ socket.write(Buffer.from([255, 251, 1, 255, 251, 3]));
43
+ socket.write('\r\nUser Access Verification\r\n\r\nUsername: ');
44
+ let authState = 'NEEDS_USER';
45
+ let username = '';
46
+ let password = '';
47
+ let lineBuffer = '';
48
+ let lastWasCr = false;
49
+ const simulator = new shell_simulator_1.ShellSimulator();
50
+ const handleLine = () => {
51
+ socket.write('\r\n');
52
+ const cmd = lineBuffer.trim();
53
+ lineBuffer = '';
54
+ if (authState === 'NEEDS_USER') {
55
+ username = cmd;
56
+ authState = 'NEEDS_PASS';
57
+ socket.write('Password: ');
58
+ }
59
+ else if (authState === 'NEEDS_PASS') {
60
+ password = cmd;
61
+ authState = 'ACTIVE';
62
+ onLog(`Telnet Authenticated user: "${username}"`);
63
+ const welcomeBanner = `\r\nCisco IOS Software, C2960 Software (C2960-LANBASEK9-M), Version 15.0(2)SE4, RELEASE SOFTWARE (fc1)\r\nTechnical Support: http://www.cisco.com/techsupport\r\nCopyright (c) 1986-2013 by Cisco Systems, Inc.\r\nCompiled Wed 26-Jun-13 02:49 by prod_rel_team\r\n\r\n`;
64
+ socket.write(welcomeBanner + simulator.getPrompt());
65
+ }
66
+ else {
67
+ if (cmd.toLowerCase() === 'exit' && simulator.mode === 'USER_EXEC') {
68
+ socket.write('Connection closed by foreign host.\r\n');
69
+ socket.end();
70
+ return;
71
+ }
72
+ try {
73
+ const output = simulator.execute(cmd);
74
+ if (output) {
75
+ socket.write(output.replace(/\n/g, '\r\n') + '\r\n');
76
+ }
77
+ }
78
+ catch (err) {
79
+ socket.write(`% Error: ${err.message}\r\n`);
80
+ }
81
+ socket.write(simulator.getPrompt());
82
+ }
83
+ };
84
+ socket.on('data', (data) => {
85
+ const cleaned = [];
86
+ let i = 0;
87
+ while (i < data.length) {
88
+ const byte = data[i];
89
+ if (byte === 255) {
90
+ const cmd = data[i + 1];
91
+ if (cmd >= 251 && cmd <= 254) {
92
+ const option = data[i + 2];
93
+ const response = Buffer.from([255, cmd === 251 ? 253 : 252, option]);
94
+ socket.write(response);
95
+ i += 3;
96
+ }
97
+ else {
98
+ i += 2;
99
+ }
100
+ }
101
+ else {
102
+ cleaned.push(byte);
103
+ i++;
104
+ }
105
+ }
106
+ if (cleaned.length === 0)
107
+ return;
108
+ const input = Buffer.from(cleaned).toString('utf8');
109
+ for (let j = 0; j < input.length; j++) {
110
+ const char = input.charCodeAt(j);
111
+ if (char === 13) {
112
+ lastWasCr = true;
113
+ handleLine();
114
+ }
115
+ else if (char === 10) {
116
+ if (lastWasCr) {
117
+ lastWasCr = false;
118
+ continue;
119
+ }
120
+ handleLine();
121
+ }
122
+ else if (char === 127 || char === 8) {
123
+ lastWasCr = false;
124
+ if (lineBuffer.length > 0) {
125
+ lineBuffer = lineBuffer.slice(0, -1);
126
+ if (authState !== 'NEEDS_PASS') {
127
+ socket.write('\b \b');
128
+ }
129
+ }
130
+ }
131
+ else if (char === 3) {
132
+ lastWasCr = false;
133
+ socket.write('^C\r\n');
134
+ lineBuffer = '';
135
+ if (authState === 'ACTIVE') {
136
+ socket.write(simulator.getPrompt());
137
+ }
138
+ else if (authState === 'NEEDS_USER') {
139
+ socket.write('Username: ');
140
+ }
141
+ else {
142
+ socket.write('Password: ');
143
+ }
144
+ }
145
+ else {
146
+ lastWasCr = false;
147
+ const rawChar = input[j];
148
+ lineBuffer += rawChar;
149
+ if (authState !== 'NEEDS_PASS') {
150
+ socket.write(rawChar);
151
+ }
152
+ }
153
+ }
154
+ });
155
+ socket.on('close', () => {
156
+ onLog(`Telnet Connection closed`);
157
+ });
158
+ socket.on('error', (err) => {
159
+ onLog(`Telnet Socket error: ${err.message}`);
160
+ });
161
+ });
162
+ server.listen(port, '0.0.0.0', () => {
163
+ onLog(`Telnet Server listening on port ${port}`);
164
+ });
165
+ return server;
166
+ }
167
+ //# sourceMappingURL=telnet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telnet.js","sourceRoot":"","sources":["../../src/server/telnet.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ciscollm-cli",
3
- "version": "1.0.8",
3
+ "version": "1.0.10",
4
4
  "description": "Cisco IOS automation agent CLI with mock simulation, guardrails, and LLM tool-calling support.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -24,7 +24,7 @@
24
24
  "scripts": {
25
25
  "build": "tsc",
26
26
  "start": "ts-node src/index.ts",
27
- "server": "ts-node server/index.ts",
27
+ "server": "ts-node src/server/index.ts",
28
28
  "test": "ts-node test/index.test.ts",
29
29
  "prepack": "npm run build"
30
30
  },