rackmind-cli 0.1.2 → 0.1.3
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/ai/tool-executor.d.ts.map +1 -1
- package/dist/ai/tool-executor.js +138 -41
- package/dist/ai/tool-executor.js.map +1 -1
- package/dist/ai/tools.js +4 -4
- package/dist/ai/tools.js.map +1 -1
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +126 -2
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/containers.d.ts +7 -2
- package/dist/commands/containers.d.ts.map +1 -1
- package/dist/commands/containers.js +30 -11
- package/dist/commands/containers.js.map +1 -1
- package/dist/commands/lifecycle.d.ts +6 -1
- package/dist/commands/lifecycle.d.ts.map +1 -1
- package/dist/commands/lifecycle.js +118 -25
- package/dist/commands/lifecycle.js.map +1 -1
- package/dist/commands/report.js +3 -3
- package/dist/commands/report.js.map +1 -1
- package/dist/commands/vms.d.ts +7 -2
- package/dist/commands/vms.d.ts.map +1 -1
- package/dist/commands/vms.js +30 -11
- package/dist/commands/vms.js.map +1 -1
- package/dist/index.js +28 -8
- package/dist/index.js.map +1 -1
- package/dist/server/client.d.ts +19 -2
- package/dist/server/client.d.ts.map +1 -1
- package/dist/server/client.js +27 -1
- package/dist/server/client.js.map +1 -1
- package/dist/server/proxmox.d.ts +54 -1
- package/dist/server/proxmox.d.ts.map +1 -1
- package/dist/server/proxmox.js +149 -12
- package/dist/server/proxmox.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-executor.d.ts","sourceRoot":"","sources":["../../src/ai/tool-executor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool-executor.d.ts","sourceRoot":"","sources":["../../src/ai/tool-executor.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAQxD,UAAU,mBAAmB;IACzB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,8BAA8B;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,SAAS;IACf,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,KAAK,SAAS,GACR,mBAAmB,GACnB,8BAA8B,GAC9B,SAAS,GACT,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAM5B,MAAM,WAAW,UAAU;IACvB,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;CACjB;AAMD;;;GAGG;AACH,wBAAsB,WAAW,CAC7B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,CAAC,CAoErB"}
|
package/dist/ai/tool-executor.js
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
// Maps tool names from Claude's function calling to actual ServerClient
|
|
5
5
|
// operations. Returns serialized results for the tool_result message.
|
|
6
|
+
// Lifecycle actions poll tasks to completion before reporting results.
|
|
6
7
|
// ---------------------------------------------------------------------------
|
|
8
|
+
import { ProxmoxApiError } from '../server/proxmox.js';
|
|
7
9
|
import { logger } from '../utils/logger.js';
|
|
8
10
|
// ---------------------------------------------------------------------------
|
|
9
11
|
// Executor
|
|
@@ -51,7 +53,11 @@ export async function executeTool(toolName, input, client) {
|
|
|
51
53
|
}
|
|
52
54
|
}
|
|
53
55
|
catch (err) {
|
|
54
|
-
const message = err instanceof
|
|
56
|
+
const message = err instanceof ProxmoxApiError
|
|
57
|
+
? err.toUserMessage()
|
|
58
|
+
: err instanceof Error
|
|
59
|
+
? err.message
|
|
60
|
+
: String(err);
|
|
55
61
|
logger.error('Tool execution failed', { toolName, error: message });
|
|
56
62
|
return {
|
|
57
63
|
content: `Error: ${message}`,
|
|
@@ -118,67 +124,158 @@ async function getNodeStatus(client) {
|
|
|
118
124
|
};
|
|
119
125
|
}
|
|
120
126
|
async function listContainers(client) {
|
|
121
|
-
|
|
127
|
+
// Use cluster-wide listing for multi-node awareness
|
|
128
|
+
const containers = await client.listAllContainers();
|
|
122
129
|
return {
|
|
123
130
|
content: JSON.stringify(containers, null, 2),
|
|
124
131
|
isError: false,
|
|
125
|
-
label: `list containers (${containers.length} found)`,
|
|
132
|
+
label: `list containers (${containers.length} found across all nodes)`,
|
|
126
133
|
};
|
|
127
134
|
}
|
|
128
135
|
async function listVms(client) {
|
|
129
|
-
|
|
136
|
+
// Use cluster-wide listing for multi-node awareness
|
|
137
|
+
const vms = await client.listAllVMs();
|
|
130
138
|
return {
|
|
131
139
|
content: JSON.stringify(vms, null, 2),
|
|
132
140
|
isError: false,
|
|
133
|
-
label: `list VMs (${vms.length} found)`,
|
|
141
|
+
label: `list VMs (${vms.length} found across all nodes)`,
|
|
134
142
|
};
|
|
135
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* Helper: find which node a guest lives on via cluster resources,
|
|
146
|
+
* then perform a lifecycle action and poll the task to completion.
|
|
147
|
+
*/
|
|
148
|
+
async function findGuestNode(vmid, guestType, client) {
|
|
149
|
+
try {
|
|
150
|
+
const resources = await client.listResources('vm');
|
|
151
|
+
const match = resources.find((r) => r.vmid === vmid && r.type === guestType);
|
|
152
|
+
if (match)
|
|
153
|
+
return match.node;
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// Fallback to configured node
|
|
157
|
+
}
|
|
158
|
+
return await client.getNodeName();
|
|
159
|
+
}
|
|
136
160
|
async function startContainer(input, client) {
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
161
|
+
const node = await findGuestNode(input.vmid, 'lxc', client);
|
|
162
|
+
const upid = await client.startContainer(input.vmid, node);
|
|
163
|
+
// Poll until completion
|
|
164
|
+
try {
|
|
165
|
+
await client.waitForTask(upid, node);
|
|
166
|
+
return {
|
|
167
|
+
content: `Container ${input.vmid} started successfully on node ${node}.`,
|
|
168
|
+
isError: false,
|
|
169
|
+
label: `start container ${input.vmid}`,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
174
|
+
return {
|
|
175
|
+
content: `Container ${input.vmid} start task failed: ${msg}`,
|
|
176
|
+
isError: true,
|
|
177
|
+
label: `start container ${input.vmid} (failed)`,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
143
180
|
}
|
|
144
181
|
async function stopContainer(input, client) {
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
182
|
+
const node = await findGuestNode(input.vmid, 'lxc', client);
|
|
183
|
+
const upid = await client.stopContainer(input.vmid, node);
|
|
184
|
+
try {
|
|
185
|
+
await client.waitForTask(upid, node);
|
|
186
|
+
return {
|
|
187
|
+
content: `Container ${input.vmid} stopped successfully on node ${node}.`,
|
|
188
|
+
isError: false,
|
|
189
|
+
label: `stop container ${input.vmid}`,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
194
|
+
return {
|
|
195
|
+
content: `Container ${input.vmid} stop task failed: ${msg}`,
|
|
196
|
+
isError: true,
|
|
197
|
+
label: `stop container ${input.vmid} (failed)`,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
151
200
|
}
|
|
152
201
|
async function restartContainer(input, client) {
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
202
|
+
const node = await findGuestNode(input.vmid, 'lxc', client);
|
|
203
|
+
const upid = await client.restartContainer(input.vmid, node);
|
|
204
|
+
try {
|
|
205
|
+
await client.waitForTask(upid, node);
|
|
206
|
+
return {
|
|
207
|
+
content: `Container ${input.vmid} restarted successfully on node ${node}.`,
|
|
208
|
+
isError: false,
|
|
209
|
+
label: `restart container ${input.vmid}`,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
214
|
+
return {
|
|
215
|
+
content: `Container ${input.vmid} restart task failed: ${msg}`,
|
|
216
|
+
isError: true,
|
|
217
|
+
label: `restart container ${input.vmid} (failed)`,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
159
220
|
}
|
|
160
221
|
async function startVm(input, client) {
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
222
|
+
const node = await findGuestNode(input.vmid, 'qemu', client);
|
|
223
|
+
const upid = await client.startVM(input.vmid, node);
|
|
224
|
+
try {
|
|
225
|
+
await client.waitForTask(upid, node);
|
|
226
|
+
return {
|
|
227
|
+
content: `VM ${input.vmid} started successfully on node ${node}.`,
|
|
228
|
+
isError: false,
|
|
229
|
+
label: `start VM ${input.vmid}`,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
234
|
+
return {
|
|
235
|
+
content: `VM ${input.vmid} start task failed: ${msg}`,
|
|
236
|
+
isError: true,
|
|
237
|
+
label: `start VM ${input.vmid} (failed)`,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
167
240
|
}
|
|
168
241
|
async function stopVm(input, client) {
|
|
169
|
-
const
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
242
|
+
const node = await findGuestNode(input.vmid, 'qemu', client);
|
|
243
|
+
const upid = await client.stopVM(input.vmid, node);
|
|
244
|
+
try {
|
|
245
|
+
await client.waitForTask(upid, node);
|
|
246
|
+
return {
|
|
247
|
+
content: `VM ${input.vmid} stopped successfully on node ${node}.`,
|
|
248
|
+
isError: false,
|
|
249
|
+
label: `stop VM ${input.vmid}`,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
254
|
+
return {
|
|
255
|
+
content: `VM ${input.vmid} stop task failed: ${msg}`,
|
|
256
|
+
isError: true,
|
|
257
|
+
label: `stop VM ${input.vmid} (failed)`,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
175
260
|
}
|
|
176
261
|
async function restartVm(input, client) {
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
262
|
+
const node = await findGuestNode(input.vmid, 'qemu', client);
|
|
263
|
+
const upid = await client.restartVM(input.vmid, node);
|
|
264
|
+
try {
|
|
265
|
+
await client.waitForTask(upid, node);
|
|
266
|
+
return {
|
|
267
|
+
content: `VM ${input.vmid} restarted successfully on node ${node}.`,
|
|
268
|
+
isError: false,
|
|
269
|
+
label: `restart VM ${input.vmid}`,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
274
|
+
return {
|
|
275
|
+
content: `VM ${input.vmid} restart task failed: ${msg}`,
|
|
276
|
+
isError: true,
|
|
277
|
+
label: `restart VM ${input.vmid} (failed)`,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
183
280
|
}
|
|
184
281
|
//# sourceMappingURL=tool-executor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-executor.js","sourceRoot":"","sources":["../../src/ai/tool-executor.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,mEAAmE;AACnE,8EAA8E;AAC9E,wEAAwE;AACxE,sEAAsE;AACtE,8EAA8E;AAG9E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAsC5C,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC7B,QAAgB,EAChB,KAAgB,EAChB,MAAoB;IAEpB,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAEnD,IAAI,CAAC;QACD,QAAQ,QAAQ,EAAE,CAAC;YACf,KAAK,iBAAiB;gBAClB,OAAO,MAAM,cAAc,CAAC,KAA4B,EAAE,MAAM,CAAC,CAAC;YAEtE,KAAK,8BAA8B;gBAC/B,OAAO,MAAM,yBAAyB,CAClC,KAAuC,EACvC,MAAM,CACT,CAAC;YAEN,KAAK,sBAAsB;gBACvB,OAAO,MAAM,kBAAkB,CAAC,KAAkB,EAAE,MAAM,CAAC,CAAC;YAEhE,KAAK,eAAe;gBAChB,OAAO,MAAM,WAAW,CAAC,KAAkB,EAAE,MAAM,CAAC,CAAC;YAEzD,KAAK,iBAAiB;gBAClB,OAAO,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;YAEvC,KAAK,iBAAiB;gBAClB,OAAO,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;YAExC,KAAK,UAAU;gBACX,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;YAEjC,KAAK,iBAAiB;gBAClB,OAAO,MAAM,cAAc,CAAC,KAAkB,EAAE,MAAM,CAAC,CAAC;YAE5D,KAAK,gBAAgB;gBACjB,OAAO,MAAM,aAAa,CAAC,KAAkB,EAAE,MAAM,CAAC,CAAC;YAE3D,KAAK,mBAAmB;gBACpB,OAAO,MAAM,gBAAgB,CAAC,KAAkB,EAAE,MAAM,CAAC,CAAC;YAE9D,KAAK,UAAU;gBACX,OAAO,MAAM,OAAO,CAAC,KAAkB,EAAE,MAAM,CAAC,CAAC;YAErD,KAAK,SAAS;gBACV,OAAO,MAAM,MAAM,CAAC,KAAkB,EAAE,MAAM,CAAC,CAAC;YAEpD,KAAK,YAAY;gBACb,OAAO,MAAM,SAAS,CAAC,KAAkB,EAAE,MAAM,CAAC,CAAC;YAEvD;gBACI,OAAO;oBACH,OAAO,EAAE,iBAAiB,QAAQ,EAAE;oBACpC,OAAO,EAAE,IAAI;oBACb,KAAK,EAAE,iBAAiB,QAAQ,EAAE;iBACrC,CAAC;QACV,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"tool-executor.js","sourceRoot":"","sources":["../../src/ai/tool-executor.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/tools.js
CHANGED
|
@@ -91,8 +91,8 @@ export function getToolDefinitions() {
|
|
|
91
91
|
},
|
|
92
92
|
{
|
|
93
93
|
name: 'list_containers',
|
|
94
|
-
description: '
|
|
95
|
-
'status, CPU count, memory, disk, and network stats for each container.',
|
|
94
|
+
description: 'List all LXC containers across ALL cluster nodes. Returns VMID, name, ' +
|
|
95
|
+
'node, status, CPU count, memory, disk, and network stats for each container.',
|
|
96
96
|
input_schema: {
|
|
97
97
|
type: 'object',
|
|
98
98
|
properties: {},
|
|
@@ -101,8 +101,8 @@ export function getToolDefinitions() {
|
|
|
101
101
|
},
|
|
102
102
|
{
|
|
103
103
|
name: 'list_vms',
|
|
104
|
-
description: '
|
|
105
|
-
'name, status, CPU count, memory, disk, and network stats for each VM.',
|
|
104
|
+
description: 'List all QEMU virtual machines across ALL cluster nodes. Returns VMID, ' +
|
|
105
|
+
'name, node, status, CPU count, memory, disk, and network stats for each VM.',
|
|
106
106
|
input_schema: {
|
|
107
107
|
type: 'object',
|
|
108
108
|
properties: {},
|
package/dist/ai/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/ai/tools.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAI9E;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAC9B,OAAO;QACH;YACI,IAAI,EAAE,iBAAiB;YACvB,WAAW,EACP,uDAAuD;gBACvD,+DAA+D;gBAC/D,iEAAiE;gBACjE,2DAA2D;YAC/D,YAAY,EAAE;gBACV,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACR,OAAO,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,kDAAkD;qBAClE;iBACJ;gBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;aACxB;SACJ;QACD;YACI,IAAI,EAAE,8BAA8B;YACpC,WAAW,EACP,2DAA2D;gBAC3D,oEAAoE;gBACpE,uEAAuE;gBACvE,yDAAyD;YAC7D,YAAY,EAAE;gBACV,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACR,IAAI,EAAE;wBACF,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,+BAA+B;qBAC/C;oBACD,OAAO,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,mDAAmD;qBACnE;iBACJ;gBACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;aAChC;SACJ;QACD;YACI,IAAI,EAAE,sBAAsB;YAC5B,WAAW,EACP,yEAAyE;gBACzE,yEAAyE;gBACzE,uBAAuB;YAC3B,YAAY,EAAE;gBACV,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACR,IAAI,EAAE;wBACF,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,+BAA+B;qBAC/C;iBACJ;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACrB;SACJ;QACD;YACI,IAAI,EAAE,eAAe;YACrB,WAAW,EACP,wEAAwE;gBACxE,8CAA8C;YAClD,YAAY,EAAE;gBACV,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACR,IAAI,EAAE;wBACF,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,yBAAyB;qBACzC;iBACJ;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACrB;SACJ;QACD;YACI,IAAI,EAAE,iBAAiB;YACvB,WAAW,EACP,sEAAsE;gBACtE,4EAA4E;YAChF,YAAY,EAAE;gBACV,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE,EAAE;gBACd,QAAQ,EAAE,EAAE;aACf;SACJ;QACD;YACI,IAAI,EAAE,iBAAiB;YACvB,WAAW,EACP,
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/ai/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AA8DA;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BjE"}
|
package/dist/commands/connect.js
CHANGED
|
@@ -3,12 +3,43 @@
|
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
// If the alias already exists, switches to it. Otherwise, runs the
|
|
5
5
|
// interactive setup wizard to create a new server profile.
|
|
6
|
+
// Validates credentials by testing the API connection before saving.
|
|
6
7
|
// ---------------------------------------------------------------------------
|
|
7
8
|
import chalk from 'chalk';
|
|
9
|
+
import ora from 'ora';
|
|
8
10
|
import { getServerProfile, saveServerProfile, setActiveServer, encryptCredential, getDefaultServerProfile, } from '../config/index.js';
|
|
9
11
|
import { promptText, promptNumber, promptSecret, promptSelect, promptConfirm, } from '../utils/prompt.js';
|
|
10
12
|
import { formatError, formatSuccess, formatKeyValue } from '../utils/format.js';
|
|
11
13
|
import { logger } from '../utils/logger.js';
|
|
14
|
+
import { ProxmoxClient, ProxmoxApiError } from '../server/proxmox.js';
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// API token format patterns
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/**
|
|
19
|
+
* Validates that an API token ID follows the Proxmox format: user@realm!tokenid
|
|
20
|
+
* Examples: root@pam!rackmind, admin@pve!monitoring, apiuser@pam!backup
|
|
21
|
+
*/
|
|
22
|
+
function validateTokenId(tokenId) {
|
|
23
|
+
if (!tokenId) {
|
|
24
|
+
return { valid: false, error: 'API token ID is required' };
|
|
25
|
+
}
|
|
26
|
+
// Pattern: user@realm!tokenname
|
|
27
|
+
const tokenPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+![a-zA-Z0-9._-]+$/;
|
|
28
|
+
if (!tokenPattern.test(tokenId)) {
|
|
29
|
+
return {
|
|
30
|
+
valid: false,
|
|
31
|
+
error: `Invalid token format: "${tokenId}"\n` +
|
|
32
|
+
' Expected format: user@realm!tokenid\n' +
|
|
33
|
+
' Examples:\n' +
|
|
34
|
+
' root@pam!rackmind\n' +
|
|
35
|
+
' admin@pve!monitoring\n' +
|
|
36
|
+
' apiuser@pam!backup\n' +
|
|
37
|
+
'\n' +
|
|
38
|
+
' Create a token in Proxmox: Datacenter > Permissions > API Tokens > Add',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return { valid: true };
|
|
42
|
+
}
|
|
12
43
|
/**
|
|
13
44
|
* Main connect command handler.
|
|
14
45
|
* If the alias exists in config, switches to it.
|
|
@@ -61,8 +92,28 @@ async function runSetupWizard(alias) {
|
|
|
61
92
|
// -- Proxmox-specific fields ---------------------------------------------
|
|
62
93
|
if (platform === 'proxmox') {
|
|
63
94
|
profile.port = await promptNumber('Proxmox API port', 8006);
|
|
64
|
-
|
|
65
|
-
|
|
95
|
+
// API token ID with format validation
|
|
96
|
+
let tokenId;
|
|
97
|
+
while (true) {
|
|
98
|
+
tokenId = await promptText('API token ID (format: user@realm!tokenid, e.g., root@pam!rackmind)', '');
|
|
99
|
+
if (!tokenId) {
|
|
100
|
+
process.stderr.write(chalk.yellow('Warning: No API token ID provided. API commands will not work.\n'));
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
const validation = validateTokenId(tokenId);
|
|
104
|
+
if (validation.valid) {
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
process.stderr.write(chalk.red(validation.error ?? 'Invalid token format') + '\n\n');
|
|
108
|
+
}
|
|
109
|
+
profile.apiTokenId = tokenId;
|
|
110
|
+
// Extract user from token ID (user@realm from user@realm!tokenid)
|
|
111
|
+
if (tokenId.includes('!')) {
|
|
112
|
+
profile.apiUser = tokenId.split('!')[0] ?? '';
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
profile.apiUser = await promptText('API user (e.g., root@pam)', 'root@pam');
|
|
116
|
+
}
|
|
66
117
|
const tokenSecret = await promptSecret('API token secret');
|
|
67
118
|
if (tokenSecret) {
|
|
68
119
|
profile.encryptedTokenSecret = encryptCredential(tokenSecret);
|
|
@@ -70,6 +121,10 @@ async function runSetupWizard(alias) {
|
|
|
70
121
|
profile.node =
|
|
71
122
|
(await promptText('Node name (leave empty for auto-detect)', '')) || undefined;
|
|
72
123
|
profile.allowSelfSigned = await promptConfirm('Allow self-signed TLS certificates?', true);
|
|
124
|
+
// -- Connection validation -----------------------------------------------
|
|
125
|
+
if (tokenId && tokenSecret) {
|
|
126
|
+
await validateConnection(profile, tokenSecret);
|
|
127
|
+
}
|
|
73
128
|
}
|
|
74
129
|
// -- SSH connection ------------------------------------------------------
|
|
75
130
|
const configureSSH = platform !== 'proxmox' ? true : await promptConfirm('Configure SSH access?', true);
|
|
@@ -94,6 +149,67 @@ async function runSetupWizard(alias) {
|
|
|
94
149
|
}
|
|
95
150
|
return profile;
|
|
96
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* Test the API connection before saving the profile.
|
|
154
|
+
* Shows clear pass/fail and actionable guidance on failure.
|
|
155
|
+
*/
|
|
156
|
+
async function validateConnection(profile, tokenSecret) {
|
|
157
|
+
process.stderr.write('\n');
|
|
158
|
+
const spinner = ora('Testing Proxmox API connection...').start();
|
|
159
|
+
const client = new ProxmoxClient({
|
|
160
|
+
host: profile.host,
|
|
161
|
+
port: profile.port,
|
|
162
|
+
apiTokenId: profile.apiTokenId,
|
|
163
|
+
apiTokenSecret: tokenSecret,
|
|
164
|
+
allowSelfSigned: profile.allowSelfSigned,
|
|
165
|
+
});
|
|
166
|
+
try {
|
|
167
|
+
const version = await client.testConnection();
|
|
168
|
+
spinner.succeed(chalk.green(`Connected to Proxmox VE ${version.version} (release ${version.release})`));
|
|
169
|
+
// If node was specified, validate it exists
|
|
170
|
+
if (profile.node) {
|
|
171
|
+
try {
|
|
172
|
+
const nodes = await client.listNodes();
|
|
173
|
+
const nodeExists = nodes.some((n) => n.node === profile.node);
|
|
174
|
+
if (!nodeExists) {
|
|
175
|
+
const available = nodes.map((n) => n.node).join(', ');
|
|
176
|
+
process.stderr.write(chalk.yellow(` Warning: Node "${profile.node}" not found. Available: ${available}\n`));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
// Non-critical — node list might require additional permissions
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Try to detect node name for auto-detect confirmation
|
|
184
|
+
if (!profile.node) {
|
|
185
|
+
try {
|
|
186
|
+
const nodeName = await client.detectNodeName();
|
|
187
|
+
process.stderr.write(chalk.dim(` Auto-detected node: ${nodeName}\n`));
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// Non-critical
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
spinner.fail(chalk.red('Connection test failed'));
|
|
196
|
+
if (err instanceof ProxmoxApiError) {
|
|
197
|
+
process.stderr.write('\n' + chalk.red(` ${err.message}\n`));
|
|
198
|
+
if (err.suggestion) {
|
|
199
|
+
process.stderr.write(chalk.yellow(` ${err.suggestion}\n`));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
204
|
+
process.stderr.write('\n' + chalk.red(` ${message}\n`));
|
|
205
|
+
}
|
|
206
|
+
process.stderr.write('\n');
|
|
207
|
+
const saveAnyway = await promptConfirm('Save profile anyway? (You can fix credentials later)', true);
|
|
208
|
+
if (!saveAnyway) {
|
|
209
|
+
throw new Error('Connection validation failed — profile not saved', { cause: err });
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
97
213
|
/**
|
|
98
214
|
* Print a summary of the saved profile (masking sensitive values).
|
|
99
215
|
*/
|
|
@@ -113,5 +229,13 @@ function printProfileSummary(profile) {
|
|
|
113
229
|
process.stderr.write(formatKeyValue(' SSH Auth', profile.sshAuthType) + '\n');
|
|
114
230
|
}
|
|
115
231
|
process.stderr.write(chalk.dim('----------------------\n'));
|
|
232
|
+
// Least-privilege documentation hint
|
|
233
|
+
if (profile.platform === 'proxmox' && profile.apiUser === 'root@pam') {
|
|
234
|
+
process.stderr.write('\n');
|
|
235
|
+
process.stderr.write(chalk.yellow(' Tip: For production use, create a least-privilege API token instead of root@pam.\n'));
|
|
236
|
+
process.stderr.write(chalk.dim(' Minimum permissions for read-only monitoring: PVEAuditor role on /\n' +
|
|
237
|
+
' For lifecycle management (start/stop): PVEAdmin role on /vms\n' +
|
|
238
|
+
' Create in: Datacenter > Permissions > API Tokens\n'));
|
|
239
|
+
}
|
|
116
240
|
}
|
|
117
241
|
//# sourceMappingURL=connect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,8DAA8D;AAC9D,8EAA8E;AAC9E,mEAAmE;AACnE,2DAA2D;AAC3D,8EAA8E;AAE9E,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACH,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,uBAAuB,GAE1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACH,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,aAAa,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
+
export interface ContainersCommandOptions {
|
|
2
|
+
json: boolean;
|
|
3
|
+
node?: string;
|
|
4
|
+
}
|
|
1
5
|
/**
|
|
2
|
-
* List all LXC containers
|
|
6
|
+
* List all LXC containers across all cluster nodes.
|
|
7
|
+
* Optionally filter by --node.
|
|
3
8
|
*/
|
|
4
|
-
export declare function containersCommand(
|
|
9
|
+
export declare function containersCommand(options: ContainersCommandOptions): Promise<void>;
|
|
5
10
|
//# sourceMappingURL=containers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containers.d.ts","sourceRoot":"","sources":["../../src/commands/containers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"containers.d.ts","sourceRoot":"","sources":["../../src/commands/containers.ts"],"names":[],"mappings":"AA0DA,MAAM,WAAW,wBAAwB;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgFxF"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
// rackmind containers (alias: ct) — list all LXC containers
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
// Fetches containers from Proxmox API and displays them in a formatted table.
|
|
5
|
-
//
|
|
5
|
+
// Uses /cluster/resources to aggregate containers across ALL cluster nodes.
|
|
6
|
+
// Supports --json for machine-readable output and --node to filter by node.
|
|
6
7
|
// ---------------------------------------------------------------------------
|
|
7
8
|
import chalk from 'chalk';
|
|
8
9
|
import { ServerClient } from '../server/client.js';
|
|
@@ -13,6 +14,7 @@ function toContainerRow(ct) {
|
|
|
13
14
|
return {
|
|
14
15
|
vmid: ct.vmid,
|
|
15
16
|
name: ct.name,
|
|
17
|
+
node: ct.node,
|
|
16
18
|
status: ct.status,
|
|
17
19
|
cpus: ct.cpus,
|
|
18
20
|
memUsed: ct.mem,
|
|
@@ -27,9 +29,10 @@ function toContainerRow(ct) {
|
|
|
27
29
|
};
|
|
28
30
|
}
|
|
29
31
|
/**
|
|
30
|
-
* List all LXC containers
|
|
32
|
+
* List all LXC containers across all cluster nodes.
|
|
33
|
+
* Optionally filter by --node.
|
|
31
34
|
*/
|
|
32
|
-
export async function containersCommand(
|
|
35
|
+
export async function containersCommand(options) {
|
|
33
36
|
let client = null;
|
|
34
37
|
try {
|
|
35
38
|
client = ServerClient.fromActiveProfile();
|
|
@@ -40,33 +43,49 @@ export async function containersCommand(json) {
|
|
|
40
43
|
process.exit(1);
|
|
41
44
|
}
|
|
42
45
|
try {
|
|
43
|
-
|
|
44
|
-
|
|
46
|
+
// Use cluster-wide listing for multi-node support
|
|
47
|
+
let containers = await client.listAllContainers();
|
|
48
|
+
// Filter by node if specified
|
|
49
|
+
if (options.node) {
|
|
50
|
+
containers = containers.filter((ct) => ct.node === options.node);
|
|
51
|
+
}
|
|
45
52
|
// Sort by VMID
|
|
46
53
|
containers.sort((a, b) => a.vmid - b.vmid);
|
|
47
|
-
if (json) {
|
|
54
|
+
if (options.json) {
|
|
48
55
|
const rows = containers.map(toContainerRow);
|
|
49
56
|
process.stdout.write(JSON.stringify(rows, null, 2) + '\n');
|
|
50
57
|
return;
|
|
51
58
|
}
|
|
52
59
|
if (containers.length === 0) {
|
|
53
|
-
|
|
60
|
+
const nodeLabel = options.node ? ` on node "${options.node}"` : '';
|
|
61
|
+
process.stderr.write(chalk.dim(`No LXC containers found${nodeLabel}.\n`));
|
|
54
62
|
return;
|
|
55
63
|
}
|
|
56
|
-
|
|
57
|
-
const
|
|
64
|
+
// Detect if multi-node (show node column only when there are multiple nodes)
|
|
65
|
+
const nodeNames = new Set(containers.map((ct) => ct.node));
|
|
66
|
+
const isMultiNode = nodeNames.size > 1;
|
|
67
|
+
const headerLabel = options.node
|
|
68
|
+
? `LXC Containers on ${options.node}`
|
|
69
|
+
: 'LXC Containers (all nodes)';
|
|
70
|
+
process.stderr.write(chalk.cyan.bold(`\n${headerLabel}`) + chalk.dim(` (${containers.length})\n\n`));
|
|
71
|
+
const headers = isMultiNode
|
|
72
|
+
? ['VMID', 'Name', 'Node', 'Status', 'CPUs', 'Memory', 'Disk', 'Uptime']
|
|
73
|
+
: ['VMID', 'Name', 'Status', 'CPUs', 'Memory', 'Disk', 'Uptime'];
|
|
74
|
+
const table = createTable(headers);
|
|
58
75
|
for (const ct of containers) {
|
|
59
76
|
const memRatio = ct.maxmem > 0 ? ct.mem / ct.maxmem : 0;
|
|
60
77
|
const diskRatio = ct.maxdisk > 0 ? ct.disk / ct.maxdisk : 0;
|
|
61
|
-
|
|
78
|
+
const row = [
|
|
62
79
|
String(ct.vmid),
|
|
63
80
|
truncate(ct.name || chalk.dim('(unnamed)'), 24),
|
|
81
|
+
...(isMultiNode ? [chalk.dim(ct.node)] : []),
|
|
64
82
|
colorStatus(ct.status),
|
|
65
83
|
String(ct.cpus),
|
|
66
84
|
`${formatBytes(ct.mem)} / ${formatBytes(ct.maxmem)} ${formatPercent(memRatio)}`,
|
|
67
85
|
`${formatBytes(ct.disk)} / ${formatBytes(ct.maxdisk)} ${formatPercent(diskRatio)}`,
|
|
68
86
|
formatUptime(ct.uptime),
|
|
69
|
-
]
|
|
87
|
+
];
|
|
88
|
+
table.push(row);
|
|
70
89
|
}
|
|
71
90
|
process.stderr.write(table.toString() + '\n\n');
|
|
72
91
|
}
|