kiwivm-cli 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 +118 -0
- package/dist/admin-fOud1ZmX.mjs +15 -0
- package/dist/admin-fOud1ZmX.mjs.map +1 -0
- package/dist/backup-D1UJ4aap.mjs +12 -0
- package/dist/backup-D1UJ4aap.mjs.map +1 -0
- package/dist/help-Dk-WApoi.mjs +40 -0
- package/dist/help-Dk-WApoi.mjs.map +1 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +177 -0
- package/dist/index.mjs.map +1 -0
- package/dist/info-DKExtFYH.mjs +13 -0
- package/dist/info-DKExtFYH.mjs.map +1 -0
- package/dist/monitoring-BSuv8fj9.mjs +13 -0
- package/dist/monitoring-BSuv8fj9.mjs.map +1 -0
- package/dist/network-1ycEIJqT.mjs +15 -0
- package/dist/network-1ycEIJqT.mjs.map +1 -0
- package/dist/power-CDg0Mx1A.mjs +14 -0
- package/dist/power-CDg0Mx1A.mjs.map +1 -0
- package/dist/snapshot-LO_ufoj5.mjs +23 -0
- package/dist/snapshot-LO_ufoj5.mjs.map +1 -0
- package/dist/system-Bl-dsqX9.mjs +21 -0
- package/dist/system-Bl-dsqX9.mjs.map +1 -0
- package/package.json +46 -0
- package/src/client.test.ts +68 -0
- package/src/client.ts +55 -0
- package/src/commands/admin.test.ts +65 -0
- package/src/commands/admin.ts +25 -0
- package/src/commands/backup.test.ts +66 -0
- package/src/commands/backup.ts +23 -0
- package/src/commands/help.test.ts +50 -0
- package/src/commands/help.ts +36 -0
- package/src/commands/info.test.ts +67 -0
- package/src/commands/info.ts +20 -0
- package/src/commands/monitoring.test.ts +82 -0
- package/src/commands/monitoring.ts +20 -0
- package/src/commands/network.test.ts +85 -0
- package/src/commands/network.ts +24 -0
- package/src/commands/power.test.ts +68 -0
- package/src/commands/power.ts +22 -0
- package/src/commands/snapshot.test.ts +159 -0
- package/src/commands/snapshot.ts +40 -0
- package/src/commands/system.test.ts +98 -0
- package/src/commands/system.ts +29 -0
- package/src/index.test.ts +375 -0
- package/src/index.ts +172 -0
- package/src/types.ts +94 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 fujuntao
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# kiwivm-cli
|
|
2
|
+
|
|
3
|
+
CLI for managing KiwiVM (64clouds/BuyVM) VPS instances.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
### 1. Environment Variables
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
export KIWIVM_VEID=12345678
|
|
11
|
+
export KIWIVM_API_KEY=your_api_key_here
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Get your VEID and API key from the KiwiVM Control Panel -- REST API page.
|
|
15
|
+
|
|
16
|
+
Alternatively, pass them as flags on every command:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
kiwivm-cli --veid 12345678 --api-key your_key info
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 2. Install
|
|
23
|
+
|
|
24
|
+
Requires **Node.js >= 24**.
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm install -g kiwivm-cli
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Or run directly with npx:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npx kiwivm-cli help
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Usage
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
kiwivm-cli <category> <action> [--flags...]
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Examples
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# Get service info
|
|
46
|
+
kiwivm-cli info
|
|
47
|
+
|
|
48
|
+
# Get live service info (CPU, RAM, disk, uptime)
|
|
49
|
+
kiwivm-cli info live
|
|
50
|
+
|
|
51
|
+
# Power control
|
|
52
|
+
kiwivm-cli power start
|
|
53
|
+
kiwivm-cli power stop
|
|
54
|
+
kiwivm-cli power restart
|
|
55
|
+
kiwivm-cli power kill
|
|
56
|
+
|
|
57
|
+
# Snapshots
|
|
58
|
+
kiwivm-cli snapshot list
|
|
59
|
+
kiwivm-cli snapshot create --description "before update"
|
|
60
|
+
kiwivm-cli snapshot delete --snapshot vsb1234567890
|
|
61
|
+
kiwivm-cli snapshot restore --snapshot vsb1234567890
|
|
62
|
+
kiwivm-cli snapshot sticky --snapshot vsb1234567890 --sticky 1
|
|
63
|
+
kiwivm-cli snapshot import --source-veid 87654321 --source-token token123
|
|
64
|
+
|
|
65
|
+
# Backups
|
|
66
|
+
kiwivm-cli backup list
|
|
67
|
+
kiwivm-cli backup copy --backup-token abc123
|
|
68
|
+
|
|
69
|
+
# System
|
|
70
|
+
kiwivm-cli system hostname --new-hostname my-vps
|
|
71
|
+
kiwivm-cli system rdns --ip 1.2.3.4 --ptr my.domain.com
|
|
72
|
+
kiwivm-cli system password
|
|
73
|
+
kiwivm-cli system sshkey
|
|
74
|
+
kiwivm-cli system sshkey --ssh-keys "ssh-ed25519 AAAAC3..."
|
|
75
|
+
kiwivm-cli system os
|
|
76
|
+
kiwivm-cli system reinstall --os "ubuntu-22.04"
|
|
77
|
+
|
|
78
|
+
# Network
|
|
79
|
+
kiwivm-cli network ipv6-add
|
|
80
|
+
kiwivm-cli network ipv6-delete --ip 2001:db8::1
|
|
81
|
+
kiwivm-cli network private-list
|
|
82
|
+
kiwivm-cli network private-assign --ip 10.0.0.5
|
|
83
|
+
kiwivm-cli network private-delete --ip 10.0.0.5
|
|
84
|
+
|
|
85
|
+
# Monitoring
|
|
86
|
+
kiwivm-cli monitoring usage
|
|
87
|
+
kiwivm-cli monitoring audit
|
|
88
|
+
kiwivm-cli monitoring rate-limit
|
|
89
|
+
|
|
90
|
+
# Admin
|
|
91
|
+
kiwivm-cli admin suspensions
|
|
92
|
+
kiwivm-cli admin unsuspend --record-id 123
|
|
93
|
+
kiwivm-cli admin resolve
|
|
94
|
+
kiwivm-cli admin resolve-violation --record-id 456
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Output is JSON to stdout. Errors go to stderr with exit code 1.
|
|
98
|
+
|
|
99
|
+
## Development
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
git clone https://github.com/FuJuntao/kiwivm-cli.git
|
|
103
|
+
cd kiwivm-cli
|
|
104
|
+
npm install
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
| Command | Description |
|
|
108
|
+
|---------|-------------|
|
|
109
|
+
| `npm test` | Run tests (vitest) |
|
|
110
|
+
| `npm run typecheck` | Type check (tsc --noEmit) |
|
|
111
|
+
| `npm run build` | Build with tsdown -> `dist/index.mjs` |
|
|
112
|
+
| `npm run lint` | Lint with Biome |
|
|
113
|
+
| `npm run format` | Format with Biome |
|
|
114
|
+
| `npm run check` | Lint + format check |
|
|
115
|
+
|
|
116
|
+
## License
|
|
117
|
+
|
|
118
|
+
MIT
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/commands/admin.ts
|
|
2
|
+
async function run(action, flags, client) {
|
|
3
|
+
switch (action) {
|
|
4
|
+
case "suspensions": return client.call("getSuspensionDetails");
|
|
5
|
+
case "unsuspend": return client.call("unsuspend", { recordId: flags["recordId"] });
|
|
6
|
+
case "resolve":
|
|
7
|
+
if (flags["recordId"] !== void 0) return client.call("resolvePolicyViolation", { recordId: flags["recordId"] });
|
|
8
|
+
return client.call("getPolicyViolations");
|
|
9
|
+
default: throw new Error(`Unknown admin action: ${action}. Valid: suspensions, unsuspend, resolve`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
export { run };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=admin-fOud1ZmX.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-fOud1ZmX.mjs","names":[],"sources":["../src/commands/admin.ts"],"sourcesContent":["import type { KiwiVMClient } from \"../client.ts\";\n\nexport async function run(\n action: string,\n flags: Record<string, string>,\n client: KiwiVMClient,\n): Promise<unknown> {\n switch (action) {\n case \"suspensions\":\n return client.call(\"getSuspensionDetails\");\n case \"unsuspend\":\n return client.call(\"unsuspend\", { recordId: flags[\"recordId\"] });\n case \"resolve\":\n if (flags[\"recordId\"] !== undefined) {\n return client.call(\"resolvePolicyViolation\", {\n recordId: flags[\"recordId\"],\n });\n }\n return client.call(\"getPolicyViolations\");\n default:\n throw new Error(\n `Unknown admin action: ${action}. Valid: suspensions, unsuspend, resolve`,\n );\n }\n}\n"],"mappings":";AAEA,eAAsB,IACpB,QACA,OACA,QACkB;AAClB,SAAQ,QAAR;EACE,KAAK,cACH,QAAO,OAAO,KAAK,uBAAuB;EAC5C,KAAK,YACH,QAAO,OAAO,KAAK,aAAa,EAAE,UAAU,MAAM,aAAa,CAAC;EAClE,KAAK;AACH,OAAI,MAAM,gBAAgB,KAAA,EACxB,QAAO,OAAO,KAAK,0BAA0B,EAC3C,UAAU,MAAM,aACjB,CAAC;AAEJ,UAAO,OAAO,KAAK,sBAAsB;EAC3C,QACE,OAAM,IAAI,MACR,yBAAyB,OAAO,0CACjC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/commands/backup.ts
|
|
2
|
+
async function run(action, flags, client) {
|
|
3
|
+
switch (action) {
|
|
4
|
+
case "list": return client.call("backup/list");
|
|
5
|
+
case "copy": return client.call("backup/copyToSnapshot", { backupToken: flags["backupToken"] });
|
|
6
|
+
default: throw new Error(`Unknown backup action: ${action}. Valid: list, copy`);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { run };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=backup-D1UJ4aap.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-D1UJ4aap.mjs","names":[],"sources":["../src/commands/backup.ts"],"sourcesContent":["import type { KiwiVMClient } from \"../client.ts\";\nimport type { Backup, KiwiVMResponse } from \"../types.ts\";\n\ninterface BackupListResponse extends KiwiVMResponse {\n backups: Backup[];\n}\n\nexport async function run(\n action: string,\n flags: Record<string, string>,\n client: KiwiVMClient,\n): Promise<unknown> {\n switch (action) {\n case \"list\":\n return client.call<BackupListResponse>(\"backup/list\");\n case \"copy\":\n return client.call(\"backup/copyToSnapshot\", {\n backupToken: flags[\"backupToken\"],\n });\n default:\n throw new Error(`Unknown backup action: ${action}. Valid: list, copy`);\n }\n}\n"],"mappings":";AAOA,eAAsB,IACpB,QACA,OACA,QACkB;AAClB,SAAQ,QAAR;EACE,KAAK,OACH,QAAO,OAAO,KAAyB,cAAc;EACvD,KAAK,OACH,QAAO,OAAO,KAAK,yBAAyB,EAC1C,aAAa,MAAM,gBACpB,CAAC;EACJ,QACE,OAAM,IAAI,MAAM,0BAA0B,OAAO,qBAAqB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
//#region src/commands/help.ts
|
|
2
|
+
const HELP = `Usage: kiwivm-cli <category> <action> [--flags...]
|
|
3
|
+
|
|
4
|
+
Auth: --veid <VEID> --api-key <KEY> (or KIWIVM_VEID / KIWIVM_API_KEY env vars)
|
|
5
|
+
|
|
6
|
+
Categories:
|
|
7
|
+
|
|
8
|
+
power start | stop | restart | kill
|
|
9
|
+
info (no action) | live
|
|
10
|
+
snapshot create | list | delete | restore | sticky | export | import
|
|
11
|
+
backup list | copy
|
|
12
|
+
system hostname | rdns | password | sshkey | os | reinstall
|
|
13
|
+
network ipv6-add | ipv6-delete | private-list | private-assign | private-delete
|
|
14
|
+
monitoring usage | audit | rate-limit
|
|
15
|
+
admin suspensions | unsuspend | resolve | resolve-violation
|
|
16
|
+
|
|
17
|
+
Flags:
|
|
18
|
+
|
|
19
|
+
--description Snapshot description (snapshot create)
|
|
20
|
+
--snapshot Snapshot file name (snapshot delete/restore/sticky/export)
|
|
21
|
+
--sticky 0 or 1 (snapshot sticky)
|
|
22
|
+
--source-veid Source VEID (snapshot import)
|
|
23
|
+
--source-token Source token (snapshot import)
|
|
24
|
+
--backup-token Backup token (backup copy)
|
|
25
|
+
--new-hostname New hostname (system hostname)
|
|
26
|
+
--ip IP address (system rdns, network ipv6-delete/private-assign/private-delete)
|
|
27
|
+
--ptr PTR/rDNS record (system rdns)
|
|
28
|
+
--ssh-keys SSH keys (system sshkey update)
|
|
29
|
+
--os OS template name (system reinstall)
|
|
30
|
+
--record-id Record ID (admin unsuspend/resolve-violation)
|
|
31
|
+
|
|
32
|
+
Output: JSON to stdout. Errors to stderr with exit code 1.
|
|
33
|
+
`;
|
|
34
|
+
async function run() {
|
|
35
|
+
return HELP;
|
|
36
|
+
}
|
|
37
|
+
//#endregion
|
|
38
|
+
export { run };
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=help-Dk-WApoi.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help-Dk-WApoi.mjs","names":[],"sources":["../src/commands/help.ts"],"sourcesContent":["const HELP = `Usage: kiwivm-cli <category> <action> [--flags...]\n\nAuth: --veid <VEID> --api-key <KEY> (or KIWIVM_VEID / KIWIVM_API_KEY env vars)\n\nCategories:\n\n power start | stop | restart | kill\n info (no action) | live\n snapshot create | list | delete | restore | sticky | export | import\n backup list | copy\n system hostname | rdns | password | sshkey | os | reinstall\n network ipv6-add | ipv6-delete | private-list | private-assign | private-delete\n monitoring usage | audit | rate-limit\n admin suspensions | unsuspend | resolve | resolve-violation\n\nFlags:\n\n --description Snapshot description (snapshot create)\n --snapshot Snapshot file name (snapshot delete/restore/sticky/export)\n --sticky 0 or 1 (snapshot sticky)\n --source-veid Source VEID (snapshot import)\n --source-token Source token (snapshot import)\n --backup-token Backup token (backup copy)\n --new-hostname New hostname (system hostname)\n --ip IP address (system rdns, network ipv6-delete/private-assign/private-delete)\n --ptr PTR/rDNS record (system rdns)\n --ssh-keys SSH keys (system sshkey update)\n --os OS template name (system reinstall)\n --record-id Record ID (admin unsuspend/resolve-violation)\n\nOutput: JSON to stdout. Errors to stderr with exit code 1.\n`;\n\nexport async function run(): Promise<string> {\n return HELP;\n}\n"],"mappings":";AAAA,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCb,eAAsB,MAAuB;AAC3C,QAAO"}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";iBAoEe,IAAA,CAAA,GAAI,OAAA"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
//#region src/types.ts
|
|
3
|
+
var KiwiVMError = class extends Error {
|
|
4
|
+
errorCode;
|
|
5
|
+
rawResponse;
|
|
6
|
+
constructor(message, errorCode, rawResponse) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = "KiwiVMError";
|
|
9
|
+
this.errorCode = errorCode;
|
|
10
|
+
this.rawResponse = rawResponse;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region src/client.ts
|
|
15
|
+
const API_BASE = "https://api.64clouds.com/v1";
|
|
16
|
+
var KiwiVMClient = class {
|
|
17
|
+
veid;
|
|
18
|
+
apiKey;
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.veid = options.veid;
|
|
21
|
+
this.apiKey = options.apiKey;
|
|
22
|
+
}
|
|
23
|
+
async call(endpoint, params = {}) {
|
|
24
|
+
const body = new URLSearchParams();
|
|
25
|
+
body.set("veid", this.veid);
|
|
26
|
+
body.set("api_key", this.apiKey);
|
|
27
|
+
for (const [key, value] of Object.entries(params)) if (value !== void 0) body.set(key, String(value));
|
|
28
|
+
const response = await fetch(`${API_BASE}/${endpoint}`, {
|
|
29
|
+
method: "POST",
|
|
30
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
31
|
+
body
|
|
32
|
+
});
|
|
33
|
+
if (!response.ok) throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
34
|
+
const data = await response.json();
|
|
35
|
+
if (data.error !== 0) throw new KiwiVMError(data.message ?? `API error: ${data.error}`, data.error, data);
|
|
36
|
+
return data;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
//#endregion
|
|
40
|
+
//#region src/index.ts
|
|
41
|
+
function parseFlags(args) {
|
|
42
|
+
const flags = {};
|
|
43
|
+
for (let i = 0; i < args.length; i++) {
|
|
44
|
+
const arg = args[i];
|
|
45
|
+
if (!arg?.startsWith("--")) continue;
|
|
46
|
+
const eqIdx = arg.indexOf("=");
|
|
47
|
+
if (eqIdx !== -1) {
|
|
48
|
+
const key = arg.slice(2, eqIdx);
|
|
49
|
+
const value = arg.slice(eqIdx + 1);
|
|
50
|
+
flags[toCamelCase(key)] = value;
|
|
51
|
+
} else {
|
|
52
|
+
const next = args[i + 1];
|
|
53
|
+
if (next !== void 0 && !next.startsWith("--")) {
|
|
54
|
+
const key = arg.slice(2);
|
|
55
|
+
flags[toCamelCase(key)] = next;
|
|
56
|
+
i++;
|
|
57
|
+
} else {
|
|
58
|
+
const key = arg.slice(2);
|
|
59
|
+
flags[toCamelCase(key)] = "";
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return flags;
|
|
64
|
+
}
|
|
65
|
+
function toCamelCase(key) {
|
|
66
|
+
const known = {
|
|
67
|
+
"backup-token": "backupToken",
|
|
68
|
+
"new-hostname": "newHostname",
|
|
69
|
+
"ssh-keys": "sshKeys",
|
|
70
|
+
"source-veid": "sourceVeid",
|
|
71
|
+
"source-token": "sourceToken",
|
|
72
|
+
"record-id": "recordId",
|
|
73
|
+
"api-key": "apiKey",
|
|
74
|
+
"rate-limit": "rateLimit"
|
|
75
|
+
};
|
|
76
|
+
if (known[key]) return known[key];
|
|
77
|
+
return key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
78
|
+
}
|
|
79
|
+
function getCommandFromArgs(args) {
|
|
80
|
+
const positional = [];
|
|
81
|
+
let i = 0;
|
|
82
|
+
while (i < args.length) {
|
|
83
|
+
const arg = args[i];
|
|
84
|
+
if (!arg || arg.startsWith("--")) break;
|
|
85
|
+
positional.push(arg);
|
|
86
|
+
i++;
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
positional,
|
|
90
|
+
flags: parseFlags(args.slice(i))
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
async function main() {
|
|
94
|
+
const { positional, flags } = getCommandFromArgs(process.argv.slice(2));
|
|
95
|
+
const category = positional[0] ?? "";
|
|
96
|
+
const action = positional[1] ?? "";
|
|
97
|
+
if (category === "" || category === "help") {
|
|
98
|
+
const { run } = await import("./help-Dk-WApoi.mjs");
|
|
99
|
+
const text = await run();
|
|
100
|
+
console.log(text);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const flagVeid = flags["veid"];
|
|
104
|
+
const flagApiKey = flags["apiKey"];
|
|
105
|
+
const resolvedVeid = flagVeid || process.env["KIWIVM_VEID"];
|
|
106
|
+
const resolvedApiKey = flagApiKey || process.env["KIWIVM_API_KEY"];
|
|
107
|
+
if (!resolvedVeid || !resolvedApiKey) {
|
|
108
|
+
console.error("Error: VEID and API key are required. Use --veid and --api-key flags, or set KIWIVM_VEID and KIWIVM_API_KEY environment variables.");
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
const handlerFlags = { ...flags };
|
|
112
|
+
delete handlerFlags["veid"];
|
|
113
|
+
delete handlerFlags["apiKey"];
|
|
114
|
+
const client = new KiwiVMClient({
|
|
115
|
+
veid: resolvedVeid,
|
|
116
|
+
apiKey: resolvedApiKey
|
|
117
|
+
});
|
|
118
|
+
try {
|
|
119
|
+
let result;
|
|
120
|
+
switch (category) {
|
|
121
|
+
case "power": {
|
|
122
|
+
const { run } = await import("./power-CDg0Mx1A.mjs");
|
|
123
|
+
result = await run(action, handlerFlags, client);
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
case "info": {
|
|
127
|
+
const { run } = await import("./info-DKExtFYH.mjs");
|
|
128
|
+
result = await run(action, handlerFlags, client);
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
case "snapshot": {
|
|
132
|
+
const { run } = await import("./snapshot-LO_ufoj5.mjs");
|
|
133
|
+
result = await run(action, handlerFlags, client);
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
case "backup": {
|
|
137
|
+
const { run } = await import("./backup-D1UJ4aap.mjs");
|
|
138
|
+
result = await run(action, handlerFlags, client);
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
case "system": {
|
|
142
|
+
const { run } = await import("./system-Bl-dsqX9.mjs");
|
|
143
|
+
result = await run(action, handlerFlags, client);
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
case "network": {
|
|
147
|
+
const { run } = await import("./network-1ycEIJqT.mjs");
|
|
148
|
+
result = await run(action, handlerFlags, client);
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
case "monitoring": {
|
|
152
|
+
const { run } = await import("./monitoring-BSuv8fj9.mjs");
|
|
153
|
+
result = await run(action, handlerFlags, client);
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
case "admin": {
|
|
157
|
+
const { run } = await import("./admin-fOud1ZmX.mjs");
|
|
158
|
+
result = await run(action, handlerFlags, client);
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
default:
|
|
162
|
+
console.error(`Unknown category: ${category}`);
|
|
163
|
+
console.error("Run 'kiwivm-cli help' for usage.");
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
166
|
+
console.log(JSON.stringify(result));
|
|
167
|
+
} catch (error) {
|
|
168
|
+
const message = error instanceof KiwiVMError ? error.message : String(error);
|
|
169
|
+
console.error(`Error: ${message}`);
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (!process.env["VITEST"]) main();
|
|
174
|
+
//#endregion
|
|
175
|
+
export { main };
|
|
176
|
+
|
|
177
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/types.ts","../src/client.ts","../src/index.ts"],"sourcesContent":["export interface KiwiVMResponse {\n error: number;\n message?: string;\n}\n\nexport class KiwiVMError extends Error {\n public readonly errorCode: number;\n public readonly rawResponse: KiwiVMResponse;\n\n constructor(message: string, errorCode: number, rawResponse: KiwiVMResponse) {\n super(message);\n this.name = \"KiwiVMError\";\n this.errorCode = errorCode;\n this.rawResponse = rawResponse;\n }\n}\n\nexport interface ServiceInfo extends KiwiVMResponse {\n hostname?: string;\n node_alias?: string;\n node_location?: string;\n location_ipv6_ready?: number;\n plan?: string;\n plan_monthly_data?: number;\n plan_disk?: number;\n plan_ram?: number;\n plan_swap?: number;\n os?: string;\n email?: string;\n data_counter?: number;\n data_next_reset?: number;\n ip_addresses?: string[];\n private_ip_addresses?: string[];\n ip_nullroutes?: Record<\n string,\n {\n nullroute_timestamp: number;\n nullroute_duration_s: number;\n log: string;\n }\n >;\n iso1?: string;\n iso2?: string;\n available_isos?: string[];\n plan_max_ipv6s?: number;\n rdns_api_available?: number;\n plan_private_network_available?: number;\n location_private_network_available?: number;\n ptr?: Record<string, string>;\n suspended?: number;\n policy_violation?: number;\n suspension_count?: number;\n total_abuse_points?: number;\n max_abuse_points?: number;\n}\n\nexport interface LiveServiceInfo extends ServiceInfo {\n vm_type?: \"ovz\" | \"kvm\";\n vz_status?: Record<string, unknown>;\n vz_quota?: Record<string, unknown>;\n ve_status?: \"Starting\" | \"Running\" | \"Stopped\";\n ve_mac1?: string;\n ve_used_disk_space_b?: number;\n ve_disk_quota_gb?: number;\n is_cpu_throttled?: number;\n is_disk_throttled?: number;\n ssh_port?: number;\n live_hostname?: string;\n load_average?: string;\n mem_available_kb?: number;\n swap_total_kb?: number;\n swap_available_kb?: number;\n screendump_png_base64?: string;\n}\n\nexport interface Snapshot {\n fileName: string;\n os: string;\n description: string;\n size: number;\n md5: string;\n sticky: number;\n purgesIn: number;\n downloadLink: string;\n downloadLinkSSL: string;\n}\n\nexport interface Backup {\n backupToken: string;\n size: number;\n os: string;\n md5: string;\n timestamp: number;\n}\n","import type { KiwiVMResponse } from \"./types.ts\";\nimport { KiwiVMError } from \"./types.ts\";\n\nconst API_BASE = \"https://api.64clouds.com/v1\";\n\nexport interface ClientOptions {\n veid: string;\n apiKey: string;\n}\n\nexport class KiwiVMClient {\n private veid: string;\n private apiKey: string;\n\n constructor(options: ClientOptions) {\n this.veid = options.veid;\n this.apiKey = options.apiKey;\n }\n\n async call<T extends KiwiVMResponse = KiwiVMResponse>(\n endpoint: string,\n params: Record<string, string | number | boolean | undefined> = {},\n ): Promise<T> {\n const body = new URLSearchParams();\n body.set(\"veid\", this.veid);\n body.set(\"api_key\", this.apiKey);\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n body.set(key, String(value));\n }\n }\n\n const response = await fetch(`${API_BASE}/${endpoint}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as T & KiwiVMResponse;\n\n if (data.error !== 0) {\n throw new KiwiVMError(\n data.message ?? `API error: ${data.error}`,\n data.error,\n data,\n );\n }\n\n return data as T;\n }\n}\n","#!/usr/bin/env node\n\nimport { KiwiVMClient } from \"./client.ts\";\nimport { KiwiVMError } from \"./types.ts\";\n\nfunction parseFlags(args: string[]): Record<string, string> {\n const flags: Record<string, string> = {};\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (!arg?.startsWith(\"--\")) continue;\n const eqIdx = arg.indexOf(\"=\");\n if (eqIdx !== -1) {\n const key = arg.slice(2, eqIdx);\n const value = arg.slice(eqIdx + 1);\n flags[toCamelCase(key)] = value;\n } else {\n const next = args[i + 1];\n if (next !== undefined && !next.startsWith(\"--\")) {\n const key = arg.slice(2);\n flags[toCamelCase(key)] = next;\n i++;\n } else {\n // --flag with no value (treat as boolean/empty string)\n const key = arg.slice(2);\n flags[toCamelCase(key)] = \"\";\n }\n }\n }\n return flags;\n}\n\nfunction toCamelCase(key: string): string {\n // Known mappings: kebab-case flags that need camelCase API param names\n const known: Record<string, string> = {\n \"backup-token\": \"backupToken\",\n \"new-hostname\": \"newHostname\",\n \"ssh-keys\": \"sshKeys\",\n \"source-veid\": \"sourceVeid\",\n \"source-token\": \"sourceToken\",\n \"record-id\": \"recordId\",\n \"api-key\": \"apiKey\",\n \"rate-limit\": \"rateLimit\",\n };\n if (known[key]) return known[key];\n\n // Default: convert --some-flag to someFlag\n return key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\nfunction getCommandFromArgs(args: string[]): {\n positional: string[];\n flags: Record<string, string>;\n} {\n const positional: string[] = [];\n let i = 0;\n while (i < args.length) {\n const arg = args[i];\n if (!arg || arg.startsWith(\"--\")) {\n break;\n }\n positional.push(arg);\n i++;\n }\n const flagArgs = args.slice(i);\n const flags = parseFlags(flagArgs);\n return { positional, flags };\n}\n\nasync function main() {\n const args = process.argv.slice(2);\n const { positional, flags } = getCommandFromArgs(args);\n\n const category = positional[0] ?? \"\";\n const action = positional[1] ?? \"\";\n\n // Handle help before auth (no credentials needed)\n if (category === \"\" || category === \"help\") {\n const { run } = await import(\"./commands/help.ts\");\n const text = await run();\n console.log(text as string);\n return;\n }\n\n // Resolve auth: flags first, then env vars\n const flagVeid = flags[\"veid\"];\n const flagApiKey = flags[\"apiKey\"];\n const resolvedVeid = flagVeid || process.env[\"KIWIVM_VEID\"];\n const resolvedApiKey = flagApiKey || process.env[\"KIWIVM_API_KEY\"];\n\n if (!resolvedVeid || !resolvedApiKey) {\n console.error(\n \"Error: VEID and API key are required. Use --veid and --api-key flags, or set KIWIVM_VEID and KIWIVM_API_KEY environment variables.\",\n );\n process.exit(1);\n }\n\n // Strip auth flags before passing to handlers\n const handlerFlags = { ...flags };\n delete handlerFlags[\"veid\"];\n delete handlerFlags[\"apiKey\"];\n\n const client = new KiwiVMClient({\n veid: resolvedVeid,\n apiKey: resolvedApiKey,\n });\n\n try {\n let result: unknown;\n\n switch (category) {\n case \"power\": {\n const { run } = await import(\"./commands/power.ts\");\n result = await run(action, handlerFlags, client);\n break;\n }\n case \"info\": {\n const { run } = await import(\"./commands/info.ts\");\n result = await run(action, handlerFlags, client);\n break;\n }\n case \"snapshot\": {\n const { run } = await import(\"./commands/snapshot.ts\");\n result = await run(action, handlerFlags, client);\n break;\n }\n case \"backup\": {\n const { run } = await import(\"./commands/backup.ts\");\n result = await run(action, handlerFlags, client);\n break;\n }\n case \"system\": {\n const { run } = await import(\"./commands/system.ts\");\n result = await run(action, handlerFlags, client);\n break;\n }\n case \"network\": {\n const { run } = await import(\"./commands/network.ts\");\n result = await run(action, handlerFlags, client);\n break;\n }\n case \"monitoring\": {\n const { run } = await import(\"./commands/monitoring.ts\");\n result = await run(action, handlerFlags, client);\n break;\n }\n case \"admin\": {\n const { run } = await import(\"./commands/admin.ts\");\n result = await run(action, handlerFlags, client);\n break;\n }\n default: {\n console.error(`Unknown category: ${category}`);\n console.error(\"Run 'kiwivm-cli help' for usage.\");\n process.exit(1);\n }\n }\n\n console.log(JSON.stringify(result));\n } catch (error) {\n const message =\n error instanceof KiwiVMError ? error.message : String(error);\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n\nexport { main };\n\n// Only auto-run when executed directly (not when imported by tests)\nif (!process.env[\"VITEST\"]) {\n main();\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region src/commands/info.ts
|
|
2
|
+
async function run(action, _flags, client) {
|
|
3
|
+
switch (action) {
|
|
4
|
+
case "live": return client.call("getLiveServiceInfo");
|
|
5
|
+
case "":
|
|
6
|
+
case "info": return client.call("getServiceInfo");
|
|
7
|
+
default: throw new Error(`Unknown info action: ${action}. Valid: (no action), live`);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { run };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=info-DKExtFYH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info-DKExtFYH.mjs","names":[],"sources":["../src/commands/info.ts"],"sourcesContent":["import type { KiwiVMClient } from \"../client.ts\";\nimport type { LiveServiceInfo, ServiceInfo } from \"../types.ts\";\n\nexport async function run(\n action: string,\n _flags: Record<string, string>,\n client: KiwiVMClient,\n): Promise<unknown> {\n switch (action) {\n case \"live\":\n return client.call<LiveServiceInfo>(\"getLiveServiceInfo\");\n case \"\":\n case \"info\":\n return client.call<ServiceInfo>(\"getServiceInfo\");\n default:\n throw new Error(\n `Unknown info action: ${action}. Valid: (no action), live`,\n );\n }\n}\n"],"mappings":";AAGA,eAAsB,IACpB,QACA,QACA,QACkB;AAClB,SAAQ,QAAR;EACE,KAAK,OACH,QAAO,OAAO,KAAsB,qBAAqB;EAC3D,KAAK;EACL,KAAK,OACH,QAAO,OAAO,KAAkB,iBAAiB;EACnD,QACE,OAAM,IAAI,MACR,wBAAwB,OAAO,4BAChC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region src/commands/monitoring.ts
|
|
2
|
+
async function run(action, _flags, client) {
|
|
3
|
+
switch (action) {
|
|
4
|
+
case "usage": return client.call("getRawUsageStats");
|
|
5
|
+
case "audit": return client.call("getAuditLog");
|
|
6
|
+
case "rate-limit": return client.call("getRateLimitStatus");
|
|
7
|
+
default: throw new Error(`Unknown monitoring action: ${action}. Valid: usage, audit, rate-limit`);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { run };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=monitoring-BSuv8fj9.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitoring-BSuv8fj9.mjs","names":[],"sources":["../src/commands/monitoring.ts"],"sourcesContent":["import type { KiwiVMClient } from \"../client.ts\";\n\nexport async function run(\n action: string,\n _flags: Record<string, string>,\n client: KiwiVMClient,\n): Promise<unknown> {\n switch (action) {\n case \"usage\":\n return client.call(\"getRawUsageStats\");\n case \"audit\":\n return client.call(\"getAuditLog\");\n case \"rate-limit\":\n return client.call(\"getRateLimitStatus\");\n default:\n throw new Error(\n `Unknown monitoring action: ${action}. Valid: usage, audit, rate-limit`,\n );\n }\n}\n"],"mappings":";AAEA,eAAsB,IACpB,QACA,QACA,QACkB;AAClB,SAAQ,QAAR;EACE,KAAK,QACH,QAAO,OAAO,KAAK,mBAAmB;EACxC,KAAK,QACH,QAAO,OAAO,KAAK,cAAc;EACnC,KAAK,aACH,QAAO,OAAO,KAAK,qBAAqB;EAC1C,QACE,OAAM,IAAI,MACR,8BAA8B,OAAO,mCACtC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/commands/network.ts
|
|
2
|
+
async function run(action, flags, client) {
|
|
3
|
+
switch (action) {
|
|
4
|
+
case "ipv6-add": return client.call("ipv6/add");
|
|
5
|
+
case "ipv6-delete": return client.call("ipv6/delete", { ip: flags["ip"] });
|
|
6
|
+
case "private-list": return client.call("privateIp/getAvailableIps");
|
|
7
|
+
case "private-assign": return client.call("privateIp/assign", { ip: flags["ip"] });
|
|
8
|
+
case "private-delete": return client.call("privateIp/delete", { ip: flags["ip"] });
|
|
9
|
+
default: throw new Error(`Unknown network action: ${action}. Valid: ipv6-add, ipv6-delete, private-list, private-assign, private-delete`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
export { run };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=network-1ycEIJqT.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-1ycEIJqT.mjs","names":[],"sources":["../src/commands/network.ts"],"sourcesContent":["import type { KiwiVMClient } from \"../client.ts\";\n\nexport async function run(\n action: string,\n flags: Record<string, string>,\n client: KiwiVMClient,\n): Promise<unknown> {\n switch (action) {\n case \"ipv6-add\":\n return client.call(\"ipv6/add\");\n case \"ipv6-delete\":\n return client.call(\"ipv6/delete\", { ip: flags[\"ip\"] });\n case \"private-list\":\n return client.call(\"privateIp/getAvailableIps\");\n case \"private-assign\":\n return client.call(\"privateIp/assign\", { ip: flags[\"ip\"] });\n case \"private-delete\":\n return client.call(\"privateIp/delete\", { ip: flags[\"ip\"] });\n default:\n throw new Error(\n `Unknown network action: ${action}. Valid: ipv6-add, ipv6-delete, private-list, private-assign, private-delete`,\n );\n }\n}\n"],"mappings":";AAEA,eAAsB,IACpB,QACA,OACA,QACkB;AAClB,SAAQ,QAAR;EACE,KAAK,WACH,QAAO,OAAO,KAAK,WAAW;EAChC,KAAK,cACH,QAAO,OAAO,KAAK,eAAe,EAAE,IAAI,MAAM,OAAO,CAAC;EACxD,KAAK,eACH,QAAO,OAAO,KAAK,4BAA4B;EACjD,KAAK,iBACH,QAAO,OAAO,KAAK,oBAAoB,EAAE,IAAI,MAAM,OAAO,CAAC;EAC7D,KAAK,iBACH,QAAO,OAAO,KAAK,oBAAoB,EAAE,IAAI,MAAM,OAAO,CAAC;EAC7D,QACE,OAAM,IAAI,MACR,2BAA2B,OAAO,8EACnC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region src/commands/power.ts
|
|
2
|
+
async function run(action, _flags, client) {
|
|
3
|
+
switch (action) {
|
|
4
|
+
case "start": return client.call("start");
|
|
5
|
+
case "stop": return client.call("stop");
|
|
6
|
+
case "restart": return client.call("restart");
|
|
7
|
+
case "kill": return client.call("kill");
|
|
8
|
+
default: throw new Error(`Unknown power action: ${action}. Valid: start, stop, restart, kill`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
export { run };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=power-CDg0Mx1A.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"power-CDg0Mx1A.mjs","names":[],"sources":["../src/commands/power.ts"],"sourcesContent":["import type { KiwiVMClient } from \"../client.ts\";\n\nexport async function run(\n action: string,\n _flags: Record<string, string>,\n client: KiwiVMClient,\n): Promise<unknown> {\n switch (action) {\n case \"start\":\n return client.call(\"start\");\n case \"stop\":\n return client.call(\"stop\");\n case \"restart\":\n return client.call(\"restart\");\n case \"kill\":\n return client.call(\"kill\");\n default:\n throw new Error(\n `Unknown power action: ${action}. Valid: start, stop, restart, kill`,\n );\n }\n}\n"],"mappings":";AAEA,eAAsB,IACpB,QACA,QACA,QACkB;AAClB,SAAQ,QAAR;EACE,KAAK,QACH,QAAO,OAAO,KAAK,QAAQ;EAC7B,KAAK,OACH,QAAO,OAAO,KAAK,OAAO;EAC5B,KAAK,UACH,QAAO,OAAO,KAAK,UAAU;EAC/B,KAAK,OACH,QAAO,OAAO,KAAK,OAAO;EAC5B,QACE,OAAM,IAAI,MACR,yBAAyB,OAAO,qCACjC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/commands/snapshot.ts
|
|
2
|
+
async function run(action, flags, client) {
|
|
3
|
+
switch (action) {
|
|
4
|
+
case "create": return client.call("snapshot/create", { description: flags["description"] });
|
|
5
|
+
case "list": return client.call("snapshot/list");
|
|
6
|
+
case "delete": return client.call("snapshot/delete", { snapshot: flags["snapshot"] });
|
|
7
|
+
case "restore": return client.call("snapshot/restore", { snapshot: flags["snapshot"] });
|
|
8
|
+
case "sticky": return client.call("snapshot/toggleSticky", {
|
|
9
|
+
snapshot: flags["snapshot"],
|
|
10
|
+
sticky: flags["sticky"] !== void 0 ? Number(flags["sticky"]) : void 0
|
|
11
|
+
});
|
|
12
|
+
case "export": return client.call("snapshot/export", { snapshot: flags["snapshot"] });
|
|
13
|
+
case "import": return client.call("snapshot/import", {
|
|
14
|
+
sourceVeid: flags["sourceVeid"],
|
|
15
|
+
sourceToken: flags["sourceToken"]
|
|
16
|
+
});
|
|
17
|
+
default: throw new Error(`Unknown snapshot action: ${action}. Valid: create, list, delete, restore, sticky, export, import`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { run };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=snapshot-LO_ufoj5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-LO_ufoj5.mjs","names":[],"sources":["../src/commands/snapshot.ts"],"sourcesContent":["import type { KiwiVMClient } from \"../client.ts\";\nimport type { KiwiVMResponse, Snapshot } from \"../types.ts\";\n\nexport async function run(\n action: string,\n flags: Record<string, string>,\n client: KiwiVMClient,\n): Promise<unknown> {\n switch (action) {\n case \"create\":\n return client.call(\"snapshot/create\", {\n description: flags[\"description\"],\n });\n case \"list\":\n return client.call<KiwiVMResponse & { snapshots: Snapshot[] }>(\n \"snapshot/list\",\n );\n case \"delete\":\n return client.call(\"snapshot/delete\", { snapshot: flags[\"snapshot\"] });\n case \"restore\":\n return client.call(\"snapshot/restore\", { snapshot: flags[\"snapshot\"] });\n case \"sticky\":\n return client.call(\"snapshot/toggleSticky\", {\n snapshot: flags[\"snapshot\"],\n sticky:\n flags[\"sticky\"] !== undefined ? Number(flags[\"sticky\"]) : undefined,\n });\n case \"export\":\n return client.call(\"snapshot/export\", { snapshot: flags[\"snapshot\"] });\n case \"import\":\n return client.call(\"snapshot/import\", {\n sourceVeid: flags[\"sourceVeid\"],\n sourceToken: flags[\"sourceToken\"],\n });\n default:\n throw new Error(\n `Unknown snapshot action: ${action}. Valid: create, list, delete, restore, sticky, export, import`,\n );\n }\n}\n"],"mappings":";AAGA,eAAsB,IACpB,QACA,OACA,QACkB;AAClB,SAAQ,QAAR;EACE,KAAK,SACH,QAAO,OAAO,KAAK,mBAAmB,EACpC,aAAa,MAAM,gBACpB,CAAC;EACJ,KAAK,OACH,QAAO,OAAO,KACZ,gBACD;EACH,KAAK,SACH,QAAO,OAAO,KAAK,mBAAmB,EAAE,UAAU,MAAM,aAAa,CAAC;EACxE,KAAK,UACH,QAAO,OAAO,KAAK,oBAAoB,EAAE,UAAU,MAAM,aAAa,CAAC;EACzE,KAAK,SACH,QAAO,OAAO,KAAK,yBAAyB;GAC1C,UAAU,MAAM;GAChB,QACE,MAAM,cAAc,KAAA,IAAY,OAAO,MAAM,UAAU,GAAG,KAAA;GAC7D,CAAC;EACJ,KAAK,SACH,QAAO,OAAO,KAAK,mBAAmB,EAAE,UAAU,MAAM,aAAa,CAAC;EACxE,KAAK,SACH,QAAO,OAAO,KAAK,mBAAmB;GACpC,YAAY,MAAM;GAClB,aAAa,MAAM;GACpB,CAAC;EACJ,QACE,OAAM,IAAI,MACR,4BAA4B,OAAO,gEACpC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region src/commands/system.ts
|
|
2
|
+
async function run(action, flags, client) {
|
|
3
|
+
switch (action) {
|
|
4
|
+
case "hostname": return client.call("setHostname", { newHostname: flags["newHostname"] });
|
|
5
|
+
case "rdns": return client.call("setPTR", {
|
|
6
|
+
ip: flags["ip"],
|
|
7
|
+
ptr: flags["ptr"]
|
|
8
|
+
});
|
|
9
|
+
case "password": return client.call("resetRootPassword");
|
|
10
|
+
case "sshkey":
|
|
11
|
+
if (flags["sshKeys"] !== void 0) return client.call("updateSshKeys", { sshKeys: flags["sshKeys"] });
|
|
12
|
+
return client.call("getSshKeys");
|
|
13
|
+
case "os": return client.call("getAvailableOS");
|
|
14
|
+
case "reinstall": return client.call("reinstallOS", { os: flags["os"] });
|
|
15
|
+
default: throw new Error(`Unknown system action: ${action}. Valid: hostname, rdns, password, sshkey, os, reinstall`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { run };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=system-Bl-dsqX9.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-Bl-dsqX9.mjs","names":[],"sources":["../src/commands/system.ts"],"sourcesContent":["import type { KiwiVMClient } from \"../client.ts\";\n\nexport async function run(\n action: string,\n flags: Record<string, string>,\n client: KiwiVMClient,\n): Promise<unknown> {\n switch (action) {\n case \"hostname\":\n return client.call(\"setHostname\", { newHostname: flags[\"newHostname\"] });\n case \"rdns\":\n return client.call(\"setPTR\", { ip: flags[\"ip\"], ptr: flags[\"ptr\"] });\n case \"password\":\n return client.call(\"resetRootPassword\");\n case \"sshkey\":\n if (flags[\"sshKeys\"] !== undefined) {\n return client.call(\"updateSshKeys\", { sshKeys: flags[\"sshKeys\"] });\n }\n return client.call(\"getSshKeys\");\n case \"os\":\n return client.call(\"getAvailableOS\");\n case \"reinstall\":\n return client.call(\"reinstallOS\", { os: flags[\"os\"] });\n default:\n throw new Error(\n `Unknown system action: ${action}. Valid: hostname, rdns, password, sshkey, os, reinstall`,\n );\n }\n}\n"],"mappings":";AAEA,eAAsB,IACpB,QACA,OACA,QACkB;AAClB,SAAQ,QAAR;EACE,KAAK,WACH,QAAO,OAAO,KAAK,eAAe,EAAE,aAAa,MAAM,gBAAgB,CAAC;EAC1E,KAAK,OACH,QAAO,OAAO,KAAK,UAAU;GAAE,IAAI,MAAM;GAAO,KAAK,MAAM;GAAQ,CAAC;EACtE,KAAK,WACH,QAAO,OAAO,KAAK,oBAAoB;EACzC,KAAK;AACH,OAAI,MAAM,eAAe,KAAA,EACvB,QAAO,OAAO,KAAK,iBAAiB,EAAE,SAAS,MAAM,YAAY,CAAC;AAEpE,UAAO,OAAO,KAAK,aAAa;EAClC,KAAK,KACH,QAAO,OAAO,KAAK,iBAAiB;EACtC,KAAK,YACH,QAAO,OAAO,KAAK,eAAe,EAAE,IAAI,MAAM,OAAO,CAAC;EACxD,QACE,OAAM,IAAI,MACR,0BAA0B,OAAO,0DAClC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "kiwivm-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI for managing KiwiVM (BuyVM) VPS instances",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"kiwivm-cli": "dist/index.mjs"
|
|
9
|
+
},
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/FuJuntao/kiwivm-cli.git"
|
|
13
|
+
},
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"src",
|
|
20
|
+
"LICENSE",
|
|
21
|
+
"README.md"
|
|
22
|
+
],
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=24.0.0"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"lint": "biome lint src",
|
|
28
|
+
"format": "biome format --write src",
|
|
29
|
+
"check": "biome check src",
|
|
30
|
+
"test": "vitest run",
|
|
31
|
+
"typecheck": "tsc --noEmit",
|
|
32
|
+
"build": "tsdown",
|
|
33
|
+
"prepublishOnly": "npm run build"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@biomejs/biome": "^2.4.12",
|
|
38
|
+
"@tsconfig/node-lts": "^24.0.0",
|
|
39
|
+
"@tsconfig/node-ts": "^23.6.4",
|
|
40
|
+
"@tsconfig/strictest": "^2.0.8",
|
|
41
|
+
"@types/node": "^24.0.0",
|
|
42
|
+
"tsdown": "^0.21.8",
|
|
43
|
+
"typescript": "^6.0.2",
|
|
44
|
+
"vitest": "^4.1.4"
|
|
45
|
+
}
|
|
46
|
+
}
|