@bldg-7/proxmox-mcp 0.1.0
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/LICENSE +21 -0
- package/README.md +1033 -0
- package/dist/client/proxmox.d.ts +14 -0
- package/dist/client/proxmox.d.ts.map +1 -0
- package/dist/client/proxmox.js +82 -0
- package/dist/client/proxmox.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +24 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +31 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +32 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/formatters/index.d.ts +42 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +85 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/index.d.ts +41 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +69 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/prompts/index.d.ts +2 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +2 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/index.d.ts +2 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +2 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/schemas/backup.d.ts +101 -0
- package/dist/schemas/backup.d.ts.map +1 -0
- package/dist/schemas/backup.js +43 -0
- package/dist/schemas/backup.js.map +1 -0
- package/dist/schemas/disk.d.ts +144 -0
- package/dist/schemas/disk.d.ts.map +1 -0
- package/dist/schemas/disk.js +60 -0
- package/dist/schemas/disk.js.map +1 -0
- package/dist/schemas/index.d.ts +7 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +7 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/network.d.ts +140 -0
- package/dist/schemas/network.d.ts.map +1 -0
- package/dist/schemas/network.js +56 -0
- package/dist/schemas/network.js.map +1 -0
- package/dist/schemas/node.d.ts +16 -0
- package/dist/schemas/node.d.ts.map +1 -0
- package/dist/schemas/node.js +12 -0
- package/dist/schemas/node.js.map +1 -0
- package/dist/schemas/snapshot.d.ts +116 -0
- package/dist/schemas/snapshot.d.ts.map +1 -0
- package/dist/schemas/snapshot.js +34 -0
- package/dist/schemas/snapshot.js.map +1 -0
- package/dist/schemas/vm.d.ts +330 -0
- package/dist/schemas/vm.d.ts.map +1 -0
- package/dist/schemas/vm.js +111 -0
- package/dist/schemas/vm.js.map +1 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +142 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/backup.d.ts +35 -0
- package/dist/tools/backup.d.ts.map +1 -0
- package/dist/tools/backup.js +210 -0
- package/dist/tools/backup.js.map +1 -0
- package/dist/tools/cluster.d.ts +15 -0
- package/dist/tools/cluster.d.ts.map +1 -0
- package/dist/tools/cluster.js +82 -0
- package/dist/tools/cluster.js.map +1 -0
- package/dist/tools/command.d.ts +6 -0
- package/dist/tools/command.d.ts.map +1 -0
- package/dist/tools/command.js +26 -0
- package/dist/tools/command.js.map +1 -0
- package/dist/tools/disk.d.ts +45 -0
- package/dist/tools/disk.d.ts.map +1 -0
- package/dist/tools/disk.js +243 -0
- package/dist/tools/disk.js.map +1 -0
- package/dist/tools/index.d.ts +12 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +20 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/network.d.ts +35 -0
- package/dist/tools/network.d.ts.map +1 -0
- package/dist/tools/network.js +270 -0
- package/dist/tools/network.js.map +1 -0
- package/dist/tools/node.d.ts +15 -0
- package/dist/tools/node.d.ts.map +1 -0
- package/dist/tools/node.js +73 -0
- package/dist/tools/node.js.map +1 -0
- package/dist/tools/registry.d.ts +12 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +87 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/snapshot.d.ts +45 -0
- package/dist/tools/snapshot.d.ts.map +1 -0
- package/dist/tools/snapshot.js +249 -0
- package/dist/tools/snapshot.js.map +1 -0
- package/dist/tools/vm-create.d.ts +8 -0
- package/dist/tools/vm-create.d.ts.map +1 -0
- package/dist/tools/vm-create.js +129 -0
- package/dist/tools/vm-create.js.map +1 -0
- package/dist/tools/vm-lifecycle.d.ts +67 -0
- package/dist/tools/vm-lifecycle.d.ts.map +1 -0
- package/dist/tools/vm-lifecycle.js +319 -0
- package/dist/tools/vm-lifecycle.js.map +1 -0
- package/dist/tools/vm-modify.d.ts +25 -0
- package/dist/tools/vm-modify.d.ts.map +1 -0
- package/dist/tools/vm-modify.js +155 -0
- package/dist/tools/vm-modify.js.map +1 -0
- package/dist/tools/vm-query.d.ts +20 -0
- package/dist/tools/vm-query.d.ts.map +1 -0
- package/dist/tools/vm-query.js +166 -0
- package/dist/tools/vm-query.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/proxmox.d.ts +166 -0
- package/dist/types/proxmox.d.ts.map +1 -0
- package/dist/types/proxmox.js +2 -0
- package/dist/types/proxmox.js.map +1 -0
- package/dist/types/tools.d.ts +12 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +64 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/validators/index.d.ts +75 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/index.js +185 -0
- package/dist/validators/index.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/types/tools.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,mBAAmB;IACnB,yBAAyB;IACzB,iBAAiB;IACjB,uBAAuB;IACvB,4BAA4B;IAC5B,qBAAqB;IACrB,4BAA4B;IAC5B,wBAAwB;IACxB,oBAAoB;IACpB,mBAAmB;IACnB,uBAAuB;IACvB,mBAAmB;IACnB,kBAAkB;IAClB,kBAAkB;IAClB,iBAAiB;IACjB,oBAAoB;IACpB,mBAAmB;IACnB,oBAAoB;IACpB,mBAAmB;IACnB,sBAAsB;IACtB,qBAAqB;IACrB,kBAAkB;IAClB,mBAAmB;IACnB,mBAAmB;IACnB,kBAAkB;IAClB,oBAAoB;IACpB,mBAAmB;IACnB,6BAA6B;IAC7B,4BAA4B;IAC5B,4BAA4B;IAC5B,2BAA2B;IAC3B,+BAA+B;IAC/B,8BAA8B;IAC9B,6BAA6B;IAC7B,4BAA4B;IAC5B,2BAA2B;IAC3B,0BAA0B;IAC1B,sBAAsB;IACtB,4BAA4B;IAC5B,2BAA2B;IAC3B,uBAAuB;IACvB,qBAAqB;IACrB,4BAA4B;IAC5B,wBAAwB;IACxB,yBAAyB;IACzB,wBAAwB;IACxB,+BAA+B;IAC/B,sBAAsB;IACtB,uBAAuB;IACvB,wBAAwB;IACxB,yBAAyB;IACzB,2BAA2B;IAC3B,4BAA4B;IAC5B,2BAA2B;IAC3B,4BAA4B;CACpB,CAAC;AAcX,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,OAAO,GAAG,KAAK;IAC9D,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACjC,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,eAAO,MAAM,MAAM,6BAKjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM;IAC9C,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC;QACjD,MAAM,EAAE,aAAa;KACtB,CAAC,CAAC,CAAC,SAAS;CACd,CAAC,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates a Proxmox node name.
|
|
3
|
+
* Only allows alphanumeric characters, hyphens, and underscores.
|
|
4
|
+
* Maximum length: 64 characters.
|
|
5
|
+
*
|
|
6
|
+
* @throws {Error} If node name is invalid
|
|
7
|
+
*/
|
|
8
|
+
export declare function validateNodeName(node: unknown): string;
|
|
9
|
+
/**
|
|
10
|
+
* Validates a Proxmox VM ID.
|
|
11
|
+
* Must be a number between 100 and 999999999.
|
|
12
|
+
*
|
|
13
|
+
* @throws {Error} If VMID is invalid
|
|
14
|
+
*/
|
|
15
|
+
export declare function validateVMID(vmid: unknown): string;
|
|
16
|
+
/**
|
|
17
|
+
* Validates a shell command for execution.
|
|
18
|
+
* Blocks dangerous characters that could be used for command injection.
|
|
19
|
+
* Maximum length: 1000 characters.
|
|
20
|
+
*
|
|
21
|
+
* @throws {Error} If command contains dangerous characters or is too long
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateCommand(command: unknown): string;
|
|
24
|
+
/**
|
|
25
|
+
* Validates a storage name.
|
|
26
|
+
* Only allows alphanumeric characters, hyphens, underscores, and dots.
|
|
27
|
+
* Maximum length: 64 characters.
|
|
28
|
+
*
|
|
29
|
+
* @throws {Error} If storage name is invalid
|
|
30
|
+
*/
|
|
31
|
+
export declare function validateStorageName(storage: unknown): string;
|
|
32
|
+
/**
|
|
33
|
+
* Validates an ISO image filename.
|
|
34
|
+
* Must end with .iso extension.
|
|
35
|
+
* Maximum length: 255 characters.
|
|
36
|
+
*
|
|
37
|
+
* @throws {Error} If ISO filename is invalid
|
|
38
|
+
*/
|
|
39
|
+
export declare function validateISOName(iso: unknown): string;
|
|
40
|
+
/**
|
|
41
|
+
* Validates a snapshot name.
|
|
42
|
+
* Only allows alphanumeric characters, hyphens, and underscores.
|
|
43
|
+
* Maximum length: 64 characters.
|
|
44
|
+
*
|
|
45
|
+
* @throws {Error} If snapshot name is invalid
|
|
46
|
+
*/
|
|
47
|
+
export declare function validateSnapshotName(snapshot: unknown): string;
|
|
48
|
+
/**
|
|
49
|
+
* Validates a disk identifier (e.g., scsi0, virtio1, sata2).
|
|
50
|
+
* Format: controller + number (e.g., scsi0, virtio1, ide2, sata3).
|
|
51
|
+
*
|
|
52
|
+
* @throws {Error} If disk identifier is invalid
|
|
53
|
+
*/
|
|
54
|
+
export declare function validateDiskId(disk: unknown): string;
|
|
55
|
+
/**
|
|
56
|
+
* Validates a network interface identifier (e.g., net0, net1).
|
|
57
|
+
* Format: net + number.
|
|
58
|
+
*
|
|
59
|
+
* @throws {Error} If network identifier is invalid
|
|
60
|
+
*/
|
|
61
|
+
export declare function validateNetworkId(net: unknown): string;
|
|
62
|
+
/**
|
|
63
|
+
* Validates a network bridge name (e.g., vmbr0, vmbr1).
|
|
64
|
+
* Format: vmbr + number.
|
|
65
|
+
*
|
|
66
|
+
* @throws {Error} If bridge name is invalid
|
|
67
|
+
*/
|
|
68
|
+
export declare function validateBridgeName(bridge: unknown): string;
|
|
69
|
+
/**
|
|
70
|
+
* Generates a secure random password using Node.js crypto.
|
|
71
|
+
* Length: 16 characters.
|
|
72
|
+
* Character set: A-Z, a-z, 0-9, !@#$%^&*
|
|
73
|
+
*/
|
|
74
|
+
export declare function generateSecurePassword(): string;
|
|
75
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validators/index.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAiBtD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAWlD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAmBxD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAiB5D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAqBpD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAiB9D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAapD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAWtD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAW1D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAU/C"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Validates a Proxmox node name.
|
|
4
|
+
* Only allows alphanumeric characters, hyphens, and underscores.
|
|
5
|
+
* Maximum length: 64 characters.
|
|
6
|
+
*
|
|
7
|
+
* @throws {Error} If node name is invalid
|
|
8
|
+
*/
|
|
9
|
+
export function validateNodeName(node) {
|
|
10
|
+
if (!node || typeof node !== 'string') {
|
|
11
|
+
throw new Error('Node name is required and must be a string');
|
|
12
|
+
}
|
|
13
|
+
// Only allow alphanumeric, hyphens, and underscores
|
|
14
|
+
if (!/^[a-zA-Z0-9\-_]+$/.test(node)) {
|
|
15
|
+
throw new Error('Invalid node name format. Only alphanumeric, hyphens, and underscores allowed');
|
|
16
|
+
}
|
|
17
|
+
if (node.length > 64) {
|
|
18
|
+
throw new Error('Node name too long (max 64 characters)');
|
|
19
|
+
}
|
|
20
|
+
return node;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Validates a Proxmox VM ID.
|
|
24
|
+
* Must be a number between 100 and 999999999.
|
|
25
|
+
*
|
|
26
|
+
* @throws {Error} If VMID is invalid
|
|
27
|
+
*/
|
|
28
|
+
export function validateVMID(vmid) {
|
|
29
|
+
if (!vmid) {
|
|
30
|
+
throw new Error('VM ID is required');
|
|
31
|
+
}
|
|
32
|
+
const id = parseInt(String(vmid), 10);
|
|
33
|
+
if (isNaN(id) || id < 100 || id > 999999999) {
|
|
34
|
+
throw new Error('Invalid VM ID. Must be a number between 100 and 999999999');
|
|
35
|
+
}
|
|
36
|
+
return id.toString();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Validates a shell command for execution.
|
|
40
|
+
* Blocks dangerous characters that could be used for command injection.
|
|
41
|
+
* Maximum length: 1000 characters.
|
|
42
|
+
*
|
|
43
|
+
* @throws {Error} If command contains dangerous characters or is too long
|
|
44
|
+
*/
|
|
45
|
+
export function validateCommand(command) {
|
|
46
|
+
if (!command || typeof command !== 'string') {
|
|
47
|
+
throw new Error('Command is required and must be a string');
|
|
48
|
+
}
|
|
49
|
+
// Check for dangerous characters that could be used for command injection
|
|
50
|
+
const dangerousChars = /[;&|`$(){}[\]<>\\]/g;
|
|
51
|
+
if (dangerousChars.test(command)) {
|
|
52
|
+
throw new Error('Command contains potentially dangerous characters: ; & | ` $ ( ) { } [ ] < > \\');
|
|
53
|
+
}
|
|
54
|
+
// Limit command length
|
|
55
|
+
if (command.length > 1000) {
|
|
56
|
+
throw new Error('Command exceeds maximum allowed length (1000 characters)');
|
|
57
|
+
}
|
|
58
|
+
return command;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Validates a storage name.
|
|
62
|
+
* Only allows alphanumeric characters, hyphens, underscores, and dots.
|
|
63
|
+
* Maximum length: 64 characters.
|
|
64
|
+
*
|
|
65
|
+
* @throws {Error} If storage name is invalid
|
|
66
|
+
*/
|
|
67
|
+
export function validateStorageName(storage) {
|
|
68
|
+
if (!storage || typeof storage !== 'string') {
|
|
69
|
+
throw new Error('Storage name is required and must be a string');
|
|
70
|
+
}
|
|
71
|
+
// Allow alphanumeric, hyphens, underscores, and dots
|
|
72
|
+
if (!/^[a-zA-Z0-9\-_.]+$/.test(storage)) {
|
|
73
|
+
throw new Error('Invalid storage name format. Only alphanumeric, hyphens, underscores, and dots allowed');
|
|
74
|
+
}
|
|
75
|
+
if (storage.length > 64) {
|
|
76
|
+
throw new Error('Storage name too long (max 64 characters)');
|
|
77
|
+
}
|
|
78
|
+
return storage;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Validates an ISO image filename.
|
|
82
|
+
* Must end with .iso extension.
|
|
83
|
+
* Maximum length: 255 characters.
|
|
84
|
+
*
|
|
85
|
+
* @throws {Error} If ISO filename is invalid
|
|
86
|
+
*/
|
|
87
|
+
export function validateISOName(iso) {
|
|
88
|
+
if (!iso || typeof iso !== 'string') {
|
|
89
|
+
throw new Error('ISO name is required and must be a string');
|
|
90
|
+
}
|
|
91
|
+
if (!iso.toLowerCase().endsWith('.iso')) {
|
|
92
|
+
throw new Error('ISO name must end with .iso extension');
|
|
93
|
+
}
|
|
94
|
+
// Allow alphanumeric, hyphens, underscores, dots
|
|
95
|
+
if (!/^[a-zA-Z0-9\-_.]+$/.test(iso)) {
|
|
96
|
+
throw new Error('Invalid ISO name format. Only alphanumeric, hyphens, underscores, and dots allowed');
|
|
97
|
+
}
|
|
98
|
+
if (iso.length > 255) {
|
|
99
|
+
throw new Error('ISO name too long (max 255 characters)');
|
|
100
|
+
}
|
|
101
|
+
return iso;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Validates a snapshot name.
|
|
105
|
+
* Only allows alphanumeric characters, hyphens, and underscores.
|
|
106
|
+
* Maximum length: 64 characters.
|
|
107
|
+
*
|
|
108
|
+
* @throws {Error} If snapshot name is invalid
|
|
109
|
+
*/
|
|
110
|
+
export function validateSnapshotName(snapshot) {
|
|
111
|
+
if (!snapshot || typeof snapshot !== 'string') {
|
|
112
|
+
throw new Error('Snapshot name is required and must be a string');
|
|
113
|
+
}
|
|
114
|
+
// Only allow alphanumeric, hyphens, and underscores
|
|
115
|
+
if (!/^[a-zA-Z0-9\-_]+$/.test(snapshot)) {
|
|
116
|
+
throw new Error('Invalid snapshot name format. Only alphanumeric, hyphens, and underscores allowed');
|
|
117
|
+
}
|
|
118
|
+
if (snapshot.length > 64) {
|
|
119
|
+
throw new Error('Snapshot name too long (max 64 characters)');
|
|
120
|
+
}
|
|
121
|
+
return snapshot;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Validates a disk identifier (e.g., scsi0, virtio1, sata2).
|
|
125
|
+
* Format: controller + number (e.g., scsi0, virtio1, ide2, sata3).
|
|
126
|
+
*
|
|
127
|
+
* @throws {Error} If disk identifier is invalid
|
|
128
|
+
*/
|
|
129
|
+
export function validateDiskId(disk) {
|
|
130
|
+
if (!disk || typeof disk !== 'string') {
|
|
131
|
+
throw new Error('Disk identifier is required and must be a string');
|
|
132
|
+
}
|
|
133
|
+
// Valid formats: scsi0, virtio1, ide2, sata3, etc.
|
|
134
|
+
if (!/^(scsi|virtio|ide|sata)\d+$/.test(disk)) {
|
|
135
|
+
throw new Error('Invalid disk identifier format. Must be controller + number (e.g., scsi0, virtio1)');
|
|
136
|
+
}
|
|
137
|
+
return disk;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Validates a network interface identifier (e.g., net0, net1).
|
|
141
|
+
* Format: net + number.
|
|
142
|
+
*
|
|
143
|
+
* @throws {Error} If network identifier is invalid
|
|
144
|
+
*/
|
|
145
|
+
export function validateNetworkId(net) {
|
|
146
|
+
if (!net || typeof net !== 'string') {
|
|
147
|
+
throw new Error('Network identifier is required and must be a string');
|
|
148
|
+
}
|
|
149
|
+
// Valid format: net0, net1, net2, etc.
|
|
150
|
+
if (!/^net\d+$/.test(net)) {
|
|
151
|
+
throw new Error('Invalid network identifier format. Must be net + number (e.g., net0)');
|
|
152
|
+
}
|
|
153
|
+
return net;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Validates a network bridge name (e.g., vmbr0, vmbr1).
|
|
157
|
+
* Format: vmbr + number.
|
|
158
|
+
*
|
|
159
|
+
* @throws {Error} If bridge name is invalid
|
|
160
|
+
*/
|
|
161
|
+
export function validateBridgeName(bridge) {
|
|
162
|
+
if (!bridge || typeof bridge !== 'string') {
|
|
163
|
+
throw new Error('Bridge name is required and must be a string');
|
|
164
|
+
}
|
|
165
|
+
// Valid format: vmbr0, vmbr1, etc.
|
|
166
|
+
if (!/^vmbr\d+$/.test(bridge)) {
|
|
167
|
+
throw new Error('Invalid bridge name format. Must be vmbr + number (e.g., vmbr0)');
|
|
168
|
+
}
|
|
169
|
+
return bridge;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Generates a secure random password using Node.js crypto.
|
|
173
|
+
* Length: 16 characters.
|
|
174
|
+
* Character set: A-Z, a-z, 0-9, !@#$%^&*
|
|
175
|
+
*/
|
|
176
|
+
export function generateSecurePassword() {
|
|
177
|
+
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*';
|
|
178
|
+
let password = '';
|
|
179
|
+
const randomBytes = crypto.randomBytes(16);
|
|
180
|
+
for (let i = 0; i < 16; i++) {
|
|
181
|
+
password += chars[randomBytes[i] % chars.length];
|
|
182
|
+
}
|
|
183
|
+
return password;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validators/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bldg-7/proxmox-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Proxmox MCP Server - TypeScript rewrite",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"proxmox-mcp": "dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"engines": {
|
|
12
|
+
"node": ">=18"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist/",
|
|
16
|
+
"README.md",
|
|
17
|
+
"LICENSE"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc",
|
|
24
|
+
"dev": "tsc --watch",
|
|
25
|
+
"start": "node dist/index.js",
|
|
26
|
+
"test": "vitest run",
|
|
27
|
+
"test:watch": "vitest",
|
|
28
|
+
"test:coverage": "vitest run --coverage",
|
|
29
|
+
"lint": "eslint src --ext .ts",
|
|
30
|
+
"typecheck": "tsc --noEmit",
|
|
31
|
+
"clean": "rm -rf dist",
|
|
32
|
+
"release": "pnpm build && changeset publish"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
36
|
+
"dotenv": "^16.4.5",
|
|
37
|
+
"pino": "^9.6.0",
|
|
38
|
+
"zod": "^3.23.8"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@changesets/cli": "^2.29.8",
|
|
42
|
+
"@types/node": "^25.2.0",
|
|
43
|
+
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
|
44
|
+
"@typescript-eslint/parser": "^7.18.0",
|
|
45
|
+
"@vitest/coverage-v8": "^2.1.9",
|
|
46
|
+
"eslint": "^9.18.0",
|
|
47
|
+
"pino-pretty": "^11.2.2",
|
|
48
|
+
"typescript": "^5.6.3",
|
|
49
|
+
"vitest": "^2.1.8"
|
|
50
|
+
}
|
|
51
|
+
}
|