@capsulos/cli 0.1.2 → 0.3.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/dist/cli.js +37 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.js.map +1 -1
- package/package.json +4 -4
- package/src/cli.ts +33 -2
- package/src/config.ts +2 -0
package/dist/cli.js
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
// ls <template> capsules of a template
|
|
6
6
|
// shell <id> attach your terminal to a capsule
|
|
7
7
|
// forward <id> <port> http://localhost:<port> → that port inside the capsule
|
|
8
|
+
// pause <id> / resume <id> freeze and wake a capsule
|
|
9
|
+
// snapshot <id> <name> save a capsule as a new template (Docker only today)
|
|
8
10
|
// kill <id> terminate a capsule
|
|
9
11
|
// `--docker` on run/ls/shell/kill uses the local Docker provider instead of Lambda.
|
|
10
12
|
import { parseArgs } from 'node:util';
|
|
@@ -22,10 +24,13 @@ function usage() {
|
|
|
22
24
|
capsulos init [--region us-east-1] [--profile p] [--s3-bucket b ...] [--egress-connector arn]
|
|
23
25
|
capsulos template build <name> --context <dir> [--dockerfile f] [--capsulod bin | --daemon-src dir] [--memory 512]
|
|
24
26
|
[--capabilities default|all] [--tag k=v ...] [--profile p]
|
|
25
|
-
capsulos run <template> [--docker | --profile p]
|
|
27
|
+
capsulos run <template> [--no-internet [--allow host]...] [--docker | --profile p]
|
|
26
28
|
capsulos ls <template> [--docker | --profile p]
|
|
27
29
|
capsulos shell <id> [--cmd /bin/bash] [--docker | --profile p]
|
|
28
30
|
capsulos forward <id> <port> [--local-port p] [--docker | --profile p]
|
|
31
|
+
capsulos pause <id> [--docker | --profile p]
|
|
32
|
+
capsulos resume <id> [--docker | --profile p]
|
|
33
|
+
capsulos snapshot <id> <name> [--docker]
|
|
29
34
|
capsulos kill <id> [--docker | --profile p]`);
|
|
30
35
|
process.exit(2);
|
|
31
36
|
}
|
|
@@ -43,6 +48,7 @@ function lambdaProvider(profile) {
|
|
|
43
48
|
credentials: credentialsFor(profile),
|
|
44
49
|
executionRoleArn: cfg.executionRoleArn,
|
|
45
50
|
...(cfg.egressConnectorArn ? { egressConnectorArn: cfg.egressConnectorArn } : {}),
|
|
51
|
+
...(cfg.denyEgressConnectorArn ? { denyEgressConnectorArn: cfg.denyEgressConnectorArn } : {}),
|
|
46
52
|
});
|
|
47
53
|
}
|
|
48
54
|
export async function main(argv = process.argv.slice(2)) {
|
|
@@ -113,11 +119,15 @@ export async function main(argv = process.argv.slice(2)) {
|
|
|
113
119
|
const [template, ...args] = rest;
|
|
114
120
|
if (!template)
|
|
115
121
|
usage();
|
|
116
|
-
const { values } = parseArgs({
|
|
122
|
+
const { values } = parseArgs({
|
|
123
|
+
args,
|
|
124
|
+
options: { ...providerFlags, 'no-internet': { type: 'boolean' }, allow: { type: 'string', multiple: true } },
|
|
125
|
+
});
|
|
117
126
|
const t0 = Date.now();
|
|
118
127
|
const capsule = await Capsule.create(provider(values), {
|
|
119
128
|
template,
|
|
120
129
|
idle: { suspendAfterSeconds: 600, destroyAfterSeconds: 4 * 3600 },
|
|
130
|
+
...(values['no-internet'] ? { network: { internet: 'deny', allow: values.allow ?? [] } } : {}),
|
|
121
131
|
});
|
|
122
132
|
log(`capsule ready in ${Date.now() - t0}ms`);
|
|
123
133
|
console.log(capsule.id);
|
|
@@ -155,6 +165,31 @@ export async function main(argv = process.argv.slice(2)) {
|
|
|
155
165
|
await new Promise((resolve) => process.once('SIGINT', resolve));
|
|
156
166
|
return;
|
|
157
167
|
}
|
|
168
|
+
case 'pause':
|
|
169
|
+
case 'resume': {
|
|
170
|
+
const [id, ...args] = rest;
|
|
171
|
+
if (!id)
|
|
172
|
+
usage();
|
|
173
|
+
const { values } = parseArgs({ args, options: providerFlags });
|
|
174
|
+
const capsule = await Capsule.connect(provider(values), id);
|
|
175
|
+
const t0 = Date.now();
|
|
176
|
+
if (cmd === 'pause')
|
|
177
|
+
await capsule.pause();
|
|
178
|
+
else
|
|
179
|
+
await capsule.resume();
|
|
180
|
+
log(`${cmd}d ${id} in ${Date.now() - t0}ms`);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
case 'snapshot': {
|
|
184
|
+
const [id, name, ...args] = rest;
|
|
185
|
+
if (!id || !name)
|
|
186
|
+
usage();
|
|
187
|
+
const { values } = parseArgs({ args, options: providerFlags });
|
|
188
|
+
const res = await (await Capsule.connect(provider(values), id)).snapshot(name);
|
|
189
|
+
log(`saved ${id} as template ${res.template} (${res.provider})`);
|
|
190
|
+
console.log(res.template);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
158
193
|
case 'kill': {
|
|
159
194
|
const [id, ...args] = rest;
|
|
160
195
|
if (!id)
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,4EAA4E;AAC5E,8CAA8C;AAC9C,mDAAmD;AACnD,2CAA2C;AAC3C,sDAAsD;AACtD,gFAAgF;AAChF,wCAAwC;AACxC,oFAAoF;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAiB,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;AAEhE,SAAS,KAAK;IACZ,OAAO,CAAC,KAAK,CAAC
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ export interface CapsulosConfig {
|
|
|
11
11
|
executionRoleArn: string;
|
|
12
12
|
/** Optional egress connector (e.g. a VPC connector with a deny-all security group). */
|
|
13
13
|
egressConnectorArn?: string;
|
|
14
|
+
/** Optional egress connector for `--no-internet` capsules (deny-all security group). */
|
|
15
|
+
denyEgressConnectorArn?: string;
|
|
14
16
|
/** Default OS capabilities for `template build` ('default' | 'all'); the flag wins. */
|
|
15
17
|
capabilities?: 'default' | 'all';
|
|
16
18
|
/** Default tags for the images `template build` creates; the flags win. */
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,2EAA2E;AAC3E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,2EAA2E;AAC3E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAwBtE,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;AAE3C,MAAM,UAAU,UAAU,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC5C,OAAO,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAmB,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,GAAG,WAAW,iBAAiB,GAAG,gCAAgC,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAmB,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACjE,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC1B,aAAa,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACtD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,OAAO;QAAE,OAAO,qBAAqB,EAAE,CAAC;IAC9E,OAAO,qBAAqB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AAC5C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@capsulos/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "capsulos command line: set up your AWS account, build templates, list and kill capsules.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"keywords": [
|
|
@@ -52,9 +52,9 @@
|
|
|
52
52
|
"@aws-sdk/client-s3": "^3.1158.0",
|
|
53
53
|
"@aws-sdk/client-sts": "^3.1158.0",
|
|
54
54
|
"@aws-sdk/credential-providers": "^3.1158.0",
|
|
55
|
-
"@capsulos/provider-docker": "0.
|
|
56
|
-
"@capsulos/provider-lambda": "0.
|
|
57
|
-
"@capsulos/sdk": "0.
|
|
55
|
+
"@capsulos/provider-docker": "0.3.0",
|
|
56
|
+
"@capsulos/provider-lambda": "0.3.0",
|
|
57
|
+
"@capsulos/sdk": "0.3.0"
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
60
|
"@types/node": "^22.20.1",
|
package/src/cli.ts
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
// ls <template> capsules of a template
|
|
6
6
|
// shell <id> attach your terminal to a capsule
|
|
7
7
|
// forward <id> <port> http://localhost:<port> → that port inside the capsule
|
|
8
|
+
// pause <id> / resume <id> freeze and wake a capsule
|
|
9
|
+
// snapshot <id> <name> save a capsule as a new template (Docker only today)
|
|
8
10
|
// kill <id> terminate a capsule
|
|
9
11
|
// `--docker` on run/ls/shell/kill uses the local Docker provider instead of Lambda.
|
|
10
12
|
import { parseArgs } from 'node:util';
|
|
@@ -24,10 +26,13 @@ function usage(): never {
|
|
|
24
26
|
capsulos init [--region us-east-1] [--profile p] [--s3-bucket b ...] [--egress-connector arn]
|
|
25
27
|
capsulos template build <name> --context <dir> [--dockerfile f] [--capsulod bin | --daemon-src dir] [--memory 512]
|
|
26
28
|
[--capabilities default|all] [--tag k=v ...] [--profile p]
|
|
27
|
-
capsulos run <template> [--docker | --profile p]
|
|
29
|
+
capsulos run <template> [--no-internet [--allow host]...] [--docker | --profile p]
|
|
28
30
|
capsulos ls <template> [--docker | --profile p]
|
|
29
31
|
capsulos shell <id> [--cmd /bin/bash] [--docker | --profile p]
|
|
30
32
|
capsulos forward <id> <port> [--local-port p] [--docker | --profile p]
|
|
33
|
+
capsulos pause <id> [--docker | --profile p]
|
|
34
|
+
capsulos resume <id> [--docker | --profile p]
|
|
35
|
+
capsulos snapshot <id> <name> [--docker]
|
|
31
36
|
capsulos kill <id> [--docker | --profile p]`);
|
|
32
37
|
process.exit(2);
|
|
33
38
|
}
|
|
@@ -47,6 +52,7 @@ function lambdaProvider(profile?: string): LambdaProvider {
|
|
|
47
52
|
credentials: credentialsFor(profile),
|
|
48
53
|
executionRoleArn: cfg.executionRoleArn,
|
|
49
54
|
...(cfg.egressConnectorArn ? { egressConnectorArn: cfg.egressConnectorArn } : {}),
|
|
55
|
+
...(cfg.denyEgressConnectorArn ? { denyEgressConnectorArn: cfg.denyEgressConnectorArn } : {}),
|
|
50
56
|
});
|
|
51
57
|
}
|
|
52
58
|
|
|
@@ -114,11 +120,15 @@ export async function main(argv = process.argv.slice(2)): Promise<void> {
|
|
|
114
120
|
case 'run': {
|
|
115
121
|
const [template, ...args] = rest;
|
|
116
122
|
if (!template) usage();
|
|
117
|
-
const { values } = parseArgs({
|
|
123
|
+
const { values } = parseArgs({
|
|
124
|
+
args,
|
|
125
|
+
options: { ...providerFlags, 'no-internet': { type: 'boolean' }, allow: { type: 'string', multiple: true } },
|
|
126
|
+
});
|
|
118
127
|
const t0 = Date.now();
|
|
119
128
|
const capsule = await Capsule.create(provider(values), {
|
|
120
129
|
template,
|
|
121
130
|
idle: { suspendAfterSeconds: 600, destroyAfterSeconds: 4 * 3600 },
|
|
131
|
+
...(values['no-internet'] ? { network: { internet: 'deny', allow: values.allow ?? [] } } : {}),
|
|
122
132
|
});
|
|
123
133
|
log(`capsule ready in ${Date.now() - t0}ms`);
|
|
124
134
|
console.log(capsule.id);
|
|
@@ -152,6 +162,27 @@ export async function main(argv = process.argv.slice(2)): Promise<void> {
|
|
|
152
162
|
await new Promise<void>((resolve) => process.once('SIGINT', resolve));
|
|
153
163
|
return;
|
|
154
164
|
}
|
|
165
|
+
case 'pause':
|
|
166
|
+
case 'resume': {
|
|
167
|
+
const [id, ...args] = rest;
|
|
168
|
+
if (!id) usage();
|
|
169
|
+
const { values } = parseArgs({ args, options: providerFlags });
|
|
170
|
+
const capsule = await Capsule.connect(provider(values), id);
|
|
171
|
+
const t0 = Date.now();
|
|
172
|
+
if (cmd === 'pause') await capsule.pause();
|
|
173
|
+
else await capsule.resume();
|
|
174
|
+
log(`${cmd}d ${id} in ${Date.now() - t0}ms`);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
case 'snapshot': {
|
|
178
|
+
const [id, name, ...args] = rest;
|
|
179
|
+
if (!id || !name) usage();
|
|
180
|
+
const { values } = parseArgs({ args, options: providerFlags });
|
|
181
|
+
const res = await (await Capsule.connect(provider(values), id)).snapshot(name);
|
|
182
|
+
log(`saved ${id} as template ${res.template} (${res.provider})`);
|
|
183
|
+
console.log(res.template);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
155
186
|
case 'kill': {
|
|
156
187
|
const [id, ...args] = rest;
|
|
157
188
|
if (!id) usage();
|
package/src/config.ts
CHANGED
|
@@ -18,6 +18,8 @@ export interface CapsulosConfig {
|
|
|
18
18
|
executionRoleArn: string;
|
|
19
19
|
/** Optional egress connector (e.g. a VPC connector with a deny-all security group). */
|
|
20
20
|
egressConnectorArn?: string;
|
|
21
|
+
/** Optional egress connector for `--no-internet` capsules (deny-all security group). */
|
|
22
|
+
denyEgressConnectorArn?: string;
|
|
21
23
|
/** Default OS capabilities for `template build` ('default' | 'all'); the flag wins. */
|
|
22
24
|
capabilities?: 'default' | 'all';
|
|
23
25
|
/** Default tags for the images `template build` creates; the flags win. */
|