rackmind-cli 0.1.2
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 +179 -0
- package/bin/rackmind.js +6 -0
- package/dist/ai/client.d.ts +71 -0
- package/dist/ai/client.d.ts.map +1 -0
- package/dist/ai/client.js +198 -0
- package/dist/ai/client.js.map +1 -0
- package/dist/ai/system-prompt.d.ts +20 -0
- package/dist/ai/system-prompt.d.ts.map +1 -0
- package/dist/ai/system-prompt.js +169 -0
- package/dist/ai/system-prompt.js.map +1 -0
- package/dist/ai/tool-executor.d.ts +27 -0
- package/dist/ai/tool-executor.d.ts.map +1 -0
- package/dist/ai/tool-executor.js +184 -0
- package/dist/ai/tool-executor.js.map +1 -0
- package/dist/ai/tools.d.ts +7 -0
- package/dist/ai/tools.d.ts.map +1 -0
- package/dist/ai/tools.js +203 -0
- package/dist/ai/tools.js.map +1 -0
- package/dist/commands/config.d.ts +21 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +169 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/connect.d.ts +7 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +117 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/containers.d.ts +5 -0
- package/dist/commands/containers.d.ts.map +1 -0
- package/dist/commands/containers.js +83 -0
- package/dist/commands/containers.js.map +1 -0
- package/dist/commands/exec.d.ts +5 -0
- package/dist/commands/exec.d.ts.map +1 -0
- package/dist/commands/exec.js +133 -0
- package/dist/commands/exec.js.map +1 -0
- package/dist/commands/lifecycle.d.ts +7 -0
- package/dist/commands/lifecycle.d.ts.map +1 -0
- package/dist/commands/lifecycle.js +213 -0
- package/dist/commands/lifecycle.js.map +1 -0
- package/dist/commands/logs.d.ts +5 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +117 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/report.d.ts +6 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +203 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/servers.d.ts +17 -0
- package/dist/commands/servers.d.ts.map +1 -0
- package/dist/commands/servers.js +116 -0
- package/dist/commands/servers.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +174 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/vms.d.ts +5 -0
- package/dist/commands/vms.d.ts.map +1 -0
- package/dist/commands/vms.js +83 -0
- package/dist/commands/vms.js.map +1 -0
- package/dist/config/crypto.d.ts +20 -0
- package/dist/config/crypto.d.ts.map +1 -0
- package/dist/config/crypto.js +78 -0
- package/dist/config/crypto.js.map +1 -0
- package/dist/config/index.d.ts +21 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +158 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +263 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +83 -0
- package/dist/config/types.js.map +1 -0
- package/dist/globals.d.ts +22 -0
- package/dist/globals.d.ts.map +1 -0
- package/dist/globals.js +43 -0
- package/dist/globals.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +399 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive/App.d.ts +3 -0
- package/dist/interactive/App.d.ts.map +1 -0
- package/dist/interactive/App.js +103 -0
- package/dist/interactive/App.js.map +1 -0
- package/dist/interactive/components/Header.d.ts +8 -0
- package/dist/interactive/components/Header.d.ts.map +1 -0
- package/dist/interactive/components/Header.js +20 -0
- package/dist/interactive/components/Header.js.map +1 -0
- package/dist/interactive/components/InputBar.d.ts +9 -0
- package/dist/interactive/components/InputBar.d.ts.map +1 -0
- package/dist/interactive/components/InputBar.js +89 -0
- package/dist/interactive/components/InputBar.js.map +1 -0
- package/dist/interactive/components/MessageList.d.ts +9 -0
- package/dist/interactive/components/MessageList.d.ts.map +1 -0
- package/dist/interactive/components/MessageList.js +28 -0
- package/dist/interactive/components/MessageList.js.map +1 -0
- package/dist/interactive/components/Spinner.d.ts +7 -0
- package/dist/interactive/components/Spinner.d.ts.map +1 -0
- package/dist/interactive/components/Spinner.js +19 -0
- package/dist/interactive/components/Spinner.js.map +1 -0
- package/dist/interactive/components/StatusBar.d.ts +10 -0
- package/dist/interactive/components/StatusBar.d.ts.map +1 -0
- package/dist/interactive/components/StatusBar.js +7 -0
- package/dist/interactive/components/StatusBar.js.map +1 -0
- package/dist/interactive/components/StreamingMessage.d.ts +7 -0
- package/dist/interactive/components/StreamingMessage.d.ts.map +1 -0
- package/dist/interactive/components/StreamingMessage.js +9 -0
- package/dist/interactive/components/StreamingMessage.js.map +1 -0
- package/dist/interactive/components/ToolIndicator.d.ts +7 -0
- package/dist/interactive/components/ToolIndicator.d.ts.map +1 -0
- package/dist/interactive/components/ToolIndicator.js +10 -0
- package/dist/interactive/components/ToolIndicator.js.map +1 -0
- package/dist/interactive/components/ToolOutput.d.ts +8 -0
- package/dist/interactive/components/ToolOutput.d.ts.map +1 -0
- package/dist/interactive/components/ToolOutput.js +9 -0
- package/dist/interactive/components/ToolOutput.js.map +1 -0
- package/dist/interactive/components/WelcomeScreen.d.ts +9 -0
- package/dist/interactive/components/WelcomeScreen.d.ts.map +1 -0
- package/dist/interactive/components/WelcomeScreen.js +8 -0
- package/dist/interactive/components/WelcomeScreen.js.map +1 -0
- package/dist/interactive/launch.d.ts +6 -0
- package/dist/interactive/launch.d.ts.map +1 -0
- package/dist/interactive/launch.js +30 -0
- package/dist/interactive/launch.js.map +1 -0
- package/dist/interactive/slashCommands.d.ts +13 -0
- package/dist/interactive/slashCommands.d.ts.map +1 -0
- package/dist/interactive/slashCommands.js +102 -0
- package/dist/interactive/slashCommands.js.map +1 -0
- package/dist/interactive/useRackMind.d.ts +30 -0
- package/dist/interactive/useRackMind.d.ts.map +1 -0
- package/dist/interactive/useRackMind.js +241 -0
- package/dist/interactive/useRackMind.js.map +1 -0
- package/dist/oneshot/run.d.ts +2 -0
- package/dist/oneshot/run.d.ts.map +1 -0
- package/dist/oneshot/run.js +195 -0
- package/dist/oneshot/run.js.map +1 -0
- package/dist/server/client.d.ts +89 -0
- package/dist/server/client.d.ts.map +1 -0
- package/dist/server/client.js +239 -0
- package/dist/server/client.js.map +1 -0
- package/dist/server/proxmox.d.ts +160 -0
- package/dist/server/proxmox.d.ts.map +1 -0
- package/dist/server/proxmox.js +219 -0
- package/dist/server/proxmox.js.map +1 -0
- package/dist/server/ssh.d.ts +80 -0
- package/dist/server/ssh.d.ts.map +1 -0
- package/dist/server/ssh.js +262 -0
- package/dist/server/ssh.js.map +1 -0
- package/dist/utils/ascii.d.ts +3 -0
- package/dist/utils/ascii.d.ts.map +1 -0
- package/dist/utils/ascii.js +16 -0
- package/dist/utils/ascii.js.map +1 -0
- package/dist/utils/format.d.ts +7 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +20 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/history.d.ts +23 -0
- package/dist/utils/history.d.ts.map +1 -0
- package/dist/utils/history.js +107 -0
- package/dist/utils/history.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +51 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/markdown.d.ts +12 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/utils/markdown.js +76 -0
- package/dist/utils/markdown.js.map +1 -0
- package/dist/utils/prompt.d.ts +25 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +133 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/retry.d.ts +37 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +122 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/shutdown.d.ts +22 -0
- package/dist/utils/shutdown.d.ts.map +1 -0
- package/dist/utils/shutdown.js +94 -0
- package/dist/utils/shutdown.js.map +1 -0
- package/dist/utils/table.d.ts +38 -0
- package/dist/utils/table.d.ts.map +1 -0
- package/dist/utils/table.js +150 -0
- package/dist/utils/table.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// ServerClient — unified facade over Proxmox API + SSH
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Combines ProxmoxClient (REST API) and SSHConnection into a single interface.
|
|
5
|
+
// Uses the active server profile's decrypted credentials to initialize both.
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
import { ProxmoxClient, } from './proxmox.js';
|
|
8
|
+
import { SSHConnection } from './ssh.js';
|
|
9
|
+
import { getActiveProfile, decryptCredential } from '../config/index.js';
|
|
10
|
+
import { logger } from '../utils/logger.js';
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// ServerClient
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
export class ServerClient {
|
|
15
|
+
profile;
|
|
16
|
+
proxmox;
|
|
17
|
+
ssh;
|
|
18
|
+
resolvedNode = null;
|
|
19
|
+
constructor(profile) {
|
|
20
|
+
this.profile = profile;
|
|
21
|
+
// Initialize Proxmox API client
|
|
22
|
+
const tokenSecret = profile.encryptedTokenSecret
|
|
23
|
+
? decryptCredential(profile.encryptedTokenSecret)
|
|
24
|
+
: '';
|
|
25
|
+
this.proxmox = new ProxmoxClient({
|
|
26
|
+
host: profile.host,
|
|
27
|
+
port: profile.port,
|
|
28
|
+
apiTokenId: profile.apiTokenId,
|
|
29
|
+
apiTokenSecret: tokenSecret,
|
|
30
|
+
allowSelfSigned: profile.allowSelfSigned,
|
|
31
|
+
});
|
|
32
|
+
// Initialize SSH client
|
|
33
|
+
const sshPassword = profile.encryptedSshPassword
|
|
34
|
+
? decryptCredential(profile.encryptedSshPassword)
|
|
35
|
+
: undefined;
|
|
36
|
+
this.ssh = new SSHConnection({
|
|
37
|
+
host: profile.sshHost || profile.host,
|
|
38
|
+
port: profile.sshPort,
|
|
39
|
+
username: profile.sshUsername,
|
|
40
|
+
authType: profile.sshAuthType,
|
|
41
|
+
password: sshPassword,
|
|
42
|
+
privateKeyPath: profile.sshPrivateKeyPath || undefined,
|
|
43
|
+
});
|
|
44
|
+
logger.info('ServerClient initialized', { alias: profile.alias });
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Create a ServerClient from the active server profile in config.
|
|
48
|
+
* Throws if no active server is configured.
|
|
49
|
+
*/
|
|
50
|
+
static fromActiveProfile() {
|
|
51
|
+
const profile = getActiveProfile();
|
|
52
|
+
if (!profile) {
|
|
53
|
+
throw new Error('No active server configured. Run `rackmind connect <alias>` to set one up.');
|
|
54
|
+
}
|
|
55
|
+
return new ServerClient(profile);
|
|
56
|
+
}
|
|
57
|
+
// -----------------------------------------------------------------------
|
|
58
|
+
// Connection lifecycle
|
|
59
|
+
// -----------------------------------------------------------------------
|
|
60
|
+
/** Connect SSH (Proxmox API is stateless, no connect needed) */
|
|
61
|
+
async connectSSH() {
|
|
62
|
+
await this.ssh.connect();
|
|
63
|
+
}
|
|
64
|
+
/** Disconnect SSH */
|
|
65
|
+
disconnectSSH() {
|
|
66
|
+
this.ssh.disconnect();
|
|
67
|
+
}
|
|
68
|
+
/** Test all connections and return status */
|
|
69
|
+
async getStatus() {
|
|
70
|
+
const status = {
|
|
71
|
+
apiConnected: false,
|
|
72
|
+
sshConnected: false,
|
|
73
|
+
proxmoxVersion: null,
|
|
74
|
+
sshHostname: null,
|
|
75
|
+
serverAlias: this.profile.alias,
|
|
76
|
+
apiUrl: `https://${this.profile.host}:${this.profile.port}`,
|
|
77
|
+
node: this.resolvedNode,
|
|
78
|
+
errors: [],
|
|
79
|
+
};
|
|
80
|
+
// Test Proxmox API
|
|
81
|
+
try {
|
|
82
|
+
status.proxmoxVersion = await this.proxmox.testConnection();
|
|
83
|
+
status.apiConnected = true;
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
87
|
+
status.errors.push(`API: ${message}`);
|
|
88
|
+
logger.warn('Proxmox API connection test failed', { error: message });
|
|
89
|
+
}
|
|
90
|
+
// Test SSH
|
|
91
|
+
try {
|
|
92
|
+
if (!this.ssh.isConnected()) {
|
|
93
|
+
await this.ssh.connect();
|
|
94
|
+
}
|
|
95
|
+
status.sshHostname = await this.ssh.testConnection();
|
|
96
|
+
status.sshConnected = true;
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
100
|
+
status.errors.push(`SSH: ${message}`);
|
|
101
|
+
logger.warn('SSH connection test failed', { error: message });
|
|
102
|
+
}
|
|
103
|
+
return status;
|
|
104
|
+
}
|
|
105
|
+
// -----------------------------------------------------------------------
|
|
106
|
+
// Node management
|
|
107
|
+
// -----------------------------------------------------------------------
|
|
108
|
+
/**
|
|
109
|
+
* Get the node name to use for API calls.
|
|
110
|
+
* Uses the profile's configured node, or auto-detects from the API.
|
|
111
|
+
*/
|
|
112
|
+
async getNodeName() {
|
|
113
|
+
if (this.resolvedNode)
|
|
114
|
+
return this.resolvedNode;
|
|
115
|
+
if (this.profile.node) {
|
|
116
|
+
this.resolvedNode = this.profile.node;
|
|
117
|
+
return this.resolvedNode;
|
|
118
|
+
}
|
|
119
|
+
// Auto-detect from API
|
|
120
|
+
this.resolvedNode = await this.proxmox.detectNodeName();
|
|
121
|
+
logger.info('Auto-detected node name', { node: this.resolvedNode });
|
|
122
|
+
return this.resolvedNode;
|
|
123
|
+
}
|
|
124
|
+
/** List all nodes in the cluster */
|
|
125
|
+
async listNodes() {
|
|
126
|
+
return await this.proxmox.listNodes();
|
|
127
|
+
}
|
|
128
|
+
/** Get status of a specific node */
|
|
129
|
+
async getNodeStatus(node) {
|
|
130
|
+
const nodeName = node ?? (await this.getNodeName());
|
|
131
|
+
return this.proxmox.getNodeStatus(nodeName);
|
|
132
|
+
}
|
|
133
|
+
// -----------------------------------------------------------------------
|
|
134
|
+
// Containers (LXC)
|
|
135
|
+
// -----------------------------------------------------------------------
|
|
136
|
+
/** List all LXC containers on the active node */
|
|
137
|
+
async listContainers(node) {
|
|
138
|
+
const nodeName = node ?? (await this.getNodeName());
|
|
139
|
+
return this.proxmox.listContainers(nodeName);
|
|
140
|
+
}
|
|
141
|
+
/** Get status of an LXC container */
|
|
142
|
+
async getContainerStatus(vmid, node) {
|
|
143
|
+
const nodeName = node ?? (await this.getNodeName());
|
|
144
|
+
return this.proxmox.getContainerStatus(nodeName, vmid);
|
|
145
|
+
}
|
|
146
|
+
/** Get configuration of an LXC container */
|
|
147
|
+
async getContainerConfig(vmid, node) {
|
|
148
|
+
const nodeName = node ?? (await this.getNodeName());
|
|
149
|
+
return this.proxmox.getContainerConfig(nodeName, vmid);
|
|
150
|
+
}
|
|
151
|
+
/** Start an LXC container */
|
|
152
|
+
async startContainer(vmid, node) {
|
|
153
|
+
const nodeName = node ?? (await this.getNodeName());
|
|
154
|
+
return this.proxmox.startContainer(nodeName, vmid);
|
|
155
|
+
}
|
|
156
|
+
/** Stop an LXC container */
|
|
157
|
+
async stopContainer(vmid, node) {
|
|
158
|
+
const nodeName = node ?? (await this.getNodeName());
|
|
159
|
+
return this.proxmox.stopContainer(nodeName, vmid);
|
|
160
|
+
}
|
|
161
|
+
/** Restart an LXC container */
|
|
162
|
+
async restartContainer(vmid, node) {
|
|
163
|
+
const nodeName = node ?? (await this.getNodeName());
|
|
164
|
+
return this.proxmox.restartContainer(nodeName, vmid);
|
|
165
|
+
}
|
|
166
|
+
// -----------------------------------------------------------------------
|
|
167
|
+
// Virtual Machines (QEMU)
|
|
168
|
+
// -----------------------------------------------------------------------
|
|
169
|
+
/** List all QEMU VMs on the active node */
|
|
170
|
+
async listVMs(node) {
|
|
171
|
+
const nodeName = node ?? (await this.getNodeName());
|
|
172
|
+
return this.proxmox.listVMs(nodeName);
|
|
173
|
+
}
|
|
174
|
+
/** Get status of a QEMU VM */
|
|
175
|
+
async getVMStatus(vmid, node) {
|
|
176
|
+
const nodeName = node ?? (await this.getNodeName());
|
|
177
|
+
return this.proxmox.getVMStatus(nodeName, vmid);
|
|
178
|
+
}
|
|
179
|
+
/** Get configuration of a QEMU VM */
|
|
180
|
+
async getVMConfig(vmid, node) {
|
|
181
|
+
const nodeName = node ?? (await this.getNodeName());
|
|
182
|
+
return this.proxmox.getVMConfig(nodeName, vmid);
|
|
183
|
+
}
|
|
184
|
+
/** Start a QEMU VM */
|
|
185
|
+
async startVM(vmid, node) {
|
|
186
|
+
const nodeName = node ?? (await this.getNodeName());
|
|
187
|
+
return this.proxmox.startVM(nodeName, vmid);
|
|
188
|
+
}
|
|
189
|
+
/** Stop a QEMU VM */
|
|
190
|
+
async stopVM(vmid, node) {
|
|
191
|
+
const nodeName = node ?? (await this.getNodeName());
|
|
192
|
+
return this.proxmox.stopVM(nodeName, vmid);
|
|
193
|
+
}
|
|
194
|
+
/** Restart a QEMU VM */
|
|
195
|
+
async restartVM(vmid, node) {
|
|
196
|
+
const nodeName = node ?? (await this.getNodeName());
|
|
197
|
+
return this.proxmox.restartVM(nodeName, vmid);
|
|
198
|
+
}
|
|
199
|
+
// -----------------------------------------------------------------------
|
|
200
|
+
// Cluster resources
|
|
201
|
+
// -----------------------------------------------------------------------
|
|
202
|
+
/** Get all resources across the cluster */
|
|
203
|
+
async listResources(type) {
|
|
204
|
+
return await this.proxmox.listResources(type);
|
|
205
|
+
}
|
|
206
|
+
// -----------------------------------------------------------------------
|
|
207
|
+
// SSH command execution
|
|
208
|
+
// -----------------------------------------------------------------------
|
|
209
|
+
/** Execute a command on the Proxmox host via SSH (auto-reconnects) */
|
|
210
|
+
async execOnHost(command) {
|
|
211
|
+
await this.ssh.ensureConnectedOrReconnect();
|
|
212
|
+
return this.ssh.exec(command);
|
|
213
|
+
}
|
|
214
|
+
/** Execute a command on the Proxmox host with streaming output (auto-reconnects) */
|
|
215
|
+
async execOnHostStream(command, onData) {
|
|
216
|
+
await this.ssh.ensureConnectedOrReconnect();
|
|
217
|
+
return this.ssh.execStream(command, onData);
|
|
218
|
+
}
|
|
219
|
+
/** Execute a command inside an LXC container via SSH + pct exec (auto-reconnects) */
|
|
220
|
+
async execInContainer(vmid, command) {
|
|
221
|
+
await this.ssh.ensureConnectedOrReconnect();
|
|
222
|
+
return this.ssh.execInContainer(vmid, command);
|
|
223
|
+
}
|
|
224
|
+
/** Execute a command inside an LXC container with streaming output (auto-reconnects) */
|
|
225
|
+
async execInContainerStream(vmid, command, onData) {
|
|
226
|
+
await this.ssh.ensureConnectedOrReconnect();
|
|
227
|
+
return this.ssh.execInContainerStream(vmid, command, onData);
|
|
228
|
+
}
|
|
229
|
+
/** Clean up all connections */
|
|
230
|
+
dispose() {
|
|
231
|
+
this.disconnectSSH();
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// ---------------------------------------------------------------------------
|
|
235
|
+
// Re-exports for convenience
|
|
236
|
+
// ---------------------------------------------------------------------------
|
|
237
|
+
export { ProxmoxClient, ProxmoxApiError } from './proxmox.js';
|
|
238
|
+
export { SSHConnection, SSHConnectionError } from './ssh.js';
|
|
239
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/server/client.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,uDAAuD;AACvD,8EAA8E;AAC9E,+EAA+E;AAC/E,6EAA6E;AAC7E,8EAA8E;AAE9E,OAAO,EACH,aAAa,GAQhB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAA2C,MAAM,UAAU,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEzE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAyB5C,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,OAAO,YAAY;IACJ,OAAO,CAAgB;IACvB,OAAO,CAAgB;IACvB,GAAG,CAAgB;IAC5B,YAAY,GAAkB,IAAI,CAAC;IAE3C,YAAY,OAAsB;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,gCAAgC;QAChC,MAAM,WAAW,GAAG,OAAO,CAAC,oBAAoB;YAC5C,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,oBAAoB,CAAC;YACjD,CAAC,CAAC,EAAE,CAAC;QAET,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC;YAC7B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,cAAc,EAAE,WAAW;YAC3B,eAAe,EAAE,OAAO,CAAC,eAAe;SAC3C,CAAC,CAAC;QAEH,wBAAwB;QACxB,MAAM,WAAW,GAAG,OAAO,CAAC,oBAAoB;YAC5C,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,oBAAoB,CAAC;YACjD,CAAC,CAAC,SAAS,CAAC;QAEhB,IAAI,CAAC,GAAG,GAAG,IAAI,aAAa,CAAC;YACzB,IAAI,EAAE,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI;YACrC,IAAI,EAAE,OAAO,CAAC,OAAO;YACrB,QAAQ,EAAE,OAAO,CAAC,WAAW;YAC7B,QAAQ,EAAE,OAAO,CAAC,WAAW;YAC7B,QAAQ,EAAE,WAAW;YACrB,cAAc,EAAE,OAAO,CAAC,iBAAiB,IAAI,SAAS;SACzD,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,iBAAiB;QACpB,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACX,4EAA4E,CAC/E,CAAC;QACN,CAAC;QACD,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,0EAA0E;IAC1E,uBAAuB;IACvB,0EAA0E;IAE1E,gEAAgE;IAChE,KAAK,CAAC,UAAU;QACZ,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,qBAAqB;IACrB,aAAa;QACT,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,SAAS;QACX,MAAM,MAAM,GAAiB;YACzB,YAAY,EAAE,KAAK;YACnB,YAAY,EAAE,KAAK;YACnB,cAAc,EAAE,IAAI;YACpB,WAAW,EAAE,IAAI;YACjB,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;YAC/B,MAAM,EAAE,WAAW,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAC3D,IAAI,EAAE,IAAI,CAAC,YAAY;YACvB,MAAM,EAAE,EAAE;SACb,CAAC;QAEF,mBAAmB;QACnB,IAAI,CAAC;YACD,MAAM,CAAC,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAC5D,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,WAAW;QACX,IAAI,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC1B,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAC7B,CAAC;YACD,MAAM,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;YACrD,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,0EAA0E;IAC1E,kBAAkB;IAClB,0EAA0E;IAE1E;;;OAGG;IACH,KAAK,CAAC,WAAW;QACb,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC;QAEhD,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACtC,OAAO,IAAI,CAAC,YAAY,CAAC;QAC7B,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,oCAAoC;IACpC,KAAK,CAAC,SAAS;QACX,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;IAC1C,CAAC;IAED,oCAAoC;IACpC,KAAK,CAAC,aAAa,CAAC,IAAa;QAC7B,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,0EAA0E;IAC1E,mBAAmB;IACnB,0EAA0E;IAE1E,iDAAiD;IACjD,KAAK,CAAC,cAAc,CAAC,IAAa;QAC9B,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,kBAAkB,CAAC,IAAY,EAAE,IAAa;QAChD,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,kBAAkB,CAAC,IAAY,EAAE,IAAa;QAChD,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,6BAA6B;IAC7B,KAAK,CAAC,cAAc,CAAC,IAAY,EAAE,IAAa;QAC5C,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,IAAa;QAC3C,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,+BAA+B;IAC/B,KAAK,CAAC,gBAAgB,CAAC,IAAY,EAAE,IAAa;QAC9C,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;IAED,0EAA0E;IAC1E,0BAA0B;IAC1B,0EAA0E;IAE1E,2CAA2C;IAC3C,KAAK,CAAC,OAAO,CAAC,IAAa;QACvB,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,8BAA8B;IAC9B,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,IAAa;QACzC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,IAAa;QACzC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;IAED,sBAAsB;IACtB,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,IAAa;QACrC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,qBAAqB;IACrB,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,IAAa;QACpC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED,wBAAwB;IACxB,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,IAAa;QACvC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,0EAA0E;IAC1E,oBAAoB;IACpB,0EAA0E;IAE1E,2CAA2C;IAC3C,KAAK,CAAC,aAAa,CAAC,IAAa;QAC7B,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,0EAA0E;IAC1E,wBAAwB;IACxB,0EAA0E;IAE1E,sEAAsE;IACtE,KAAK,CAAC,UAAU,CAAC,OAAe;QAC5B,MAAM,IAAI,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,oFAAoF;IACpF,KAAK,CAAC,gBAAgB,CAAC,OAAe,EAAE,MAAsB;QAC1D,MAAM,IAAI,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,qFAAqF;IACrF,KAAK,CAAC,eAAe,CAAC,IAAY,EAAE,OAAe;QAC/C,MAAM,IAAI,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,wFAAwF;IACxF,KAAK,CAAC,qBAAqB,CACvB,IAAY,EACZ,OAAe,EACf,MAAsB;QAEtB,MAAM,IAAI,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,+BAA+B;IAC/B,OAAO;QACH,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;CACJ;AAED,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/** Node summary from GET /api2/json/nodes */
|
|
2
|
+
export interface ProxmoxNode {
|
|
3
|
+
node: string;
|
|
4
|
+
status: string;
|
|
5
|
+
cpu: number;
|
|
6
|
+
maxcpu: number;
|
|
7
|
+
mem: number;
|
|
8
|
+
maxmem: number;
|
|
9
|
+
disk: number;
|
|
10
|
+
maxdisk: number;
|
|
11
|
+
uptime: number;
|
|
12
|
+
type: string;
|
|
13
|
+
id: string;
|
|
14
|
+
}
|
|
15
|
+
/** LXC container summary from GET /api2/json/nodes/{node}/lxc */
|
|
16
|
+
export interface ProxmoxContainer {
|
|
17
|
+
vmid: number;
|
|
18
|
+
name: string;
|
|
19
|
+
status: string;
|
|
20
|
+
type: string;
|
|
21
|
+
cpus: number;
|
|
22
|
+
mem: number;
|
|
23
|
+
maxmem: number;
|
|
24
|
+
disk: number;
|
|
25
|
+
maxdisk: number;
|
|
26
|
+
uptime: number;
|
|
27
|
+
netin: number;
|
|
28
|
+
netout: number;
|
|
29
|
+
}
|
|
30
|
+
/** QEMU VM summary from GET /api2/json/nodes/{node}/qemu */
|
|
31
|
+
export interface ProxmoxVM {
|
|
32
|
+
vmid: number;
|
|
33
|
+
name: string;
|
|
34
|
+
status: string;
|
|
35
|
+
cpus: number;
|
|
36
|
+
mem: number;
|
|
37
|
+
maxmem: number;
|
|
38
|
+
disk: number;
|
|
39
|
+
maxdisk: number;
|
|
40
|
+
uptime: number;
|
|
41
|
+
netin: number;
|
|
42
|
+
netout: number;
|
|
43
|
+
pid?: number;
|
|
44
|
+
}
|
|
45
|
+
/** VM/Container config (subset of common fields) */
|
|
46
|
+
export interface ProxmoxGuestConfig {
|
|
47
|
+
name?: string;
|
|
48
|
+
description?: string;
|
|
49
|
+
cores?: number;
|
|
50
|
+
memory?: number;
|
|
51
|
+
ostype?: string;
|
|
52
|
+
net0?: string;
|
|
53
|
+
rootfs?: string;
|
|
54
|
+
[key: string]: unknown;
|
|
55
|
+
}
|
|
56
|
+
/** VM/Container current status */
|
|
57
|
+
export interface ProxmoxGuestStatus {
|
|
58
|
+
status: string;
|
|
59
|
+
vmid: number;
|
|
60
|
+
name: string;
|
|
61
|
+
cpus: number;
|
|
62
|
+
mem: number;
|
|
63
|
+
maxmem: number;
|
|
64
|
+
disk: number;
|
|
65
|
+
maxdisk: number;
|
|
66
|
+
uptime: number;
|
|
67
|
+
cpu: number;
|
|
68
|
+
netin: number;
|
|
69
|
+
netout: number;
|
|
70
|
+
pid?: number;
|
|
71
|
+
}
|
|
72
|
+
/** Resource usage entry from GET /api2/json/cluster/resources */
|
|
73
|
+
export interface ProxmoxResource {
|
|
74
|
+
id: string;
|
|
75
|
+
type: string;
|
|
76
|
+
node: string;
|
|
77
|
+
status: string;
|
|
78
|
+
vmid?: number;
|
|
79
|
+
name?: string;
|
|
80
|
+
cpu?: number;
|
|
81
|
+
maxcpu?: number;
|
|
82
|
+
mem?: number;
|
|
83
|
+
maxmem?: number;
|
|
84
|
+
disk?: number;
|
|
85
|
+
maxdisk?: number;
|
|
86
|
+
uptime?: number;
|
|
87
|
+
}
|
|
88
|
+
/** Proxmox version info from GET /api2/json/version */
|
|
89
|
+
export interface ProxmoxVersion {
|
|
90
|
+
version: string;
|
|
91
|
+
release: string;
|
|
92
|
+
repoid: string;
|
|
93
|
+
}
|
|
94
|
+
export interface ProxmoxClientOptions {
|
|
95
|
+
/** Proxmox host (IP or hostname) */
|
|
96
|
+
host: string;
|
|
97
|
+
/** Proxmox API port (default: 8006) */
|
|
98
|
+
port: number;
|
|
99
|
+
/** API token ID (e.g., root@pam!rackmind) */
|
|
100
|
+
apiTokenId: string;
|
|
101
|
+
/** API token secret (decrypted) */
|
|
102
|
+
apiTokenSecret: string;
|
|
103
|
+
/** Allow self-signed TLS certificates (default: true) */
|
|
104
|
+
allowSelfSigned?: boolean;
|
|
105
|
+
}
|
|
106
|
+
export declare class ProxmoxClient {
|
|
107
|
+
private readonly baseUrl;
|
|
108
|
+
private readonly authHeader;
|
|
109
|
+
private readonly allowSelfSigned;
|
|
110
|
+
constructor(options: ProxmoxClientOptions);
|
|
111
|
+
private buildFetchOptions;
|
|
112
|
+
private request;
|
|
113
|
+
get<T>(path: string): Promise<T>;
|
|
114
|
+
post<T>(path: string, body?: Record<string, unknown>): Promise<T>;
|
|
115
|
+
put<T>(path: string, body?: Record<string, unknown>): Promise<T>;
|
|
116
|
+
del<T>(path: string): Promise<T>;
|
|
117
|
+
/** Test the connection by fetching the Proxmox version */
|
|
118
|
+
testConnection(): Promise<ProxmoxVersion>;
|
|
119
|
+
/** List all nodes in the cluster */
|
|
120
|
+
listNodes(): Promise<ProxmoxNode[]>;
|
|
121
|
+
/** Get status of a specific node */
|
|
122
|
+
getNodeStatus(node: string): Promise<ProxmoxNode>;
|
|
123
|
+
/** List all LXC containers on a node */
|
|
124
|
+
listContainers(node: string): Promise<ProxmoxContainer[]>;
|
|
125
|
+
/** Get current status of an LXC container */
|
|
126
|
+
getContainerStatus(node: string, vmid: number): Promise<ProxmoxGuestStatus>;
|
|
127
|
+
/** Get configuration of an LXC container */
|
|
128
|
+
getContainerConfig(node: string, vmid: number): Promise<ProxmoxGuestConfig>;
|
|
129
|
+
/** Start an LXC container */
|
|
130
|
+
startContainer(node: string, vmid: number): Promise<string>;
|
|
131
|
+
/** Stop an LXC container */
|
|
132
|
+
stopContainer(node: string, vmid: number): Promise<string>;
|
|
133
|
+
/** Restart (reboot) an LXC container */
|
|
134
|
+
restartContainer(node: string, vmid: number): Promise<string>;
|
|
135
|
+
/** List all QEMU VMs on a node */
|
|
136
|
+
listVMs(node: string): Promise<ProxmoxVM[]>;
|
|
137
|
+
/** Get current status of a QEMU VM */
|
|
138
|
+
getVMStatus(node: string, vmid: number): Promise<ProxmoxGuestStatus>;
|
|
139
|
+
/** Get configuration of a QEMU VM */
|
|
140
|
+
getVMConfig(node: string, vmid: number): Promise<ProxmoxGuestConfig>;
|
|
141
|
+
/** Start a QEMU VM */
|
|
142
|
+
startVM(node: string, vmid: number): Promise<string>;
|
|
143
|
+
/** Stop a QEMU VM */
|
|
144
|
+
stopVM(node: string, vmid: number): Promise<string>;
|
|
145
|
+
/** Restart (reboot) a QEMU VM */
|
|
146
|
+
restartVM(node: string, vmid: number): Promise<string>;
|
|
147
|
+
/** Get all resources across the cluster */
|
|
148
|
+
listResources(type?: string): Promise<ProxmoxResource[]>;
|
|
149
|
+
/**
|
|
150
|
+
* Auto-detect the first available node name.
|
|
151
|
+
* Useful when the user hasn't specified a node in their profile.
|
|
152
|
+
*/
|
|
153
|
+
detectNodeName(): Promise<string>;
|
|
154
|
+
}
|
|
155
|
+
export declare class ProxmoxApiError extends Error {
|
|
156
|
+
readonly statusCode: number;
|
|
157
|
+
readonly responseBody: string;
|
|
158
|
+
constructor(message: string, statusCode: number, responseBody: string);
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=proxmox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxmox.d.ts","sourceRoot":"","sources":["../../src/server/proxmox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Proxmox VE API client — HTTP client for Proxmox REST API
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Authenticates via PVEAPIToken header. Supports self-signed TLS certificates.
|
|
5
|
+
// Uses native fetch (Node 18+) — no axios needed.
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
import { Agent } from 'node:https';
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Proxmox API Client
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
export class ProxmoxClient {
|
|
13
|
+
baseUrl;
|
|
14
|
+
authHeader;
|
|
15
|
+
allowSelfSigned;
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.baseUrl = `https://${options.host}:${options.port}/api2/json`;
|
|
18
|
+
this.authHeader = `PVEAPIToken=${options.apiTokenId}=${options.apiTokenSecret}`;
|
|
19
|
+
this.allowSelfSigned = options.allowSelfSigned ?? true;
|
|
20
|
+
logger.debug('ProxmoxClient initialized', {
|
|
21
|
+
host: options.host,
|
|
22
|
+
port: options.port,
|
|
23
|
+
tokenId: options.apiTokenId,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
// -----------------------------------------------------------------------
|
|
27
|
+
// Core HTTP methods
|
|
28
|
+
// -----------------------------------------------------------------------
|
|
29
|
+
buildFetchOptions(method, body) {
|
|
30
|
+
const headers = {
|
|
31
|
+
Authorization: this.authHeader,
|
|
32
|
+
Accept: 'application/json',
|
|
33
|
+
};
|
|
34
|
+
const init = {
|
|
35
|
+
method,
|
|
36
|
+
headers,
|
|
37
|
+
};
|
|
38
|
+
if (body) {
|
|
39
|
+
headers['Content-Type'] = 'application/json';
|
|
40
|
+
init.body = JSON.stringify(body);
|
|
41
|
+
}
|
|
42
|
+
// Handle self-signed certificates
|
|
43
|
+
if (this.allowSelfSigned) {
|
|
44
|
+
// Node 18+ supports dispatcher option for custom agents
|
|
45
|
+
// We use the undici-compatible approach via env or agent
|
|
46
|
+
init['dispatcher'] = new Agent({
|
|
47
|
+
rejectUnauthorized: false,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return init;
|
|
51
|
+
}
|
|
52
|
+
async request(method, path, body) {
|
|
53
|
+
const url = `${this.baseUrl}${path}`;
|
|
54
|
+
logger.debug(`Proxmox API ${method} ${path}`);
|
|
55
|
+
// For self-signed certs, we need to temporarily disable TLS verification
|
|
56
|
+
// Node's native fetch doesn't support custom agents directly,
|
|
57
|
+
// so we use the NODE_TLS_REJECT_UNAUTHORIZED approach scoped to this request
|
|
58
|
+
const originalTlsSetting = process.env['NODE_TLS_REJECT_UNAUTHORIZED'];
|
|
59
|
+
try {
|
|
60
|
+
if (this.allowSelfSigned) {
|
|
61
|
+
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
|
|
62
|
+
}
|
|
63
|
+
const response = await fetch(url, this.buildFetchOptions(method, body));
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
const errorBody = await response.text().catch(() => 'unknown');
|
|
66
|
+
throw new ProxmoxApiError(`Proxmox API error: ${response.status} ${response.statusText}`, response.status, errorBody);
|
|
67
|
+
}
|
|
68
|
+
const json = (await response.json());
|
|
69
|
+
return json.data;
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
if (err instanceof ProxmoxApiError)
|
|
73
|
+
throw err;
|
|
74
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
75
|
+
logger.error(`Proxmox API request failed: ${method} ${path}`, { error: message });
|
|
76
|
+
if (message.includes('ECONNREFUSED')) {
|
|
77
|
+
throw new ProxmoxApiError(`Cannot connect to Proxmox at ${this.baseUrl} — connection refused`, 0, message);
|
|
78
|
+
}
|
|
79
|
+
if (message.includes('ETIMEDOUT') || message.includes('timeout')) {
|
|
80
|
+
throw new ProxmoxApiError(`Connection to Proxmox timed out — check host and port`, 0, message);
|
|
81
|
+
}
|
|
82
|
+
if (message.includes('ENOTFOUND')) {
|
|
83
|
+
throw new ProxmoxApiError(`Cannot resolve Proxmox hostname — check host configuration`, 0, message);
|
|
84
|
+
}
|
|
85
|
+
throw new ProxmoxApiError(`Proxmox API request failed: ${message}`, 0, message);
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
// Restore original TLS setting
|
|
89
|
+
if (originalTlsSetting === undefined) {
|
|
90
|
+
delete process.env['NODE_TLS_REJECT_UNAUTHORIZED'];
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = originalTlsSetting;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async get(path) {
|
|
98
|
+
return await this.request('GET', path);
|
|
99
|
+
}
|
|
100
|
+
async post(path, body) {
|
|
101
|
+
return await this.request('POST', path, body);
|
|
102
|
+
}
|
|
103
|
+
async put(path, body) {
|
|
104
|
+
return await this.request('PUT', path, body);
|
|
105
|
+
}
|
|
106
|
+
async del(path) {
|
|
107
|
+
return await this.request('DELETE', path);
|
|
108
|
+
}
|
|
109
|
+
// -----------------------------------------------------------------------
|
|
110
|
+
// Connection test
|
|
111
|
+
// -----------------------------------------------------------------------
|
|
112
|
+
/** Test the connection by fetching the Proxmox version */
|
|
113
|
+
async testConnection() {
|
|
114
|
+
return await this.get('/version');
|
|
115
|
+
}
|
|
116
|
+
// -----------------------------------------------------------------------
|
|
117
|
+
// Nodes
|
|
118
|
+
// -----------------------------------------------------------------------
|
|
119
|
+
/** List all nodes in the cluster */
|
|
120
|
+
async listNodes() {
|
|
121
|
+
return await this.get('/nodes');
|
|
122
|
+
}
|
|
123
|
+
/** Get status of a specific node */
|
|
124
|
+
async getNodeStatus(node) {
|
|
125
|
+
return await this.get(`/nodes/${encodeURIComponent(node)}/status`);
|
|
126
|
+
}
|
|
127
|
+
// -----------------------------------------------------------------------
|
|
128
|
+
// Containers (LXC)
|
|
129
|
+
// -----------------------------------------------------------------------
|
|
130
|
+
/** List all LXC containers on a node */
|
|
131
|
+
async listContainers(node) {
|
|
132
|
+
return await this.get(`/nodes/${encodeURIComponent(node)}/lxc`);
|
|
133
|
+
}
|
|
134
|
+
/** Get current status of an LXC container */
|
|
135
|
+
async getContainerStatus(node, vmid) {
|
|
136
|
+
return await this.get(`/nodes/${encodeURIComponent(node)}/lxc/${vmid}/status/current`);
|
|
137
|
+
}
|
|
138
|
+
/** Get configuration of an LXC container */
|
|
139
|
+
async getContainerConfig(node, vmid) {
|
|
140
|
+
return await this.get(`/nodes/${encodeURIComponent(node)}/lxc/${vmid}/config`);
|
|
141
|
+
}
|
|
142
|
+
/** Start an LXC container */
|
|
143
|
+
async startContainer(node, vmid) {
|
|
144
|
+
return await this.post(`/nodes/${encodeURIComponent(node)}/lxc/${vmid}/status/start`);
|
|
145
|
+
}
|
|
146
|
+
/** Stop an LXC container */
|
|
147
|
+
async stopContainer(node, vmid) {
|
|
148
|
+
return await this.post(`/nodes/${encodeURIComponent(node)}/lxc/${vmid}/status/stop`);
|
|
149
|
+
}
|
|
150
|
+
/** Restart (reboot) an LXC container */
|
|
151
|
+
async restartContainer(node, vmid) {
|
|
152
|
+
return await this.post(`/nodes/${encodeURIComponent(node)}/lxc/${vmid}/status/reboot`);
|
|
153
|
+
}
|
|
154
|
+
// -----------------------------------------------------------------------
|
|
155
|
+
// Virtual Machines (QEMU)
|
|
156
|
+
// -----------------------------------------------------------------------
|
|
157
|
+
/** List all QEMU VMs on a node */
|
|
158
|
+
async listVMs(node) {
|
|
159
|
+
return await this.get(`/nodes/${encodeURIComponent(node)}/qemu`);
|
|
160
|
+
}
|
|
161
|
+
/** Get current status of a QEMU VM */
|
|
162
|
+
async getVMStatus(node, vmid) {
|
|
163
|
+
return await this.get(`/nodes/${encodeURIComponent(node)}/qemu/${vmid}/status/current`);
|
|
164
|
+
}
|
|
165
|
+
/** Get configuration of a QEMU VM */
|
|
166
|
+
async getVMConfig(node, vmid) {
|
|
167
|
+
return await this.get(`/nodes/${encodeURIComponent(node)}/qemu/${vmid}/config`);
|
|
168
|
+
}
|
|
169
|
+
/** Start a QEMU VM */
|
|
170
|
+
async startVM(node, vmid) {
|
|
171
|
+
return await this.post(`/nodes/${encodeURIComponent(node)}/qemu/${vmid}/status/start`);
|
|
172
|
+
}
|
|
173
|
+
/** Stop a QEMU VM */
|
|
174
|
+
async stopVM(node, vmid) {
|
|
175
|
+
return await this.post(`/nodes/${encodeURIComponent(node)}/qemu/${vmid}/status/stop`);
|
|
176
|
+
}
|
|
177
|
+
/** Restart (reboot) a QEMU VM */
|
|
178
|
+
async restartVM(node, vmid) {
|
|
179
|
+
return await this.post(`/nodes/${encodeURIComponent(node)}/qemu/${vmid}/status/reboot`);
|
|
180
|
+
}
|
|
181
|
+
// -----------------------------------------------------------------------
|
|
182
|
+
// Cluster resources
|
|
183
|
+
// -----------------------------------------------------------------------
|
|
184
|
+
/** Get all resources across the cluster */
|
|
185
|
+
async listResources(type) {
|
|
186
|
+
const query = type ? `?type=${encodeURIComponent(type)}` : '';
|
|
187
|
+
return await this.get(`/cluster/resources${query}`);
|
|
188
|
+
}
|
|
189
|
+
// -----------------------------------------------------------------------
|
|
190
|
+
// Utility: auto-detect node name
|
|
191
|
+
// -----------------------------------------------------------------------
|
|
192
|
+
/**
|
|
193
|
+
* Auto-detect the first available node name.
|
|
194
|
+
* Useful when the user hasn't specified a node in their profile.
|
|
195
|
+
*/
|
|
196
|
+
async detectNodeName() {
|
|
197
|
+
const nodes = await this.listNodes();
|
|
198
|
+
if (nodes.length === 0) {
|
|
199
|
+
throw new ProxmoxApiError('No nodes found in the Proxmox cluster', 0, '');
|
|
200
|
+
}
|
|
201
|
+
// Return the first online node, or first node if none are explicitly online
|
|
202
|
+
const onlineNode = nodes.find((n) => n.status === 'online');
|
|
203
|
+
return (onlineNode ?? nodes[0]).node;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
// Custom error class
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
export class ProxmoxApiError extends Error {
|
|
210
|
+
statusCode;
|
|
211
|
+
responseBody;
|
|
212
|
+
constructor(message, statusCode, responseBody) {
|
|
213
|
+
super(message);
|
|
214
|
+
this.name = 'ProxmoxApiError';
|
|
215
|
+
this.statusCode = statusCode;
|
|
216
|
+
this.responseBody = responseBody;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=proxmox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxmox.js","sourceRoot":"","sources":["../../src/server/proxmox.ts"],"names":[],"mappings":"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"}
|