@zincapp/znvault-cli 2.23.0 → 2.24.1
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/commands/host/bootstrap-token.d.ts +6 -0
- package/dist/commands/host/bootstrap-token.d.ts.map +1 -0
- package/dist/commands/host/bootstrap-token.js +64 -0
- package/dist/commands/host/bootstrap-token.js.map +1 -0
- package/dist/commands/host/config.d.ts +6 -0
- package/dist/commands/host/config.d.ts.map +1 -0
- package/dist/commands/host/config.js +140 -0
- package/dist/commands/host/config.js.map +1 -0
- package/dist/commands/host/create.d.ts +6 -0
- package/dist/commands/host/create.d.ts.map +1 -0
- package/dist/commands/host/create.js +69 -0
- package/dist/commands/host/create.js.map +1 -0
- package/dist/commands/host/delete.d.ts +6 -0
- package/dist/commands/host/delete.d.ts.map +1 -0
- package/dist/commands/host/delete.js +59 -0
- package/dist/commands/host/delete.js.map +1 -0
- package/dist/commands/host/get.d.ts +10 -0
- package/dist/commands/host/get.d.ts.map +1 -0
- package/dist/commands/host/get.js +79 -0
- package/dist/commands/host/get.js.map +1 -0
- package/dist/commands/host/helpers.d.ts +33 -0
- package/dist/commands/host/helpers.d.ts.map +1 -0
- package/dist/commands/host/helpers.js +197 -0
- package/dist/commands/host/helpers.js.map +1 -0
- package/dist/commands/host/index.d.ts +7 -0
- package/dist/commands/host/index.d.ts.map +1 -0
- package/dist/commands/host/index.js +34 -0
- package/dist/commands/host/index.js.map +1 -0
- package/dist/commands/host/list.d.ts +10 -0
- package/dist/commands/host/list.d.ts.map +1 -0
- package/dist/commands/host/list.js +100 -0
- package/dist/commands/host/list.js.map +1 -0
- package/dist/commands/host/sync.d.ts +6 -0
- package/dist/commands/host/sync.d.ts.map +1 -0
- package/dist/commands/host/sync.js +61 -0
- package/dist/commands/host/sync.js.map +1 -0
- package/dist/commands/host/types.d.ts +197 -0
- package/dist/commands/host/types.d.ts.map +1 -0
- package/dist/commands/host/types.js +4 -0
- package/dist/commands/host/types.js.map +1 -0
- package/dist/commands/quarantine.d.ts +3 -0
- package/dist/commands/quarantine.d.ts.map +1 -0
- package/dist/commands/quarantine.js +400 -0
- package/dist/commands/quarantine.js.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/client/index.d.ts +18 -0
- package/dist/lib/client/index.d.ts.map +1 -1
- package/dist/lib/client/index.js +15 -0
- package/dist/lib/client/index.js.map +1 -1
- package/dist/lib/client/quarantine.d.ts +61 -0
- package/dist/lib/client/quarantine.d.ts.map +1 -0
- package/dist/lib/client/quarantine.js +97 -0
- package/dist/lib/client/quarantine.js.map +1 -0
- package/dist/lib/mode.d.ts +4 -0
- package/dist/lib/mode.d.ts.map +1 -1
- package/dist/lib/mode.js +9 -0
- package/dist/lib/mode.js.map +1 -1
- package/dist/types/index.d.ts +64 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap-token.d.ts","sourceRoot":"","sources":["../../../src/commands/host/bootstrap-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CA0DtE"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// Path: src/commands/host/bootstrap-token.ts
|
|
2
|
+
// Generate bootstrap token for host
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import * as mode from '../../lib/mode.js';
|
|
5
|
+
import * as output from '../../lib/output.js';
|
|
6
|
+
import { parseDuration } from './helpers.js';
|
|
7
|
+
/**
|
|
8
|
+
* Register the bootstrap-token command
|
|
9
|
+
*/
|
|
10
|
+
export function registerBootstrapTokenCommand(parentCmd) {
|
|
11
|
+
parentCmd
|
|
12
|
+
.command('bootstrap-token <hostname>')
|
|
13
|
+
.alias('token')
|
|
14
|
+
.description('Generate a bootstrap token for a host')
|
|
15
|
+
.option('-e, --expires <duration>', 'Token expiration (e.g., 1h, 24h, 7d)', '24h')
|
|
16
|
+
.option('--json', 'Output as JSON')
|
|
17
|
+
.action(async (hostname, options) => {
|
|
18
|
+
// Parse expiration
|
|
19
|
+
let expiresAt;
|
|
20
|
+
try {
|
|
21
|
+
const expirationDate = parseDuration(options.expires ?? '24h');
|
|
22
|
+
expiresAt = expirationDate.toISOString();
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
const spinner = ora('Generating bootstrap token...').start();
|
|
29
|
+
try {
|
|
30
|
+
const response = await mode.apiPost(`/v1/hosts/${encodeURIComponent(hostname)}/bootstrap-token`, { expiresAt });
|
|
31
|
+
spinner.succeed('Bootstrap token generated');
|
|
32
|
+
if (options.json) {
|
|
33
|
+
output.json(response);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
console.log();
|
|
37
|
+
console.log('Bootstrap Token for ' + hostname);
|
|
38
|
+
console.log('─'.repeat(60));
|
|
39
|
+
console.log();
|
|
40
|
+
console.log(' Token: ' + response.token);
|
|
41
|
+
console.log(' Expires: ' + new Date(response.expiresAt).toLocaleString());
|
|
42
|
+
console.log();
|
|
43
|
+
console.log('Bootstrap Commands:');
|
|
44
|
+
console.log();
|
|
45
|
+
console.log(' # Option 1: Use bootstrap script (recommended)');
|
|
46
|
+
console.log(` curl -sL ${response.bootstrapUrl} | sudo bash -s -- --token ${response.token}`);
|
|
47
|
+
console.log();
|
|
48
|
+
console.log(' # Option 2: Manual installation');
|
|
49
|
+
console.log(' sudo npm install -g @zincapp/zn-vault-agent');
|
|
50
|
+
console.log(` sudo zn-vault-agent bootstrap --token ${response.token}`);
|
|
51
|
+
console.log();
|
|
52
|
+
console.log('Note: The token can only be used once and expires in ' + (options.expires ?? '24h'));
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
spinner.fail('Failed to generate bootstrap token');
|
|
56
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
await mode.closeLocalClient();
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=bootstrap-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap-token.js","sourceRoot":"","sources":["../../../src/commands/host/bootstrap-token.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/commands/host/config.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8CzC;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAgH9D"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// Path: src/commands/host/config.ts
|
|
2
|
+
// View and edit host configuration
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
import ora from 'ora';
|
|
8
|
+
import * as mode from '../../lib/mode.js';
|
|
9
|
+
import * as output from '../../lib/output.js';
|
|
10
|
+
import { formatConfigYaml } from './helpers.js';
|
|
11
|
+
/**
|
|
12
|
+
* Open editor and return the edited content
|
|
13
|
+
*/
|
|
14
|
+
async function editInEditor(content) {
|
|
15
|
+
const editor = process.env.EDITOR ?? process.env.VISUAL ?? 'vi';
|
|
16
|
+
const tmpFile = path.join(os.tmpdir(), `znvault-host-config-${Date.now()}.json`);
|
|
17
|
+
// Write content to temp file
|
|
18
|
+
fs.writeFileSync(tmpFile, content, 'utf-8');
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
const child = spawn(editor, [tmpFile], {
|
|
21
|
+
stdio: 'inherit',
|
|
22
|
+
shell: true,
|
|
23
|
+
});
|
|
24
|
+
child.on('error', (err) => {
|
|
25
|
+
fs.unlinkSync(tmpFile);
|
|
26
|
+
reject(new Error(`Failed to open editor: ${err.message}`));
|
|
27
|
+
});
|
|
28
|
+
child.on('exit', (code) => {
|
|
29
|
+
if (code !== 0) {
|
|
30
|
+
fs.unlinkSync(tmpFile);
|
|
31
|
+
reject(new Error(`Editor exited with code ${code}`));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
const edited = fs.readFileSync(tmpFile, 'utf-8');
|
|
36
|
+
fs.unlinkSync(tmpFile);
|
|
37
|
+
resolve(edited);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
reject(new Error(`Failed to read edited file: ${err instanceof Error ? err.message : String(err)}`));
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Register the config command
|
|
47
|
+
*/
|
|
48
|
+
export function registerConfigCommand(parentCmd) {
|
|
49
|
+
parentCmd
|
|
50
|
+
.command('config <hostname>')
|
|
51
|
+
.description('View or edit host configuration')
|
|
52
|
+
.option('-e, --edit', 'Open config in editor')
|
|
53
|
+
.option('-i, --import <file>', 'Import config from JSON file')
|
|
54
|
+
.option('--json', 'Output as JSON')
|
|
55
|
+
.action(async (hostname, options) => {
|
|
56
|
+
const spinner = ora('Fetching host configuration...').start();
|
|
57
|
+
try {
|
|
58
|
+
// Get current config
|
|
59
|
+
const host = await mode.apiGet(`/v1/hosts/${encodeURIComponent(hostname)}`);
|
|
60
|
+
spinner.stop();
|
|
61
|
+
// Import from file
|
|
62
|
+
if (options.import) {
|
|
63
|
+
spinner.text = 'Importing configuration...';
|
|
64
|
+
spinner.start();
|
|
65
|
+
let newConfig;
|
|
66
|
+
try {
|
|
67
|
+
const content = fs.readFileSync(options.import, 'utf-8');
|
|
68
|
+
newConfig = JSON.parse(content);
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
spinner.fail('Failed to read import file');
|
|
72
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
const updated = await mode.apiPut(`/v1/hosts/${encodeURIComponent(hostname)}`, { config: newConfig });
|
|
76
|
+
spinner.succeed(`Configuration imported (version ${updated.version})`);
|
|
77
|
+
if (options.json) {
|
|
78
|
+
output.json(updated);
|
|
79
|
+
}
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// Edit in editor
|
|
83
|
+
if (options.edit) {
|
|
84
|
+
const configJson = JSON.stringify(host.config, null, 2);
|
|
85
|
+
console.log('Opening config in editor...');
|
|
86
|
+
console.log('(Save and close the editor to apply changes, or exit without saving to cancel)');
|
|
87
|
+
console.log();
|
|
88
|
+
let editedContent;
|
|
89
|
+
try {
|
|
90
|
+
editedContent = await editInEditor(configJson);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
// Parse and validate
|
|
97
|
+
let newConfig;
|
|
98
|
+
try {
|
|
99
|
+
newConfig = JSON.parse(editedContent);
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
output.error('Invalid JSON in edited config');
|
|
103
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
// Check if changed
|
|
107
|
+
if (JSON.stringify(newConfig) === JSON.stringify(host.config)) {
|
|
108
|
+
console.log('No changes made.');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
spinner.text = 'Updating configuration...';
|
|
112
|
+
spinner.start();
|
|
113
|
+
const updated = await mode.apiPut(`/v1/hosts/${encodeURIComponent(hostname)}`, { config: newConfig });
|
|
114
|
+
spinner.succeed(`Configuration updated (version ${updated.version})`);
|
|
115
|
+
console.log();
|
|
116
|
+
console.log('To push to agents: znvault host sync ' + hostname);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
// Just display the config
|
|
120
|
+
if (options.json) {
|
|
121
|
+
output.json(host.config);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
console.log(`Host: ${hostname} (version ${host.version})`);
|
|
125
|
+
console.log();
|
|
126
|
+
console.log(formatConfigYaml(host.config));
|
|
127
|
+
console.log();
|
|
128
|
+
console.log('To edit: znvault host config ' + hostname + ' --edit');
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
spinner.fail('Failed to get host configuration');
|
|
132
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
await mode.closeLocalClient();
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/commands/host/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/host/create.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CA6D9D"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// Path: src/commands/host/create.ts
|
|
2
|
+
// Create a new host configuration
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import * as mode from '../../lib/mode.js';
|
|
6
|
+
import * as output from '../../lib/output.js';
|
|
7
|
+
import { validateHostname, printHostDetails } from './helpers.js';
|
|
8
|
+
/**
|
|
9
|
+
* Register the create command
|
|
10
|
+
*/
|
|
11
|
+
export function registerCreateCommand(parentCmd) {
|
|
12
|
+
parentCmd
|
|
13
|
+
.command('create <hostname>')
|
|
14
|
+
.description('Create a new host configuration')
|
|
15
|
+
.option('-m, --managed-key <name>', 'Managed API key name for this host')
|
|
16
|
+
.option('-d, --description <text>', 'Host description')
|
|
17
|
+
.option('-c, --config-file <path>', 'Import config from JSON file')
|
|
18
|
+
.option('--json', 'Output as JSON')
|
|
19
|
+
.action(async (hostname, options) => {
|
|
20
|
+
// Validate hostname
|
|
21
|
+
const validation = validateHostname(hostname);
|
|
22
|
+
if (!validation.valid) {
|
|
23
|
+
output.error(validation.error ?? 'Invalid hostname');
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
// Load config from file if provided
|
|
27
|
+
let config = {};
|
|
28
|
+
if (options.configFile) {
|
|
29
|
+
try {
|
|
30
|
+
const content = fs.readFileSync(options.configFile, 'utf-8');
|
|
31
|
+
config = JSON.parse(content);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
output.error(`Failed to read config file: ${err instanceof Error ? err.message : String(err)}`);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const spinner = ora('Creating host configuration...').start();
|
|
39
|
+
try {
|
|
40
|
+
const response = await mode.apiPost('/v1/hosts', {
|
|
41
|
+
hostname,
|
|
42
|
+
description: options.description,
|
|
43
|
+
managedKeyName: options.managedKey,
|
|
44
|
+
config,
|
|
45
|
+
});
|
|
46
|
+
spinner.succeed('Host configuration created');
|
|
47
|
+
if (options.json) {
|
|
48
|
+
output.json(response);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
printHostDetails(response);
|
|
52
|
+
// Show next steps
|
|
53
|
+
console.log('Next steps:');
|
|
54
|
+
console.log(` 1. Edit config: znvault host config ${hostname} --edit`);
|
|
55
|
+
console.log(` 2. Generate token: znvault host bootstrap-token ${hostname}`);
|
|
56
|
+
console.log(` 3. Install agent: curl -sL <vault>/agent/bootstrap.sh | sudo bash -s -- --token <token>`);
|
|
57
|
+
console.log();
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
spinner.fail('Failed to create host configuration');
|
|
61
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
await mode.closeLocalClient();
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/host/create.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,kCAAkC;AAElC,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,IAAI,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAElE;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAkB;IACtD,SAAS;SACN,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,0BAA0B,EAAE,oCAAoC,CAAC;SACxE,MAAM,CAAC,0BAA0B,EAAE,kBAAkB,CAAC;SACtD,MAAM,CAAC,0BAA0B,EAAE,8BAA8B,CAAC;SAClE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,OAAsB,EAAE,EAAE;QACzD,oBAAoB;QACpB,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI,kBAAkB,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,oCAAoC;QACpC,IAAI,MAAM,GAAyB,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC7D,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAyB,CAAC;YACvD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,+BAA+B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,gCAAgC,CAAC,CAAC,KAAK,EAAE,CAAC;QAE9D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAa,WAAW,EAAE;gBAC3D,QAAQ;gBACR,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,cAAc,EAAE,OAAO,CAAC,UAAU;gBAClC,MAAM;aACP,CAAC,CAAC;YAEH,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;YAE9C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAE3B,kBAAkB;YAClB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,+CAA+C,QAAQ,SAAS,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,wDAAwD,QAAQ,EAAE,CAAC,CAAC;YAChF,OAAO,CAAC,GAAG,CAAC,+FAA+F,CAAC,CAAC;YAC7G,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/host/delete.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAsD9D"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Path: src/commands/host/delete.ts
|
|
2
|
+
// Delete a host configuration
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import * as mode from '../../lib/mode.js';
|
|
5
|
+
import * as output from '../../lib/output.js';
|
|
6
|
+
import { promptConfirm } from '../../lib/prompts.js';
|
|
7
|
+
/**
|
|
8
|
+
* Register the delete command
|
|
9
|
+
*/
|
|
10
|
+
export function registerDeleteCommand(parentCmd) {
|
|
11
|
+
parentCmd
|
|
12
|
+
.command('delete <hostname>')
|
|
13
|
+
.description('Delete a host configuration')
|
|
14
|
+
.option('-y, --yes', 'Skip confirmation prompt')
|
|
15
|
+
.action(async (hostname, options) => {
|
|
16
|
+
// Confirm deletion
|
|
17
|
+
if (!options.yes) {
|
|
18
|
+
const confirmed = await promptConfirm(`Delete host configuration for '${hostname}'? This cannot be undone.`);
|
|
19
|
+
if (!confirmed) {
|
|
20
|
+
console.log('Cancelled.');
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const spinner = ora('Deleting host configuration...').start();
|
|
25
|
+
try {
|
|
26
|
+
// First get the host to show what's being deleted
|
|
27
|
+
const host = await mode.apiGet(`/v1/hosts/${encodeURIComponent(hostname)}`);
|
|
28
|
+
// Delete
|
|
29
|
+
await mode.apiDelete(`/v1/hosts/${encodeURIComponent(hostname)}`);
|
|
30
|
+
spinner.succeed(`Host configuration '${hostname}' deleted`);
|
|
31
|
+
// Show info about what was deleted
|
|
32
|
+
const certCount = host.config.targets?.length ?? 0;
|
|
33
|
+
const secretCount = host.config.secretTargets?.length ?? 0;
|
|
34
|
+
const pluginCount = host.config.plugins?.filter((p) => p.enabled !== false).length ?? 0;
|
|
35
|
+
if (certCount > 0 || secretCount > 0 || pluginCount > 0) {
|
|
36
|
+
console.log();
|
|
37
|
+
console.log('The following configuration was removed:');
|
|
38
|
+
if (certCount > 0)
|
|
39
|
+
console.log(` - ${certCount} certificate target(s)`);
|
|
40
|
+
if (secretCount > 0)
|
|
41
|
+
console.log(` - ${secretCount} secret target(s)`);
|
|
42
|
+
if (pluginCount > 0)
|
|
43
|
+
console.log(` - ${pluginCount} plugin(s)`);
|
|
44
|
+
}
|
|
45
|
+
console.log();
|
|
46
|
+
console.log('Note: Connected agents will continue running with their last known config.');
|
|
47
|
+
console.log(' They will fail to pull new config until re-bootstrapped.');
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
spinner.fail('Failed to delete host configuration');
|
|
51
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
await mode.closeLocalClient();
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/host/delete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* Register the get command
|
|
4
|
+
*/
|
|
5
|
+
export declare function registerGetCommand(parentCmd: Command): void;
|
|
6
|
+
/**
|
|
7
|
+
* Register the outdated-agents command
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerOutdatedAgentsCommand(parentCmd: Command): void;
|
|
10
|
+
//# sourceMappingURL=get.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/commands/host/get.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CA6B3D;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAkDtE"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Path: src/commands/host/get.ts
|
|
2
|
+
// Get host configuration details
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import * as mode from '../../lib/mode.js';
|
|
5
|
+
import * as output from '../../lib/output.js';
|
|
6
|
+
import { printHostDetails } from './helpers.js';
|
|
7
|
+
/**
|
|
8
|
+
* Register the get command
|
|
9
|
+
*/
|
|
10
|
+
export function registerGetCommand(parentCmd) {
|
|
11
|
+
parentCmd
|
|
12
|
+
.command('get <hostname>')
|
|
13
|
+
.description('Get host configuration details')
|
|
14
|
+
.option('--json', 'Output as JSON')
|
|
15
|
+
.action(async (hostname, options) => {
|
|
16
|
+
const spinner = ora('Fetching host configuration...').start();
|
|
17
|
+
try {
|
|
18
|
+
const response = await mode.apiGet(`/v1/hosts/${encodeURIComponent(hostname)}`);
|
|
19
|
+
spinner.stop();
|
|
20
|
+
if (options.json) {
|
|
21
|
+
output.json(response);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
printHostDetails(response);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
spinner.fail('Failed to get host configuration');
|
|
28
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
await mode.closeLocalClient();
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Register the outdated-agents command
|
|
38
|
+
*/
|
|
39
|
+
export function registerOutdatedAgentsCommand(parentCmd) {
|
|
40
|
+
parentCmd
|
|
41
|
+
.command('outdated-agents <hostname>')
|
|
42
|
+
.description('List agents with outdated configuration')
|
|
43
|
+
.option('--json', 'Output as JSON')
|
|
44
|
+
.action(async (hostname, options) => {
|
|
45
|
+
const spinner = ora('Checking for outdated agents...').start();
|
|
46
|
+
try {
|
|
47
|
+
const response = await mode.apiGet(`/v1/hosts/${encodeURIComponent(hostname)}/outdated-agents`);
|
|
48
|
+
spinner.stop();
|
|
49
|
+
if (options.json) {
|
|
50
|
+
output.json(response);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
console.log(`Host: ${response.hostname} (version ${response.currentVersion})`);
|
|
54
|
+
console.log();
|
|
55
|
+
if (response.agents.length === 0) {
|
|
56
|
+
console.log('All linked agents are up to date.');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
console.log(`Found ${response.agents.length} agent(s) with outdated config:`);
|
|
60
|
+
console.log();
|
|
61
|
+
output.table(['Agent ID', 'Config Version', 'Versions Behind'], response.agents.map((agent) => [
|
|
62
|
+
agent.agentId.substring(0, 12) + '...',
|
|
63
|
+
agent.configVersion?.toString() ?? 'never pulled',
|
|
64
|
+
String(agent.versionsBehind),
|
|
65
|
+
]));
|
|
66
|
+
console.log();
|
|
67
|
+
console.log(`To push updates: znvault host sync ${hostname}`);
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
spinner.fail('Failed to check outdated agents');
|
|
71
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
await mode.closeLocalClient();
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/host/get.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,iCAAiC;AAGjC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,IAAI,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAsB,MAAM,cAAc,CAAC;AAEpE;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAkB;IACnD,SAAS;SACN,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,OAAmB,EAAE,EAAE;QACtD,MAAM,OAAO,GAAG,GAAG,CAAC,gCAAgC,CAAC,CAAC,KAAK,EAAE,CAAC;QAE9D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAChC,aAAa,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAC5C,CAAC;YAEF,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAAC,SAAkB;IAC9D,SAAS;SACN,OAAO,CAAC,4BAA4B,CAAC;SACrC,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,OAA2B,EAAE,EAAE;QAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,iCAAiC,CAAC,CAAC,KAAK,EAAE,CAAC;QAE/D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAChC,aAAa,kBAAkB,CAAC,QAAQ,CAAC,kBAAkB,CAC5D,CAAC;YAEF,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,SAAS,QAAQ,CAAC,QAAQ,aAAa,QAAQ,CAAC,cAAc,GAAG,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,iCAAiC,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,MAAM,CAAC,KAAK,CACV,CAAC,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,EACjD,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC7B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;gBACtC,KAAK,CAAC,aAAa,EAAE,QAAQ,EAAE,IAAI,cAAc;gBACjD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC;aAC7B,CAAC,CACH,CAAC;YAEF,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAChD,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { HostConfig, HostStatus } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Format host status with color
|
|
4
|
+
*/
|
|
5
|
+
export declare function formatStatus(status: HostStatus): string;
|
|
6
|
+
/**
|
|
7
|
+
* Format relative time (e.g., "5m ago", "2h ago", "3d ago")
|
|
8
|
+
*/
|
|
9
|
+
export declare function formatRelativeTime(dateString: string | undefined): string;
|
|
10
|
+
/**
|
|
11
|
+
* Format config summary for display
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatConfigSummary(config: HostConfig['config']): string;
|
|
14
|
+
/**
|
|
15
|
+
* Validate hostname format
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateHostname(hostname: string): {
|
|
18
|
+
valid: boolean;
|
|
19
|
+
error?: string;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Parse duration string to ISO date (e.g., "1h", "24h", "7d")
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseDuration(duration: string): Date;
|
|
25
|
+
/**
|
|
26
|
+
* Pretty print config as YAML-like format
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatConfigYaml(config: HostConfig['config'], indent?: number): string;
|
|
29
|
+
/**
|
|
30
|
+
* Print host details in a formatted way
|
|
31
|
+
*/
|
|
32
|
+
export declare function printHostDetails(host: HostConfig): void;
|
|
33
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/host/helpers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAczD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAWvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAiBzE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,MAAM,CAaxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAgBrF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAyBpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,SAAI,GAAG,MAAM,CA2DjF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAwBvD"}
|