@zincapp/znvault-cli 2.29.1 → 2.29.3
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/agent/direct/update-all.d.ts.map +1 -1
- package/dist/commands/agent/direct/update-all.js +13 -8
- package/dist/commands/agent/direct/update-all.js.map +1 -1
- package/dist/commands/agent/helpers.d.ts +3 -6
- package/dist/commands/agent/helpers.d.ts.map +1 -1
- package/dist/commands/agent/helpers.js +13 -21
- package/dist/commands/agent/helpers.js.map +1 -1
- package/dist/commands/apikey/helpers.d.ts +1 -2
- package/dist/commands/apikey/helpers.d.ts.map +1 -1
- package/dist/commands/apikey/helpers.js +2 -12
- package/dist/commands/apikey/helpers.js.map +1 -1
- package/dist/commands/backup/helpers.d.ts +1 -3
- package/dist/commands/backup/helpers.d.ts.map +1 -1
- package/dist/commands/backup/helpers.js +2 -23
- package/dist/commands/backup/helpers.js.map +1 -1
- package/dist/commands/cluster.d.ts.map +1 -1
- package/dist/commands/cluster.js +3 -1
- package/dist/commands/cluster.js.map +1 -1
- package/dist/commands/device.d.ts.map +1 -1
- package/dist/commands/device.js +10 -6
- package/dist/commands/device.js.map +1 -1
- package/dist/commands/dynamic-secrets/helpers.d.ts +3 -2
- package/dist/commands/dynamic-secrets/helpers.d.ts.map +1 -1
- package/dist/commands/dynamic-secrets/helpers.js +6 -15
- package/dist/commands/dynamic-secrets/helpers.js.map +1 -1
- package/dist/commands/kms/crud.d.ts +6 -0
- package/dist/commands/kms/crud.d.ts.map +1 -0
- package/dist/commands/kms/crud.js +226 -0
- package/dist/commands/kms/crud.js.map +1 -0
- package/dist/commands/kms/crypto.d.ts +6 -0
- package/dist/commands/kms/crypto.d.ts.map +1 -0
- package/dist/commands/kms/crypto.js +190 -0
- package/dist/commands/kms/crypto.js.map +1 -0
- package/dist/commands/kms/helpers.d.ts +10 -0
- package/dist/commands/kms/helpers.d.ts.map +1 -0
- package/dist/commands/kms/helpers.js +44 -0
- package/dist/commands/kms/helpers.js.map +1 -0
- package/dist/commands/kms/index.d.ts +13 -0
- package/dist/commands/kms/index.d.ts.map +1 -0
- package/dist/commands/kms/index.js +18 -0
- package/dist/commands/kms/index.js.map +1 -0
- package/dist/commands/kms/lifecycle.d.ts +6 -0
- package/dist/commands/kms/lifecycle.d.ts.map +1 -0
- package/dist/commands/kms/lifecycle.js +124 -0
- package/dist/commands/kms/lifecycle.js.map +1 -0
- package/dist/commands/kms/types.d.ts +102 -0
- package/dist/commands/kms/types.d.ts.map +1 -0
- package/dist/commands/kms/types.js +3 -0
- package/dist/commands/kms/types.js.map +1 -0
- package/dist/commands/plugin/enable-disable.d.ts +6 -0
- package/dist/commands/plugin/enable-disable.d.ts.map +1 -0
- package/dist/commands/plugin/enable-disable.js +64 -0
- package/dist/commands/plugin/enable-disable.js.map +1 -0
- package/dist/commands/plugin/helpers.d.ts +63 -0
- package/dist/commands/plugin/helpers.d.ts.map +1 -0
- package/dist/commands/plugin/helpers.js +204 -0
- package/dist/commands/plugin/helpers.js.map +1 -0
- package/dist/commands/plugin/index.d.ts +10 -0
- package/dist/commands/plugin/index.d.ts.map +1 -0
- package/dist/commands/plugin/index.js +24 -0
- package/dist/commands/plugin/index.js.map +1 -0
- package/dist/commands/plugin/info.d.ts +6 -0
- package/dist/commands/plugin/info.d.ts.map +1 -0
- package/dist/commands/plugin/info.js +108 -0
- package/dist/commands/plugin/info.js.map +1 -0
- package/dist/commands/plugin/install.d.ts +6 -0
- package/dist/commands/plugin/install.d.ts.map +1 -0
- package/dist/commands/plugin/install.js +96 -0
- package/dist/commands/plugin/install.js.map +1 -0
- package/dist/commands/plugin/list.d.ts +6 -0
- package/dist/commands/plugin/list.d.ts.map +1 -0
- package/dist/commands/plugin/list.js +60 -0
- package/dist/commands/plugin/list.js.map +1 -0
- package/dist/commands/plugin/types.d.ts +37 -0
- package/dist/commands/plugin/types.d.ts.map +1 -0
- package/dist/commands/plugin/types.js +7 -0
- package/dist/commands/plugin/types.js.map +1 -0
- package/dist/commands/plugin/uninstall.d.ts +6 -0
- package/dist/commands/plugin/uninstall.d.ts.map +1 -0
- package/dist/commands/plugin/uninstall.js +50 -0
- package/dist/commands/plugin/uninstall.js.map +1 -0
- package/dist/commands/plugin/update.d.ts +6 -0
- package/dist/commands/plugin/update.d.ts.map +1 -0
- package/dist/commands/plugin/update.js +84 -0
- package/dist/commands/plugin/update.js.map +1 -0
- package/dist/commands/policy/attachments.d.ts.map +1 -1
- package/dist/commands/policy/attachments.js +14 -20
- package/dist/commands/policy/attachments.js.map +1 -1
- package/dist/commands/policy/crud.d.ts.map +1 -1
- package/dist/commands/policy/crud.js +13 -23
- package/dist/commands/policy/crud.js.map +1 -1
- package/dist/commands/policy/io.d.ts.map +1 -1
- package/dist/commands/policy/io.js +4 -5
- package/dist/commands/policy/io.js.map +1 -1
- package/dist/commands/policy/list.d.ts.map +1 -1
- package/dist/commands/policy/list.js +7 -8
- package/dist/commands/policy/list.js.map +1 -1
- package/dist/commands/quarantine.d.ts.map +1 -1
- package/dist/commands/quarantine.js +1 -9
- package/dist/commands/quarantine.js.map +1 -1
- package/dist/commands/role.d.ts.map +1 -1
- package/dist/commands/role.js +4 -10
- package/dist/commands/role.js.map +1 -1
- package/dist/commands/secret/helpers.d.ts +1 -2
- package/dist/commands/secret/helpers.d.ts.map +1 -1
- package/dist/commands/secret/helpers.js +2 -14
- package/dist/commands/secret/helpers.js.map +1 -1
- package/dist/commands/secret/list.d.ts.map +1 -1
- package/dist/commands/secret/list.js +3 -4
- package/dist/commands/secret/list.js.map +1 -1
- package/dist/commands/ssh/bookmark.d.ts +11 -0
- package/dist/commands/ssh/bookmark.d.ts.map +1 -0
- package/dist/commands/ssh/bookmark.js +210 -0
- package/dist/commands/ssh/bookmark.js.map +1 -0
- package/dist/commands/ssh/ca.d.ts +6 -0
- package/dist/commands/ssh/ca.d.ts.map +1 -0
- package/dist/commands/ssh/ca.js +162 -0
- package/dist/commands/ssh/ca.js.map +1 -0
- package/dist/commands/ssh/cert.d.ts +6 -0
- package/dist/commands/ssh/cert.d.ts.map +1 -0
- package/dist/commands/ssh/cert.js +303 -0
- package/dist/commands/ssh/cert.js.map +1 -0
- package/dist/commands/ssh/config.d.ts +6 -0
- package/dist/commands/ssh/config.d.ts.map +1 -0
- package/dist/commands/ssh/config.js +95 -0
- package/dist/commands/ssh/config.js.map +1 -0
- package/dist/commands/ssh/connect.d.ts +12 -0
- package/dist/commands/ssh/connect.d.ts.map +1 -0
- package/dist/commands/ssh/connect.js +226 -0
- package/dist/commands/ssh/connect.js.map +1 -0
- package/dist/commands/ssh/exec.d.ts +6 -0
- package/dist/commands/ssh/exec.d.ts.map +1 -0
- package/dist/commands/ssh/exec.js +218 -0
- package/dist/commands/ssh/exec.js.map +1 -0
- package/dist/commands/ssh/helpers.d.ts +46 -0
- package/dist/commands/ssh/helpers.d.ts.map +1 -0
- package/dist/commands/ssh/helpers.js +175 -0
- package/dist/commands/ssh/helpers.js.map +1 -0
- package/dist/commands/ssh/hosts.d.ts +6 -0
- package/dist/commands/ssh/hosts.d.ts.map +1 -0
- package/dist/commands/ssh/hosts.js +101 -0
- package/dist/commands/ssh/hosts.js.map +1 -0
- package/dist/commands/ssh/index.d.ts +24 -0
- package/dist/commands/ssh/index.d.ts.map +1 -0
- package/dist/commands/ssh/index.js +109 -0
- package/dist/commands/ssh/index.js.map +1 -0
- package/dist/commands/ssh/mapping.d.ts +6 -0
- package/dist/commands/ssh/mapping.d.ts.map +1 -0
- package/dist/commands/ssh/mapping.js +130 -0
- package/dist/commands/ssh/mapping.js.map +1 -0
- package/dist/commands/ssh/scp.d.ts +6 -0
- package/dist/commands/ssh/scp.d.ts.map +1 -0
- package/dist/commands/ssh/scp.js +219 -0
- package/dist/commands/ssh/scp.js.map +1 -0
- package/dist/commands/ssh/server-group.d.ts +6 -0
- package/dist/commands/ssh/server-group.d.ts.map +1 -0
- package/dist/commands/ssh/server-group.js +249 -0
- package/dist/commands/ssh/server-group.js.map +1 -0
- package/dist/commands/ssh/types.d.ts +150 -0
- package/dist/commands/ssh/types.d.ts.map +1 -0
- package/dist/commands/ssh/types.js +3 -0
- package/dist/commands/ssh/types.js.map +1 -0
- package/dist/commands/ssh-ca/helpers.d.ts +1 -8
- package/dist/commands/ssh-ca/helpers.d.ts.map +1 -1
- package/dist/commands/ssh-ca/helpers.js +2 -23
- package/dist/commands/ssh-ca/helpers.js.map +1 -1
- package/dist/commands/sso/crud.d.ts +6 -0
- package/dist/commands/sso/crud.d.ts.map +1 -0
- package/dist/commands/sso/crud.js +360 -0
- package/dist/commands/sso/crud.js.map +1 -0
- package/dist/commands/sso/helpers.d.ts +9 -0
- package/dist/commands/sso/helpers.d.ts.map +1 -0
- package/dist/commands/sso/helpers.js +13 -0
- package/dist/commands/sso/helpers.js.map +1 -0
- package/dist/commands/sso/index.d.ts +13 -0
- package/dist/commands/sso/index.d.ts.map +1 -0
- package/dist/commands/sso/index.js +16 -0
- package/dist/commands/sso/index.js.map +1 -0
- package/dist/commands/sso/types.d.ts +119 -0
- package/dist/commands/sso/types.d.ts.map +1 -0
- package/dist/commands/sso/types.js +3 -0
- package/dist/commands/sso/types.js.map +1 -0
- package/dist/commands/sso/users.d.ts +6 -0
- package/dist/commands/sso/users.d.ts.map +1 -0
- package/dist/commands/sso/users.js +128 -0
- package/dist/commands/sso/users.js.map +1 -0
- package/dist/commands/unseal.d.ts.map +1 -1
- package/dist/commands/unseal.js +10 -20
- package/dist/commands/unseal.js.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/cli-update.d.ts.map +1 -1
- package/dist/lib/cli-update.js +18 -14
- package/dist/lib/cli-update.js.map +1 -1
- package/dist/lib/client/http.d.ts +3 -1
- package/dist/lib/client/http.d.ts.map +1 -1
- package/dist/lib/client/http.js +41 -8
- package/dist/lib/client/http.js.map +1 -1
- package/dist/lib/config/autounseal.d.ts +4 -0
- package/dist/lib/config/autounseal.d.ts.map +1 -1
- package/dist/lib/config/autounseal.js +102 -6
- package/dist/lib/config/autounseal.js.map +1 -1
- package/dist/lib/config/credentials.d.ts.map +1 -1
- package/dist/lib/config/credentials.js +3 -2
- package/dist/lib/config/credentials.js.map +1 -1
- package/dist/lib/config/index.d.ts +2 -1
- package/dist/lib/config/index.d.ts.map +1 -1
- package/dist/lib/config/index.js +3 -1
- package/dist/lib/config/index.js.map +1 -1
- package/dist/lib/config/keychain.d.ts +27 -0
- package/dist/lib/config/keychain.d.ts.map +1 -0
- package/dist/lib/config/keychain.js +194 -0
- package/dist/lib/config/keychain.js.map +1 -0
- package/dist/lib/config/types.d.ts +12 -0
- package/dist/lib/config/types.d.ts.map +1 -1
- package/dist/lib/config/types.js +3 -2
- package/dist/lib/config/types.js.map +1 -1
- package/dist/lib/constants.d.ts +24 -0
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +34 -1
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/db/health.d.ts.map +1 -1
- package/dist/lib/db/health.js +14 -7
- package/dist/lib/db/health.js.map +1 -1
- package/dist/lib/debug.d.ts +17 -0
- package/dist/lib/debug.d.ts.map +1 -0
- package/dist/lib/debug.js +50 -0
- package/dist/lib/debug.js.map +1 -0
- package/dist/lib/format-helpers.d.ts +43 -0
- package/dist/lib/format-helpers.d.ts.map +1 -1
- package/dist/lib/format-helpers.js +85 -0
- package/dist/lib/format-helpers.js.map +1 -1
- package/dist/lib/local.d.ts.map +1 -1
- package/dist/lib/local.js +12 -8
- package/dist/lib/local.js.map +1 -1
- package/dist/lib/mode.d.ts.map +1 -1
- package/dist/lib/mode.js +2 -1
- package/dist/lib/mode.js.map +1 -1
- package/dist/lib/output.d.ts +10 -0
- package/dist/lib/output.d.ts.map +1 -1
- package/dist/lib/output.js +21 -0
- package/dist/lib/output.js.map +1 -1
- package/dist/services/auto-update-daemon.d.ts.map +1 -1
- package/dist/services/auto-update-daemon.js +10 -6
- package/dist/services/auto-update-daemon.js.map +1 -1
- package/dist/services/update-checker.d.ts.map +1 -1
- package/dist/services/update-checker.js +2 -1
- package/dist/services/update-checker.js.map +1 -1
- package/dist/services/update-installer.d.ts +8 -0
- package/dist/services/update-installer.d.ts.map +1 -1
- package/dist/services/update-installer.js +47 -18
- package/dist/services/update-installer.js.map +1 -1
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/commands/kms.d.ts +0 -3
- package/dist/commands/kms.d.ts.map +0 -1
- package/dist/commands/kms.js +0 -555
- package/dist/commands/kms.js.map +0 -1
- package/dist/commands/plugin.d.ts +0 -8
- package/dist/commands/plugin.d.ts.map +0 -1
- package/dist/commands/plugin.js +0 -637
- package/dist/commands/plugin.js.map +0 -1
- package/dist/commands/ssh.d.ts +0 -3
- package/dist/commands/ssh.d.ts.map +0 -1
- package/dist/commands/ssh.js +0 -814
- package/dist/commands/ssh.js.map +0 -1
- package/dist/commands/sso.d.ts +0 -3
- package/dist/commands/sso.d.ts.map +0 -1
- package/dist/commands/sso.js +0 -486
- package/dist/commands/sso.js.map +0 -1
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
// Path: src/commands/ssh/helpers.ts
|
|
2
|
+
/**
|
|
3
|
+
* SSH CA command helper functions
|
|
4
|
+
*/
|
|
5
|
+
import { client } from '../../lib/client.js';
|
|
6
|
+
import { formatTtl, parseTtl } from '../../lib/format-helpers.js';
|
|
7
|
+
// Re-export common formatters from centralized location
|
|
8
|
+
export { formatTtl, parseTtl };
|
|
9
|
+
/**
|
|
10
|
+
* Get path to the default SSH key
|
|
11
|
+
*/
|
|
12
|
+
export async function getDefaultKeyPath() {
|
|
13
|
+
const fs = await import('fs');
|
|
14
|
+
const path = await import('path');
|
|
15
|
+
const os = await import('os');
|
|
16
|
+
const sshDir = path.join(os.homedir(), '.ssh');
|
|
17
|
+
const keyTypes = ['id_ed25519', 'id_ecdsa', 'id_rsa'];
|
|
18
|
+
for (const keyType of keyTypes) {
|
|
19
|
+
const keyPath = path.join(sshDir, keyType);
|
|
20
|
+
const pubPath = path.join(sshDir, `${keyType}.pub`);
|
|
21
|
+
if (fs.existsSync(keyPath) && fs.existsSync(pubPath)) {
|
|
22
|
+
return keyPath;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get the certificate path for a given key path
|
|
29
|
+
*/
|
|
30
|
+
export async function getCertificatePath(keyPath) {
|
|
31
|
+
const path = await import('path');
|
|
32
|
+
const dir = path.dirname(keyPath);
|
|
33
|
+
const base = path.basename(keyPath);
|
|
34
|
+
return path.join(dir, `${base}-cert.pub`);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if a certificate is valid (exists and not expired)
|
|
38
|
+
*/
|
|
39
|
+
export async function isCertificateValid(certPath) {
|
|
40
|
+
const fs = await import('fs');
|
|
41
|
+
const { execSync } = await import('child_process');
|
|
42
|
+
if (!fs.existsSync(certPath)) {
|
|
43
|
+
return { valid: false, reason: 'Certificate does not exist' };
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
// Use ssh-keygen -L to inspect the certificate
|
|
47
|
+
const output = execSync(`ssh-keygen -L -f "${certPath}"`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
48
|
+
// Parse "Valid: from YYYY-MM-DDTHH:MM:SS to YYYY-MM-DDTHH:MM:SS"
|
|
49
|
+
const validMatch = output.match(/Valid:\s+from\s+(\S+)\s+to\s+(\S+)/);
|
|
50
|
+
if (!validMatch) {
|
|
51
|
+
return { valid: false, reason: 'Could not parse certificate validity' };
|
|
52
|
+
}
|
|
53
|
+
const validBefore = new Date(validMatch[2]);
|
|
54
|
+
const now = new Date();
|
|
55
|
+
// Check if expired (with 5 minute buffer)
|
|
56
|
+
if (validBefore.getTime() - now.getTime() < 5 * 60 * 1000) {
|
|
57
|
+
return { valid: false, reason: 'Certificate expired or expiring soon' };
|
|
58
|
+
}
|
|
59
|
+
return { valid: true };
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return { valid: false, reason: 'Failed to inspect certificate' };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Sign a certificate using the vault API
|
|
67
|
+
*/
|
|
68
|
+
export async function signCertificate(publicKeyPath, certPath, principals, ttl, tenant) {
|
|
69
|
+
const fs = await import('fs');
|
|
70
|
+
const publicKey = fs.readFileSync(publicKeyPath, 'utf8').trim();
|
|
71
|
+
const query = tenant ? `?tenantId=${encodeURIComponent(tenant)}` : '';
|
|
72
|
+
const body = { publicKey };
|
|
73
|
+
if (ttl) {
|
|
74
|
+
body.ttlSeconds = parseTtl(ttl);
|
|
75
|
+
}
|
|
76
|
+
if (principals) {
|
|
77
|
+
body.principals = principals.split(',').map(p => p.trim());
|
|
78
|
+
}
|
|
79
|
+
const result = await client.post(`/v1/ssh/sign${query}`, body);
|
|
80
|
+
fs.writeFileSync(certPath, result.certificate + '\n');
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check if a certificate is expired
|
|
84
|
+
*/
|
|
85
|
+
export function isExpired(validBefore) {
|
|
86
|
+
return new Date(validBefore) < new Date();
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Build tenant query string parameter
|
|
90
|
+
*/
|
|
91
|
+
export function buildTenantQuery(tenant) {
|
|
92
|
+
return tenant ? `?tenantId=${encodeURIComponent(tenant)}` : '';
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Parse local certificate details using ssh-keygen
|
|
96
|
+
*/
|
|
97
|
+
export async function parseCertificateInfo(certPath) {
|
|
98
|
+
const fs = await import('fs');
|
|
99
|
+
const { execSync } = await import('child_process');
|
|
100
|
+
if (!fs.existsSync(certPath)) {
|
|
101
|
+
return {
|
|
102
|
+
valid: false,
|
|
103
|
+
principals: [],
|
|
104
|
+
validAfter: null,
|
|
105
|
+
validBefore: null,
|
|
106
|
+
fingerprint: null,
|
|
107
|
+
keyId: null,
|
|
108
|
+
serial: null,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const output = execSync(`ssh-keygen -L -f "${certPath}"`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
113
|
+
// Parse principals
|
|
114
|
+
const principals = [];
|
|
115
|
+
const principalsMatch = output.match(/Principals:\s*([\s\S]*?)(?=\s+Critical Options:)/);
|
|
116
|
+
if (principalsMatch) {
|
|
117
|
+
const lines = principalsMatch[1].trim().split('\n');
|
|
118
|
+
for (const line of lines) {
|
|
119
|
+
const principal = line.trim();
|
|
120
|
+
if (principal) {
|
|
121
|
+
principals.push(principal);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Parse validity
|
|
126
|
+
const validMatch = output.match(/Valid:\s+from\s+(\S+)\s+to\s+(\S+)/);
|
|
127
|
+
const validAfter = validMatch ? new Date(validMatch[1]) : null;
|
|
128
|
+
const validBefore = validMatch ? new Date(validMatch[2]) : null;
|
|
129
|
+
// Parse fingerprint
|
|
130
|
+
const fpMatch = output.match(/Public key:.*?(\S+:\S+)/);
|
|
131
|
+
const fingerprint = fpMatch ? fpMatch[1] : null;
|
|
132
|
+
// Parse key ID
|
|
133
|
+
const keyIdMatch = output.match(/Key ID:\s*"([^"]+)"/);
|
|
134
|
+
const keyId = keyIdMatch ? keyIdMatch[1] : null;
|
|
135
|
+
// Parse serial
|
|
136
|
+
const serialMatch = output.match(/Serial:\s*(\d+)/);
|
|
137
|
+
const serial = serialMatch ? serialMatch[1] : null;
|
|
138
|
+
// Check validity
|
|
139
|
+
const now = new Date();
|
|
140
|
+
const valid = validBefore ? validBefore.getTime() > now.getTime() : false;
|
|
141
|
+
return { valid, principals, validAfter, validBefore, fingerprint, keyId, serial };
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return {
|
|
145
|
+
valid: false,
|
|
146
|
+
principals: [],
|
|
147
|
+
validAfter: null,
|
|
148
|
+
validBefore: null,
|
|
149
|
+
fingerprint: null,
|
|
150
|
+
keyId: null,
|
|
151
|
+
serial: null,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Format remaining time as human-readable string
|
|
157
|
+
*/
|
|
158
|
+
export function formatRemainingTime(validBefore) {
|
|
159
|
+
const now = new Date();
|
|
160
|
+
const diff = validBefore.getTime() - now.getTime();
|
|
161
|
+
if (diff <= 0) {
|
|
162
|
+
return 'expired';
|
|
163
|
+
}
|
|
164
|
+
const hours = Math.floor(diff / (1000 * 60 * 60));
|
|
165
|
+
const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
|
|
166
|
+
if (hours > 24) {
|
|
167
|
+
const days = Math.floor(hours / 24);
|
|
168
|
+
return `${days}d ${hours % 24}h`;
|
|
169
|
+
}
|
|
170
|
+
if (hours > 0) {
|
|
171
|
+
return `${hours}h ${minutes}m`;
|
|
172
|
+
}
|
|
173
|
+
return `${minutes}m`;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/commands/ssh/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosts.d.ts","sourceRoot":"","sources":["../../../src/commands/ssh/hosts.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BzC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAsF1D"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Path: src/commands/ssh/hosts.ts
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { client } from '../../lib/client.js';
|
|
4
|
+
import * as output from '../../lib/output.js';
|
|
5
|
+
export function registerHostsCommand(parent) {
|
|
6
|
+
parent
|
|
7
|
+
.command('hosts')
|
|
8
|
+
.description('List available hosts from registered agents')
|
|
9
|
+
.option('--tenant <id>', 'Tenant ID (superadmin only)')
|
|
10
|
+
.option('--online-only', 'Show only online agents')
|
|
11
|
+
.option('--json', 'Output as JSON')
|
|
12
|
+
.action(async (options) => {
|
|
13
|
+
const spinner = ora('Fetching hosts...').start();
|
|
14
|
+
try {
|
|
15
|
+
const params = new URLSearchParams();
|
|
16
|
+
if (options.tenant)
|
|
17
|
+
params.set('tenantId', options.tenant);
|
|
18
|
+
params.set('limit', '100');
|
|
19
|
+
const queryString = params.toString();
|
|
20
|
+
const url = queryString ? '/v1/agents?' + queryString : '/v1/agents';
|
|
21
|
+
const response = await client.get(url);
|
|
22
|
+
spinner.stop();
|
|
23
|
+
// Handle both array and paginated response formats
|
|
24
|
+
let agents;
|
|
25
|
+
if (Array.isArray(response)) {
|
|
26
|
+
agents = response;
|
|
27
|
+
}
|
|
28
|
+
else if (response && 'items' in response) {
|
|
29
|
+
agents = response.items ?? [];
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
agents = [];
|
|
33
|
+
}
|
|
34
|
+
// Filter online only if requested
|
|
35
|
+
if (options.onlineOnly) {
|
|
36
|
+
agents = agents.filter(a => a.status === 'online');
|
|
37
|
+
}
|
|
38
|
+
if (options.json) {
|
|
39
|
+
output.json(agents.map(a => ({
|
|
40
|
+
id: a.id,
|
|
41
|
+
name: a.name,
|
|
42
|
+
hostname: a.hostname,
|
|
43
|
+
ip: a.ip,
|
|
44
|
+
status: a.status,
|
|
45
|
+
lastSeen: a.lastSeen,
|
|
46
|
+
hostConfig: a.hostConfigName,
|
|
47
|
+
})));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (agents.length === 0) {
|
|
51
|
+
output.info('No hosts found');
|
|
52
|
+
if (options.onlineOnly) {
|
|
53
|
+
output.info('Try without --online-only to see all hosts');
|
|
54
|
+
}
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
output.section('Available Hosts');
|
|
58
|
+
output.table(['Name', 'Hostname', 'IP', 'Status', 'Last Seen', 'Config'], agents.map(a => [
|
|
59
|
+
a.name,
|
|
60
|
+
a.hostname ?? '-',
|
|
61
|
+
a.ip ?? '-',
|
|
62
|
+
a.status === 'online' ? '● Online' : a.status === 'offline' ? '○ Offline' : '? Unknown',
|
|
63
|
+
a.lastSeen ? formatLastSeen(a.lastSeen) : '-',
|
|
64
|
+
a.hostConfigName ?? '-',
|
|
65
|
+
]));
|
|
66
|
+
output.info('Total: ' + agents.length + ' host(s)');
|
|
67
|
+
// Show connection hint
|
|
68
|
+
if (agents.some(a => a.ip)) {
|
|
69
|
+
console.log();
|
|
70
|
+
const firstWithIp = agents.find(a => a.ip);
|
|
71
|
+
if (firstWithIp) {
|
|
72
|
+
output.info('Connect: znvault ssh connect ' + firstWithIp.ip);
|
|
73
|
+
output.info('Or add a bookmark: znvault ssh bookmark add ' + firstWithIp.name + ' ' + firstWithIp.ip);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
spinner.fail('Failed to fetch hosts');
|
|
79
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
function formatLastSeen(lastSeen) {
|
|
85
|
+
const date = new Date(lastSeen);
|
|
86
|
+
const now = new Date();
|
|
87
|
+
const diff = now.getTime() - date.getTime();
|
|
88
|
+
const minutes = Math.floor(diff / (1000 * 60));
|
|
89
|
+
const hours = Math.floor(diff / (1000 * 60 * 60));
|
|
90
|
+
const days = Math.floor(diff / (1000 * 60 * 60 * 24));
|
|
91
|
+
if (minutes < 1)
|
|
92
|
+
return 'just now';
|
|
93
|
+
if (minutes < 60)
|
|
94
|
+
return minutes + 'm ago';
|
|
95
|
+
if (hours < 24)
|
|
96
|
+
return hours + 'h ago';
|
|
97
|
+
if (days < 7)
|
|
98
|
+
return days + 'd ago';
|
|
99
|
+
return date.toLocaleDateString();
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=hosts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosts.js","sourceRoot":"","sources":["../../../src/commands/ssh/hosts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSH Certificate Authority commands
|
|
3
|
+
*
|
|
4
|
+
* This module provides comprehensive SSH CA management including:
|
|
5
|
+
* - CA lifecycle (init, status, delete, public-key)
|
|
6
|
+
* - Certificate signing and management
|
|
7
|
+
* - Principal mappings (SSO groups → SSH principals)
|
|
8
|
+
* - Server groups with access rules
|
|
9
|
+
* - Local SSH configuration and defaults
|
|
10
|
+
* - Host bookmarks for quick access
|
|
11
|
+
* - Host discovery from registered agents
|
|
12
|
+
* - SCP file transfer with certificate auth
|
|
13
|
+
* - Convenience connect command with auto-signing
|
|
14
|
+
*
|
|
15
|
+
* Quick connect shortcut:
|
|
16
|
+
* znvault ssh user@host # Direct connection
|
|
17
|
+
* znvault ssh my-bookmark # Connect via bookmark
|
|
18
|
+
*/
|
|
19
|
+
import type { Command } from 'commander';
|
|
20
|
+
export declare function registerSSHCommands(program: Command): void;
|
|
21
|
+
export * from './types.js';
|
|
22
|
+
export { getDefaultKeyPath, getCertificatePath, isCertificateValid, signCertificate, formatTtl, parseTtl, isExpired, buildTenantQuery, parseCertificateInfo, formatRemainingTime, } from './helpers.js';
|
|
23
|
+
export { resolveBookmark } from './bookmark.js';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/ssh/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6DzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmD1D;AAGD,cAAc,YAAY,CAAC;AAG3B,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// Path: src/commands/ssh/index.ts
|
|
2
|
+
import { registerCACommands } from './ca.js';
|
|
3
|
+
import { registerCertCommands } from './cert.js';
|
|
4
|
+
import { registerMappingCommands } from './mapping.js';
|
|
5
|
+
import { registerServerGroupCommands } from './server-group.js';
|
|
6
|
+
import { registerConfigCommands } from './config.js';
|
|
7
|
+
import { registerConnectCommand, executeConnect } from './connect.js';
|
|
8
|
+
import { registerBookmarkCommands, resolveBookmark } from './bookmark.js';
|
|
9
|
+
import { registerSCPCommand } from './scp.js';
|
|
10
|
+
import { registerHostsCommand } from './hosts.js';
|
|
11
|
+
import { registerExecCommand } from './exec.js';
|
|
12
|
+
// Known subcommands that should NOT be treated as destinations
|
|
13
|
+
const SSH_SUBCOMMANDS = new Set([
|
|
14
|
+
'ca', 'cert', 'mapping', 'server-group', 'config',
|
|
15
|
+
'bookmark', 'bm', 'hosts', 'scp', 'connect', 'exec',
|
|
16
|
+
'help', '--help', '-h',
|
|
17
|
+
]);
|
|
18
|
+
/**
|
|
19
|
+
* Check if a string looks like an SSH destination rather than a subcommand
|
|
20
|
+
*/
|
|
21
|
+
function looksLikeDestination(arg) {
|
|
22
|
+
// Known subcommand - definitely not a destination
|
|
23
|
+
if (SSH_SUBCOMMANDS.has(arg)) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
// Contains @ - it's user@host format
|
|
27
|
+
if (arg.includes('@')) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
// Is a bookmark
|
|
31
|
+
if (resolveBookmark(arg)) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
// Looks like an IP address (v4 or v6)
|
|
35
|
+
if (/^[\d.:]+$/.test(arg) || arg.startsWith('[')) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
// Contains dots - likely a hostname
|
|
39
|
+
if (arg.includes('.')) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
// Short hostname without dots - could be a bookmark or local host
|
|
43
|
+
// Only treat as destination if it doesn't look like a flag
|
|
44
|
+
if (!arg.startsWith('-') && /^[a-zA-Z0-9][\w-]*$/.test(arg)) {
|
|
45
|
+
// Could be an unknown subcommand or a simple hostname
|
|
46
|
+
// Be conservative: only treat as destination if it resolves to a bookmark
|
|
47
|
+
// This prevents `znvault ssh typo` from trying to connect
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
export function registerSSHCommands(program) {
|
|
53
|
+
const ssh = program
|
|
54
|
+
.command('ssh')
|
|
55
|
+
.description('SSH CA management and quick connect (znvault ssh user@host)')
|
|
56
|
+
.argument('[destination]', 'Host to connect to (user@host or bookmark name)')
|
|
57
|
+
.argument('[command...]', 'Remote command to execute')
|
|
58
|
+
.option('-i, --identity <file>', 'Path to SSH private key')
|
|
59
|
+
.option('-p, --port <port>', 'SSH port', '22')
|
|
60
|
+
.option('--principals <principals>', 'Principals for signing (comma-separated)')
|
|
61
|
+
.option('--ttl <ttl>', 'Certificate TTL (e.g., 8h, 1d)')
|
|
62
|
+
.option('--tenant <id>', 'Tenant ID (superadmin only)')
|
|
63
|
+
.option('--force-sign', 'Force re-signing even if certificate is valid')
|
|
64
|
+
.option('--dry-run', 'Show what would be done without executing SSH')
|
|
65
|
+
.option('-v, --verbose', 'Show verbose output')
|
|
66
|
+
.option('-t', 'Force pseudo-terminal allocation')
|
|
67
|
+
.option('-T', 'Disable pseudo-terminal allocation')
|
|
68
|
+
.allowUnknownOption(false)
|
|
69
|
+
.action(async (destination, remoteCommand, options) => {
|
|
70
|
+
// If no destination provided, show help
|
|
71
|
+
if (!destination) {
|
|
72
|
+
ssh.outputHelp();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// Check if it looks like a destination
|
|
76
|
+
if (looksLikeDestination(destination)) {
|
|
77
|
+
await executeConnect(destination, remoteCommand, options);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// Not a destination - might be a typo or unknown subcommand
|
|
81
|
+
// Show help with a hint
|
|
82
|
+
console.error(`Unknown subcommand or destination: ${destination}`);
|
|
83
|
+
console.error('');
|
|
84
|
+
console.error('For quick connect, use: znvault ssh user@host');
|
|
85
|
+
console.error('For subcommands, use: znvault ssh <command> --help');
|
|
86
|
+
console.error('');
|
|
87
|
+
ssh.outputHelp();
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
// Register all sub-command groups
|
|
92
|
+
registerCACommands(ssh);
|
|
93
|
+
registerCertCommands(ssh);
|
|
94
|
+
registerMappingCommands(ssh);
|
|
95
|
+
registerServerGroupCommands(ssh);
|
|
96
|
+
registerConfigCommands(ssh);
|
|
97
|
+
registerBookmarkCommands(ssh);
|
|
98
|
+
registerHostsCommand(ssh);
|
|
99
|
+
registerSCPCommand(ssh);
|
|
100
|
+
registerConnectCommand(ssh);
|
|
101
|
+
registerExecCommand(ssh);
|
|
102
|
+
}
|
|
103
|
+
// Re-export types for external use
|
|
104
|
+
export * from './types.js';
|
|
105
|
+
// Re-export helpers for potential reuse
|
|
106
|
+
export { getDefaultKeyPath, getCertificatePath, isCertificateValid, signCertificate, formatTtl, parseTtl, isExpired, buildTenantQuery, parseCertificateInfo, formatRemainingTime, } from './helpers.js';
|
|
107
|
+
// Re-export bookmark resolver
|
|
108
|
+
export { resolveBookmark } from './bookmark.js';
|
|
109
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/ssh/index.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAsBlC,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAGhD,+DAA+D;AAC/D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ;IACjD,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM;IACnD,MAAM,EAAE,QAAQ,EAAE,IAAI;CACvB,CAAC,CAAC;AAEH;;GAEG;AACH,SAAS,oBAAoB,CAAC,GAAW;IACvC,kDAAkD;IAClD,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qCAAqC;IACrC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB;IAChB,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sCAAsC;IACtC,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oCAAoC;IACpC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kEAAkE;IAClE,2DAA2D;IAC3D,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5D,sDAAsD;QACtD,0EAA0E;QAC1E,0DAA0D;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,6DAA6D,CAAC;SAC1E,QAAQ,CAAC,eAAe,EAAE,iDAAiD,CAAC;SAC5E,QAAQ,CAAC,cAAc,EAAE,2BAA2B,CAAC;SACrD,MAAM,CAAC,uBAAuB,EAAE,yBAAyB,CAAC;SAC1D,MAAM,CAAC,mBAAmB,EAAE,UAAU,EAAE,IAAI,CAAC;SAC7C,MAAM,CAAC,2BAA2B,EAAE,0CAA0C,CAAC;SAC/E,MAAM,CAAC,aAAa,EAAE,gCAAgC,CAAC;SACvD,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;SACtD,MAAM,CAAC,cAAc,EAAE,+CAA+C,CAAC;SACvE,MAAM,CAAC,WAAW,EAAE,+CAA+C,CAAC;SACpE,MAAM,CAAC,eAAe,EAAE,qBAAqB,CAAC;SAC9C,MAAM,CAAC,IAAI,EAAE,kCAAkC,CAAC;SAChD,MAAM,CAAC,IAAI,EAAE,oCAAoC,CAAC;SAClD,kBAAkB,CAAC,KAAK,CAAC;SACzB,MAAM,CAAC,KAAK,EAAE,WAA+B,EAAE,aAAuB,EAAE,OAAuB,EAAE,EAAE;QAClG,wCAAwC;QACxC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,GAAG,CAAC,UAAU,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,uCAAuC;QACvC,IAAI,oBAAoB,CAAC,WAAW,CAAC,EAAE,CAAC;YACtC,MAAM,cAAc,CAAC,WAAW,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,4DAA4D;YAC5D,wBAAwB;YACxB,OAAO,CAAC,KAAK,CAAC,sCAAsC,WAAW,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAC/D,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACrE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,GAAG,CAAC,UAAU,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,kCAAkC;IAClC,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxB,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC1B,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC7B,2BAA2B,CAAC,GAAG,CAAC,CAAC;IACjC,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC5B,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAC9B,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC1B,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxB,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC5B,mBAAmB,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,mCAAmC;AACnC,cAAc,YAAY,CAAC;AAE3B,wCAAwC;AACxC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAEtB,8BAA8B;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping.d.ts","sourceRoot":"","sources":["../../../src/commands/ssh/mapping.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAwI7D"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// Path: src/commands/ssh/mapping.ts
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { client } from '../../lib/client.js';
|
|
4
|
+
import { promptConfirm } from '../../lib/prompts.js';
|
|
5
|
+
import * as output from '../../lib/output.js';
|
|
6
|
+
import { buildTenantQuery } from './helpers.js';
|
|
7
|
+
export function registerMappingCommands(parent) {
|
|
8
|
+
const mapping = parent
|
|
9
|
+
.command('mapping')
|
|
10
|
+
.description('SSH principal mapping management (SSO groups → SSH principals)');
|
|
11
|
+
// List Mappings
|
|
12
|
+
mapping
|
|
13
|
+
.command('list')
|
|
14
|
+
.description('List principal mappings')
|
|
15
|
+
.option('--tenant <id>', 'Tenant ID (superadmin only)')
|
|
16
|
+
.option('--json', 'Output as JSON')
|
|
17
|
+
.action(async (options) => {
|
|
18
|
+
const spinner = ora('Fetching mappings...').start();
|
|
19
|
+
try {
|
|
20
|
+
const query = buildTenantQuery(options.tenant);
|
|
21
|
+
const response = await client.get(`/v1/ssh/principal-mappings${query}`);
|
|
22
|
+
spinner.stop();
|
|
23
|
+
if (options.json) {
|
|
24
|
+
output.json(response.items);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (response.items.length === 0) {
|
|
28
|
+
output.info('No principal mappings found');
|
|
29
|
+
output.info('Use "znvault ssh mapping create" to create a mapping');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
output.table(['ID', 'Group', 'Principals', 'Created'], response.items.map(m => [
|
|
33
|
+
m.id.substring(0, 8) + '...',
|
|
34
|
+
m.groupDisplayName ?? m.groupName ?? m.groupId.substring(0, 8),
|
|
35
|
+
m.principals.join(', '),
|
|
36
|
+
output.formatDate(m.createdAt),
|
|
37
|
+
]));
|
|
38
|
+
output.info(`Total: ${response.items.length} mapping(s)`);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
spinner.fail('Failed to list mappings');
|
|
42
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
// Create Mapping
|
|
47
|
+
mapping
|
|
48
|
+
.command('create <groupId> <principals...>')
|
|
49
|
+
.description('Create principal mapping (SSO group → SSH principals)')
|
|
50
|
+
.option('--tenant <id>', 'Tenant ID (superadmin only)')
|
|
51
|
+
.option('--json', 'Output as JSON')
|
|
52
|
+
.action(async (groupId, principals, options) => {
|
|
53
|
+
const spinner = ora('Creating mapping...').start();
|
|
54
|
+
try {
|
|
55
|
+
const query = buildTenantQuery(options.tenant);
|
|
56
|
+
const mappingResult = await client.post(`/v1/ssh/principal-mappings${query}`, {
|
|
57
|
+
groupId,
|
|
58
|
+
principals,
|
|
59
|
+
});
|
|
60
|
+
spinner.succeed('Mapping created successfully');
|
|
61
|
+
if (options.json) {
|
|
62
|
+
output.json(mappingResult);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
output.keyValue({
|
|
66
|
+
'ID': mappingResult.id,
|
|
67
|
+
'Group ID': mappingResult.groupId,
|
|
68
|
+
'Principals': mappingResult.principals.join(', '),
|
|
69
|
+
'Created': output.formatDate(mappingResult.createdAt),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
spinner.fail('Failed to create mapping');
|
|
74
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
// Update Mapping
|
|
79
|
+
mapping
|
|
80
|
+
.command('update <mappingId> <principals...>')
|
|
81
|
+
.description('Update principal mapping')
|
|
82
|
+
.option('--tenant <id>', 'Tenant ID (superadmin only)')
|
|
83
|
+
.action(async (mappingId, principals, options) => {
|
|
84
|
+
const spinner = ora('Updating mapping...').start();
|
|
85
|
+
try {
|
|
86
|
+
const query = buildTenantQuery(options.tenant);
|
|
87
|
+
await client.put(`/v1/ssh/principal-mappings/${encodeURIComponent(mappingId)}${query}`, {
|
|
88
|
+
principals,
|
|
89
|
+
});
|
|
90
|
+
spinner.succeed('Mapping updated successfully');
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
spinner.fail('Failed to update mapping');
|
|
94
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
// Delete Mapping
|
|
99
|
+
mapping
|
|
100
|
+
.command('delete <mappingId>')
|
|
101
|
+
.description('Delete principal mapping')
|
|
102
|
+
.option('--tenant <id>', 'Tenant ID (superadmin only)')
|
|
103
|
+
.option('-y, --yes', 'Skip confirmation')
|
|
104
|
+
.action(async (mappingId, options) => {
|
|
105
|
+
try {
|
|
106
|
+
const query = buildTenantQuery(options.tenant);
|
|
107
|
+
if (!options.yes) {
|
|
108
|
+
const confirmed = await promptConfirm('Delete this mapping?');
|
|
109
|
+
if (!confirmed) {
|
|
110
|
+
output.info('Delete cancelled');
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const spinner = ora('Deleting mapping...').start();
|
|
115
|
+
try {
|
|
116
|
+
await client.delete(`/v1/ssh/principal-mappings/${encodeURIComponent(mappingId)}${query}`);
|
|
117
|
+
spinner.succeed('Mapping deleted successfully');
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
spinner.fail('Failed to delete mapping');
|
|
121
|
+
throw err;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=mapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../../src/commands/ssh/mapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scp.d.ts","sourceRoot":"","sources":["../../../src/commands/ssh/scp.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmEzC,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA+LxD"}
|