@zincapp/znvault-cli 2.29.0 → 2.29.2

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.
Files changed (269) hide show
  1. package/dist/commands/agent/direct/update-all.d.ts.map +1 -1
  2. package/dist/commands/agent/direct/update-all.js +13 -8
  3. package/dist/commands/agent/direct/update-all.js.map +1 -1
  4. package/dist/commands/agent/helpers.d.ts +3 -6
  5. package/dist/commands/agent/helpers.d.ts.map +1 -1
  6. package/dist/commands/agent/helpers.js +13 -21
  7. package/dist/commands/agent/helpers.js.map +1 -1
  8. package/dist/commands/apikey/helpers.d.ts +1 -2
  9. package/dist/commands/apikey/helpers.d.ts.map +1 -1
  10. package/dist/commands/apikey/helpers.js +2 -12
  11. package/dist/commands/apikey/helpers.js.map +1 -1
  12. package/dist/commands/backup/helpers.d.ts +1 -3
  13. package/dist/commands/backup/helpers.d.ts.map +1 -1
  14. package/dist/commands/backup/helpers.js +2 -23
  15. package/dist/commands/backup/helpers.js.map +1 -1
  16. package/dist/commands/device.d.ts.map +1 -1
  17. package/dist/commands/device.js +10 -6
  18. package/dist/commands/device.js.map +1 -1
  19. package/dist/commands/dynamic-secrets/helpers.d.ts +3 -2
  20. package/dist/commands/dynamic-secrets/helpers.d.ts.map +1 -1
  21. package/dist/commands/dynamic-secrets/helpers.js +6 -15
  22. package/dist/commands/dynamic-secrets/helpers.js.map +1 -1
  23. package/dist/commands/kms/crud.d.ts +6 -0
  24. package/dist/commands/kms/crud.d.ts.map +1 -0
  25. package/dist/commands/kms/crud.js +226 -0
  26. package/dist/commands/kms/crud.js.map +1 -0
  27. package/dist/commands/kms/crypto.d.ts +6 -0
  28. package/dist/commands/kms/crypto.d.ts.map +1 -0
  29. package/dist/commands/kms/crypto.js +190 -0
  30. package/dist/commands/kms/crypto.js.map +1 -0
  31. package/dist/commands/kms/helpers.d.ts +10 -0
  32. package/dist/commands/kms/helpers.d.ts.map +1 -0
  33. package/dist/commands/kms/helpers.js +44 -0
  34. package/dist/commands/kms/helpers.js.map +1 -0
  35. package/dist/commands/kms/index.d.ts +13 -0
  36. package/dist/commands/kms/index.d.ts.map +1 -0
  37. package/dist/commands/kms/index.js +18 -0
  38. package/dist/commands/kms/index.js.map +1 -0
  39. package/dist/commands/kms/lifecycle.d.ts +6 -0
  40. package/dist/commands/kms/lifecycle.d.ts.map +1 -0
  41. package/dist/commands/kms/lifecycle.js +124 -0
  42. package/dist/commands/kms/lifecycle.js.map +1 -0
  43. package/dist/commands/kms/types.d.ts +102 -0
  44. package/dist/commands/kms/types.d.ts.map +1 -0
  45. package/dist/commands/kms/types.js +3 -0
  46. package/dist/commands/kms/types.js.map +1 -0
  47. package/dist/commands/plugin/enable-disable.d.ts +6 -0
  48. package/dist/commands/plugin/enable-disable.d.ts.map +1 -0
  49. package/dist/commands/plugin/enable-disable.js +64 -0
  50. package/dist/commands/plugin/enable-disable.js.map +1 -0
  51. package/dist/commands/plugin/helpers.d.ts +63 -0
  52. package/dist/commands/plugin/helpers.d.ts.map +1 -0
  53. package/dist/commands/plugin/helpers.js +204 -0
  54. package/dist/commands/plugin/helpers.js.map +1 -0
  55. package/dist/commands/plugin/index.d.ts +10 -0
  56. package/dist/commands/plugin/index.d.ts.map +1 -0
  57. package/dist/commands/plugin/index.js +24 -0
  58. package/dist/commands/plugin/index.js.map +1 -0
  59. package/dist/commands/plugin/info.d.ts +6 -0
  60. package/dist/commands/plugin/info.d.ts.map +1 -0
  61. package/dist/commands/plugin/info.js +108 -0
  62. package/dist/commands/plugin/info.js.map +1 -0
  63. package/dist/commands/plugin/install.d.ts +6 -0
  64. package/dist/commands/plugin/install.d.ts.map +1 -0
  65. package/dist/commands/plugin/install.js +96 -0
  66. package/dist/commands/plugin/install.js.map +1 -0
  67. package/dist/commands/plugin/list.d.ts +6 -0
  68. package/dist/commands/plugin/list.d.ts.map +1 -0
  69. package/dist/commands/plugin/list.js +60 -0
  70. package/dist/commands/plugin/list.js.map +1 -0
  71. package/dist/commands/plugin/types.d.ts +37 -0
  72. package/dist/commands/plugin/types.d.ts.map +1 -0
  73. package/dist/commands/plugin/types.js +7 -0
  74. package/dist/commands/plugin/types.js.map +1 -0
  75. package/dist/commands/plugin/uninstall.d.ts +6 -0
  76. package/dist/commands/plugin/uninstall.d.ts.map +1 -0
  77. package/dist/commands/plugin/uninstall.js +50 -0
  78. package/dist/commands/plugin/uninstall.js.map +1 -0
  79. package/dist/commands/plugin/update.d.ts +6 -0
  80. package/dist/commands/plugin/update.d.ts.map +1 -0
  81. package/dist/commands/plugin/update.js +84 -0
  82. package/dist/commands/plugin/update.js.map +1 -0
  83. package/dist/commands/policy/attachments.d.ts.map +1 -1
  84. package/dist/commands/policy/attachments.js +14 -20
  85. package/dist/commands/policy/attachments.js.map +1 -1
  86. package/dist/commands/policy/crud.d.ts.map +1 -1
  87. package/dist/commands/policy/crud.js +13 -23
  88. package/dist/commands/policy/crud.js.map +1 -1
  89. package/dist/commands/policy/io.d.ts.map +1 -1
  90. package/dist/commands/policy/io.js +4 -5
  91. package/dist/commands/policy/io.js.map +1 -1
  92. package/dist/commands/policy/list.d.ts.map +1 -1
  93. package/dist/commands/policy/list.js +7 -8
  94. package/dist/commands/policy/list.js.map +1 -1
  95. package/dist/commands/quarantine.d.ts.map +1 -1
  96. package/dist/commands/quarantine.js +1 -9
  97. package/dist/commands/quarantine.js.map +1 -1
  98. package/dist/commands/role.d.ts.map +1 -1
  99. package/dist/commands/role.js +4 -10
  100. package/dist/commands/role.js.map +1 -1
  101. package/dist/commands/secret/helpers.d.ts +1 -2
  102. package/dist/commands/secret/helpers.d.ts.map +1 -1
  103. package/dist/commands/secret/helpers.js +2 -14
  104. package/dist/commands/secret/helpers.js.map +1 -1
  105. package/dist/commands/secret/list.d.ts.map +1 -1
  106. package/dist/commands/secret/list.js +3 -4
  107. package/dist/commands/secret/list.js.map +1 -1
  108. package/dist/commands/ssh/bookmark.d.ts +11 -0
  109. package/dist/commands/ssh/bookmark.d.ts.map +1 -0
  110. package/dist/commands/ssh/bookmark.js +210 -0
  111. package/dist/commands/ssh/bookmark.js.map +1 -0
  112. package/dist/commands/ssh/ca.d.ts +6 -0
  113. package/dist/commands/ssh/ca.d.ts.map +1 -0
  114. package/dist/commands/ssh/ca.js +162 -0
  115. package/dist/commands/ssh/ca.js.map +1 -0
  116. package/dist/commands/ssh/cert.d.ts +6 -0
  117. package/dist/commands/ssh/cert.d.ts.map +1 -0
  118. package/dist/commands/ssh/cert.js +303 -0
  119. package/dist/commands/ssh/cert.js.map +1 -0
  120. package/dist/commands/ssh/config.d.ts +6 -0
  121. package/dist/commands/ssh/config.d.ts.map +1 -0
  122. package/dist/commands/ssh/config.js +95 -0
  123. package/dist/commands/ssh/config.js.map +1 -0
  124. package/dist/commands/ssh/connect.d.ts +6 -0
  125. package/dist/commands/ssh/connect.d.ts.map +1 -0
  126. package/dist/commands/ssh/connect.js +219 -0
  127. package/dist/commands/ssh/connect.js.map +1 -0
  128. package/dist/commands/ssh/exec.d.ts +6 -0
  129. package/dist/commands/ssh/exec.d.ts.map +1 -0
  130. package/dist/commands/ssh/exec.js +218 -0
  131. package/dist/commands/ssh/exec.js.map +1 -0
  132. package/dist/commands/ssh/helpers.d.ts +46 -0
  133. package/dist/commands/ssh/helpers.d.ts.map +1 -0
  134. package/dist/commands/ssh/helpers.js +175 -0
  135. package/dist/commands/ssh/helpers.js.map +1 -0
  136. package/dist/commands/ssh/hosts.d.ts +6 -0
  137. package/dist/commands/ssh/hosts.d.ts.map +1 -0
  138. package/dist/commands/ssh/hosts.js +101 -0
  139. package/dist/commands/ssh/hosts.js.map +1 -0
  140. package/dist/commands/ssh/index.d.ts +20 -0
  141. package/dist/commands/ssh/index.d.ts.map +1 -0
  142. package/dist/commands/ssh/index.js +34 -0
  143. package/dist/commands/ssh/index.js.map +1 -0
  144. package/dist/commands/ssh/mapping.d.ts +6 -0
  145. package/dist/commands/ssh/mapping.d.ts.map +1 -0
  146. package/dist/commands/ssh/mapping.js +130 -0
  147. package/dist/commands/ssh/mapping.js.map +1 -0
  148. package/dist/commands/ssh/scp.d.ts +6 -0
  149. package/dist/commands/ssh/scp.d.ts.map +1 -0
  150. package/dist/commands/ssh/scp.js +219 -0
  151. package/dist/commands/ssh/scp.js.map +1 -0
  152. package/dist/commands/ssh/server-group.d.ts +6 -0
  153. package/dist/commands/ssh/server-group.d.ts.map +1 -0
  154. package/dist/commands/ssh/server-group.js +249 -0
  155. package/dist/commands/ssh/server-group.js.map +1 -0
  156. package/dist/commands/ssh/types.d.ts +150 -0
  157. package/dist/commands/ssh/types.d.ts.map +1 -0
  158. package/dist/commands/ssh/types.js +3 -0
  159. package/dist/commands/ssh/types.js.map +1 -0
  160. package/dist/commands/ssh-ca/helpers.d.ts +1 -8
  161. package/dist/commands/ssh-ca/helpers.d.ts.map +1 -1
  162. package/dist/commands/ssh-ca/helpers.js +2 -23
  163. package/dist/commands/ssh-ca/helpers.js.map +1 -1
  164. package/dist/commands/ssh-ca/index.js +1 -1
  165. package/dist/commands/ssh-ca/index.js.map +1 -1
  166. package/dist/commands/ssh-ca/types.d.ts +1 -1
  167. package/dist/commands/sso/crud.d.ts +6 -0
  168. package/dist/commands/sso/crud.d.ts.map +1 -0
  169. package/dist/commands/sso/crud.js +360 -0
  170. package/dist/commands/sso/crud.js.map +1 -0
  171. package/dist/commands/sso/helpers.d.ts +9 -0
  172. package/dist/commands/sso/helpers.d.ts.map +1 -0
  173. package/dist/commands/sso/helpers.js +13 -0
  174. package/dist/commands/sso/helpers.js.map +1 -0
  175. package/dist/commands/sso/index.d.ts +13 -0
  176. package/dist/commands/sso/index.d.ts.map +1 -0
  177. package/dist/commands/sso/index.js +16 -0
  178. package/dist/commands/sso/index.js.map +1 -0
  179. package/dist/commands/sso/types.d.ts +119 -0
  180. package/dist/commands/sso/types.d.ts.map +1 -0
  181. package/dist/commands/sso/types.js +3 -0
  182. package/dist/commands/sso/types.js.map +1 -0
  183. package/dist/commands/sso/users.d.ts +6 -0
  184. package/dist/commands/sso/users.d.ts.map +1 -0
  185. package/dist/commands/sso/users.js +128 -0
  186. package/dist/commands/sso/users.js.map +1 -0
  187. package/dist/commands/unseal.d.ts.map +1 -1
  188. package/dist/commands/unseal.js +10 -20
  189. package/dist/commands/unseal.js.map +1 -1
  190. package/dist/index.js +4 -4
  191. package/dist/index.js.map +1 -1
  192. package/dist/lib/cli-update.d.ts.map +1 -1
  193. package/dist/lib/cli-update.js +18 -14
  194. package/dist/lib/cli-update.js.map +1 -1
  195. package/dist/lib/client/http.d.ts +3 -1
  196. package/dist/lib/client/http.d.ts.map +1 -1
  197. package/dist/lib/client/http.js +41 -8
  198. package/dist/lib/client/http.js.map +1 -1
  199. package/dist/lib/config/autounseal.d.ts +4 -0
  200. package/dist/lib/config/autounseal.d.ts.map +1 -1
  201. package/dist/lib/config/autounseal.js +102 -6
  202. package/dist/lib/config/autounseal.js.map +1 -1
  203. package/dist/lib/config/credentials.d.ts.map +1 -1
  204. package/dist/lib/config/credentials.js +3 -2
  205. package/dist/lib/config/credentials.js.map +1 -1
  206. package/dist/lib/config/index.d.ts +2 -1
  207. package/dist/lib/config/index.d.ts.map +1 -1
  208. package/dist/lib/config/index.js +3 -1
  209. package/dist/lib/config/index.js.map +1 -1
  210. package/dist/lib/config/keychain.d.ts +27 -0
  211. package/dist/lib/config/keychain.d.ts.map +1 -0
  212. package/dist/lib/config/keychain.js +194 -0
  213. package/dist/lib/config/keychain.js.map +1 -0
  214. package/dist/lib/config/types.d.ts +12 -0
  215. package/dist/lib/config/types.d.ts.map +1 -1
  216. package/dist/lib/config/types.js +3 -2
  217. package/dist/lib/config/types.js.map +1 -1
  218. package/dist/lib/constants.d.ts +24 -0
  219. package/dist/lib/constants.d.ts.map +1 -1
  220. package/dist/lib/constants.js +34 -1
  221. package/dist/lib/constants.js.map +1 -1
  222. package/dist/lib/db/health.d.ts.map +1 -1
  223. package/dist/lib/db/health.js +14 -7
  224. package/dist/lib/db/health.js.map +1 -1
  225. package/dist/lib/debug.d.ts +17 -0
  226. package/dist/lib/debug.d.ts.map +1 -0
  227. package/dist/lib/debug.js +50 -0
  228. package/dist/lib/debug.js.map +1 -0
  229. package/dist/lib/format-helpers.d.ts +43 -0
  230. package/dist/lib/format-helpers.d.ts.map +1 -1
  231. package/dist/lib/format-helpers.js +85 -0
  232. package/dist/lib/format-helpers.js.map +1 -1
  233. package/dist/lib/local.d.ts.map +1 -1
  234. package/dist/lib/local.js +12 -8
  235. package/dist/lib/local.js.map +1 -1
  236. package/dist/lib/mode.d.ts.map +1 -1
  237. package/dist/lib/mode.js +2 -1
  238. package/dist/lib/mode.js.map +1 -1
  239. package/dist/lib/output.d.ts +10 -0
  240. package/dist/lib/output.d.ts.map +1 -1
  241. package/dist/lib/output.js +21 -0
  242. package/dist/lib/output.js.map +1 -1
  243. package/dist/services/auto-update-daemon.d.ts.map +1 -1
  244. package/dist/services/auto-update-daemon.js +10 -6
  245. package/dist/services/auto-update-daemon.js.map +1 -1
  246. package/dist/services/update-checker.d.ts.map +1 -1
  247. package/dist/services/update-checker.js +2 -1
  248. package/dist/services/update-checker.js.map +1 -1
  249. package/dist/services/update-installer.d.ts +8 -0
  250. package/dist/services/update-installer.d.ts.map +1 -1
  251. package/dist/services/update-installer.js +47 -18
  252. package/dist/services/update-installer.js.map +1 -1
  253. package/package.json +4 -4
  254. package/dist/commands/kms.d.ts +0 -3
  255. package/dist/commands/kms.d.ts.map +0 -1
  256. package/dist/commands/kms.js +0 -555
  257. package/dist/commands/kms.js.map +0 -1
  258. package/dist/commands/plugin.d.ts +0 -8
  259. package/dist/commands/plugin.d.ts.map +0 -1
  260. package/dist/commands/plugin.js +0 -637
  261. package/dist/commands/plugin.js.map +0 -1
  262. package/dist/commands/ssh.d.ts +0 -3
  263. package/dist/commands/ssh.d.ts.map +0 -1
  264. package/dist/commands/ssh.js +0 -814
  265. package/dist/commands/ssh.js.map +0 -1
  266. package/dist/commands/sso.d.ts +0 -3
  267. package/dist/commands/sso.d.ts.map +0 -1
  268. package/dist/commands/sso.js +0 -486
  269. package/dist/commands/sso.js.map +0 -1
@@ -0,0 +1,219 @@
1
+ // Path: src/commands/ssh/scp.ts
2
+ import ora from 'ora';
3
+ import * as output from '../../lib/output.js';
4
+ import { getCurrentProfile } from '../../lib/config.js';
5
+ import { getDefaultKeyPath, getCertificatePath, isCertificateValid, signCertificate, } from './helpers.js';
6
+ import { resolveBookmark } from './bookmark.js';
7
+ /**
8
+ * Parse SCP path which can be:
9
+ * - local path: /path/to/file or ./file
10
+ * - remote path: host:/path or user@host:/path or bookmark:/path
11
+ */
12
+ function parseSCPPath(pathStr) {
13
+ // Check for remote path (contains :)
14
+ const colonIndex = pathStr.indexOf(':');
15
+ if (colonIndex === -1 || (colonIndex === 1 && /^[a-zA-Z]$/.test(pathStr[0]))) {
16
+ // No colon, or Windows drive letter (C:\...)
17
+ return { isRemote: false, path: pathStr };
18
+ }
19
+ const hostPart = pathStr.substring(0, colonIndex);
20
+ const remotePath = pathStr.substring(colonIndex + 1) || '.';
21
+ // Check for user@host
22
+ if (hostPart.includes('@')) {
23
+ const atIndex = hostPart.indexOf('@');
24
+ return {
25
+ isRemote: true,
26
+ user: hostPart.substring(0, atIndex),
27
+ host: hostPart.substring(atIndex + 1),
28
+ path: remotePath,
29
+ };
30
+ }
31
+ // Could be a bookmark or just a host
32
+ return {
33
+ isRemote: true,
34
+ host: hostPart,
35
+ path: remotePath,
36
+ bookmarkName: hostPart, // Will check if it's a bookmark later
37
+ };
38
+ }
39
+ export function registerSCPCommand(parent) {
40
+ parent
41
+ .command('scp <source> <destination>')
42
+ .description('Copy files using SCP with certificate authentication')
43
+ .option('-i, --identity <file>', 'Path to SSH private key')
44
+ .option('-P, --port <port>', 'SSH port', '22')
45
+ .option('--principals <principals>', 'Principals for signing (admin override)')
46
+ .option('--ttl <ttl>', 'Certificate TTL (e.g., 8h, 1d)')
47
+ .option('--tenant <id>', 'Tenant ID (superadmin only)')
48
+ .option('--force-sign', 'Force re-signing even if certificate is valid')
49
+ .option('-r, --recursive', 'Recursively copy directories')
50
+ .option('-p, --preserve', 'Preserve modification times and modes')
51
+ .option('-v, --verbose', 'Show verbose output')
52
+ .option('--dry-run', 'Show what would be done without executing')
53
+ .action(async (source, destination, options) => {
54
+ const fs = await import('fs');
55
+ const pathModule = await import('path');
56
+ const { spawn } = await import('child_process');
57
+ const profile = getCurrentProfile();
58
+ // Parse source and destination
59
+ const srcParsed = parseSCPPath(source);
60
+ const dstParsed = parseSCPPath(destination);
61
+ // Validate: one must be local, one must be remote
62
+ if (!srcParsed.isRemote && !dstParsed.isRemote) {
63
+ output.error('At least one path must be remote (host:path)');
64
+ process.exit(1);
65
+ }
66
+ if (srcParsed.isRemote && dstParsed.isRemote) {
67
+ output.error('Cannot copy between two remote hosts directly');
68
+ output.info('Copy to local first, then to the other host');
69
+ process.exit(1);
70
+ }
71
+ // Get the remote part
72
+ const remotePart = srcParsed.isRemote ? srcParsed : dstParsed;
73
+ let host = remotePart.host;
74
+ let user = remotePart.user;
75
+ let port = options.port ?? '22';
76
+ let identityOverride = options.identity;
77
+ let principalsOverride = options.principals;
78
+ // Check if host is a bookmark
79
+ if (remotePart.bookmarkName) {
80
+ const bookmark = resolveBookmark(remotePart.bookmarkName);
81
+ if (bookmark) {
82
+ host = bookmark.host;
83
+ user = bookmark.user ?? user;
84
+ if (bookmark.port)
85
+ port = bookmark.port.toString();
86
+ if (bookmark.identity)
87
+ identityOverride = bookmark.identity;
88
+ if (bookmark.principals && !options.principals) {
89
+ principalsOverride = bookmark.principals.join(',');
90
+ }
91
+ if (options.verbose) {
92
+ output.info(`Using bookmark '${remotePart.bookmarkName}' → ${bookmark.host}`);
93
+ }
94
+ }
95
+ }
96
+ // Fall back to profile defaults
97
+ if (!user && profile.sshUser) {
98
+ user = profile.sshUser;
99
+ }
100
+ const verbose = (msg) => {
101
+ if (options.verbose)
102
+ output.info(msg);
103
+ };
104
+ try {
105
+ // Step 1: Find SSH key
106
+ let keyPath;
107
+ if (identityOverride) {
108
+ keyPath = pathModule.resolve(identityOverride.replace(/^~/, process.env.HOME ?? ''));
109
+ if (!fs.existsSync(keyPath)) {
110
+ output.error(`SSH key not found: ${keyPath}`);
111
+ process.exit(1);
112
+ }
113
+ verbose(`Using specified key: ${keyPath}`);
114
+ }
115
+ else if (profile.sshIdentity && fs.existsSync(profile.sshIdentity)) {
116
+ keyPath = profile.sshIdentity;
117
+ verbose(`Using configured key: ${keyPath}`);
118
+ }
119
+ else {
120
+ const defaultKey = await getDefaultKeyPath();
121
+ if (!defaultKey) {
122
+ output.error('No SSH key found in ~/.ssh/');
123
+ process.exit(1);
124
+ }
125
+ keyPath = defaultKey;
126
+ verbose(`Using default key: ${keyPath}`);
127
+ }
128
+ const pubKeyPath = `${keyPath}.pub`;
129
+ if (!fs.existsSync(pubKeyPath)) {
130
+ output.error(`Public key not found: ${pubKeyPath}`);
131
+ process.exit(1);
132
+ }
133
+ // Step 2: Check certificate validity
134
+ const certPath = await getCertificatePath(keyPath);
135
+ const certStatus = await isCertificateValid(certPath);
136
+ const needsSign = options.forceSign || !certStatus.valid;
137
+ if (options.verbose && !certStatus.valid) {
138
+ output.warn(`Certificate needs signing: ${certStatus.reason}`);
139
+ }
140
+ // Step 3: Sign if needed
141
+ if (needsSign) {
142
+ const spinner = ora('Signing certificate...').start();
143
+ try {
144
+ await signCertificate(pubKeyPath, certPath, principalsOverride, options.ttl, options.tenant);
145
+ spinner.succeed('Certificate signed');
146
+ }
147
+ catch (err) {
148
+ spinner.fail('Failed to sign certificate');
149
+ output.error(err instanceof Error ? err.message : String(err));
150
+ process.exit(1);
151
+ }
152
+ }
153
+ else {
154
+ verbose('Using existing valid certificate');
155
+ }
156
+ // Step 4: Build SCP command
157
+ const scpArgs = [];
158
+ // Add identity
159
+ scpArgs.push('-i', keyPath);
160
+ // Add port (SCP uses -P not -p)
161
+ if (port !== '22') {
162
+ scpArgs.push('-P', port);
163
+ }
164
+ // Add certificate option
165
+ scpArgs.push('-o', `CertificateFile=${certPath}`);
166
+ // Add options
167
+ if (options.recursive)
168
+ scpArgs.push('-r');
169
+ if (options.preserve)
170
+ scpArgs.push('-p');
171
+ if (options.verbose)
172
+ scpArgs.push('-v');
173
+ // Build remote path string
174
+ const buildRemotePath = (parsed) => {
175
+ if (!parsed.isRemote)
176
+ return parsed.path;
177
+ const userPart = user ? `${user}@` : '';
178
+ return `${userPart}${host}:${parsed.path}`;
179
+ };
180
+ // Add source and destination
181
+ scpArgs.push(srcParsed.isRemote ? buildRemotePath(srcParsed) : srcParsed.path);
182
+ scpArgs.push(dstParsed.isRemote ? buildRemotePath(dstParsed) : dstParsed.path);
183
+ // Execute or dry-run
184
+ if (options.dryRun) {
185
+ output.section('Dry Run');
186
+ output.keyValue({
187
+ 'Source': srcParsed.isRemote ? buildRemotePath(srcParsed) : srcParsed.path,
188
+ 'Destination': dstParsed.isRemote ? buildRemotePath(dstParsed) : dstParsed.path,
189
+ 'Key': keyPath,
190
+ 'Certificate': certPath,
191
+ 'Port': port,
192
+ });
193
+ console.log();
194
+ output.info(`Would execute: scp ${scpArgs.join(' ')}`);
195
+ return;
196
+ }
197
+ verbose(`Executing: scp ${scpArgs.join(' ')}`);
198
+ const scpProcess = spawn('scp', scpArgs, {
199
+ stdio: 'inherit',
200
+ env: process.env,
201
+ });
202
+ scpProcess.on('close', (code) => {
203
+ if (code === 0) {
204
+ output.success('Transfer complete');
205
+ }
206
+ process.exit(code ?? 0);
207
+ });
208
+ scpProcess.on('error', (err) => {
209
+ output.error(`Failed to start SCP: ${err.message}`);
210
+ process.exit(1);
211
+ });
212
+ }
213
+ catch (err) {
214
+ output.error(err instanceof Error ? err.message : String(err));
215
+ process.exit(1);
216
+ }
217
+ });
218
+ }
219
+ //# sourceMappingURL=scp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scp.js","sourceRoot":"","sources":["../../../src/commands/ssh/scp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * SSH server group management commands
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function registerServerGroupCommands(parent: Command): void;
6
+ //# sourceMappingURL=server-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-group.d.ts","sourceRoot":"","sources":["../../../src/commands/ssh/server-group.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAmRjE"}
@@ -0,0 +1,249 @@
1
+ // Path: src/commands/ssh/server-group.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 registerServerGroupCommands(parent) {
8
+ const group = parent
9
+ .command('server-group')
10
+ .description('SSH server group management');
11
+ // List Server Groups
12
+ group
13
+ .command('list')
14
+ .description('List server groups')
15
+ .option('--tenant <id>', 'Tenant ID (superadmin only)')
16
+ .option('--json', 'Output as JSON')
17
+ .action(async (options) => {
18
+ const spinner = ora('Fetching server groups...').start();
19
+ try {
20
+ const query = buildTenantQuery(options.tenant);
21
+ const response = await client.get(`/v1/ssh/server-groups${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 server groups found');
29
+ output.info('Use "znvault ssh server-group create" to create a group');
30
+ return;
31
+ }
32
+ output.table(['ID', 'Name', 'Description', 'Created'], response.items.map(g => [
33
+ g.id.substring(0, 8) + '...',
34
+ g.name,
35
+ (g.description ?? '-').substring(0, 30),
36
+ output.formatDate(g.createdAt),
37
+ ]));
38
+ output.info(`Total: ${response.items.length} server group(s)`);
39
+ }
40
+ catch (err) {
41
+ spinner.fail('Failed to list server groups');
42
+ output.error(err instanceof Error ? err.message : String(err));
43
+ process.exit(1);
44
+ }
45
+ });
46
+ // Create Server Group
47
+ group
48
+ .command('create <name>')
49
+ .description('Create server group')
50
+ .option('--tenant <id>', 'Tenant ID (superadmin only)')
51
+ .option('-d, --description <text>', 'Group description')
52
+ .option('--json', 'Output as JSON')
53
+ .action(async (name, options) => {
54
+ const spinner = ora('Creating server group...').start();
55
+ try {
56
+ const query = buildTenantQuery(options.tenant);
57
+ const groupResult = await client.post(`/v1/ssh/server-groups${query}`, {
58
+ name,
59
+ description: options.description,
60
+ });
61
+ spinner.succeed('Server group created successfully');
62
+ if (options.json) {
63
+ output.json(groupResult);
64
+ return;
65
+ }
66
+ output.keyValue({
67
+ 'ID': groupResult.id,
68
+ 'Name': groupResult.name,
69
+ 'Description': groupResult.description ?? '-',
70
+ 'Created': output.formatDate(groupResult.createdAt),
71
+ });
72
+ }
73
+ catch (err) {
74
+ spinner.fail('Failed to create server group');
75
+ output.error(err instanceof Error ? err.message : String(err));
76
+ process.exit(1);
77
+ }
78
+ });
79
+ // Get Server Group
80
+ group
81
+ .command('get <id>')
82
+ .description('Get server group details')
83
+ .option('--tenant <id>', 'Tenant ID (superadmin only)')
84
+ .option('--json', 'Output as JSON')
85
+ .action(async (id, options) => {
86
+ const spinner = ora('Fetching server group...').start();
87
+ try {
88
+ const query = buildTenantQuery(options.tenant);
89
+ const groupResult = await client.get(`/v1/ssh/server-groups/${encodeURIComponent(id)}${query}`);
90
+ spinner.stop();
91
+ if (options.json) {
92
+ output.json(groupResult);
93
+ return;
94
+ }
95
+ output.section('Server Group');
96
+ output.keyValue({
97
+ 'ID': groupResult.id,
98
+ 'Name': groupResult.name,
99
+ 'Description': groupResult.description ?? '-',
100
+ 'Created': output.formatDate(groupResult.createdAt),
101
+ });
102
+ if (groupResult.accessRules && groupResult.accessRules.length > 0) {
103
+ output.section('Access Rules');
104
+ output.table(['Linux User', 'Allowed Principals'], groupResult.accessRules.map(r => [
105
+ r.linuxUser,
106
+ r.allowedPrincipals.join(', '),
107
+ ]));
108
+ }
109
+ else {
110
+ output.section('Access Rules');
111
+ output.info('No access rules defined');
112
+ output.info('Use "znvault ssh server-group set-access" to add rules');
113
+ }
114
+ }
115
+ catch (err) {
116
+ spinner.fail('Failed to get server group');
117
+ output.error(err instanceof Error ? err.message : String(err));
118
+ process.exit(1);
119
+ }
120
+ });
121
+ // Delete Server Group
122
+ group
123
+ .command('delete <id>')
124
+ .description('Delete server group')
125
+ .option('--tenant <id>', 'Tenant ID (superadmin only)')
126
+ .option('-y, --yes', 'Skip confirmation')
127
+ .action(async (id, options) => {
128
+ try {
129
+ const query = buildTenantQuery(options.tenant);
130
+ if (!options.yes) {
131
+ const confirmed = await promptConfirm('Delete this server group?');
132
+ if (!confirmed) {
133
+ output.info('Delete cancelled');
134
+ return;
135
+ }
136
+ }
137
+ const spinner = ora('Deleting server group...').start();
138
+ try {
139
+ await client.delete(`/v1/ssh/server-groups/${encodeURIComponent(id)}${query}`);
140
+ spinner.succeed('Server group deleted successfully');
141
+ }
142
+ catch (err) {
143
+ spinner.fail('Failed to delete server group');
144
+ throw err;
145
+ }
146
+ }
147
+ catch (err) {
148
+ output.error(err instanceof Error ? err.message : String(err));
149
+ process.exit(1);
150
+ }
151
+ });
152
+ // Set Access Rule
153
+ group
154
+ .command('set-access <groupId> <linuxUser> <principals...>')
155
+ .description('Set access rule for server group (which principals can access which Linux user)')
156
+ .option('--tenant <id>', 'Tenant ID (superadmin only)')
157
+ .option('--json', 'Output as JSON')
158
+ .action(async (groupId, linuxUser, principals, options) => {
159
+ const spinner = ora('Setting access rule...').start();
160
+ try {
161
+ const query = buildTenantQuery(options.tenant);
162
+ const access = await client.put(`/v1/ssh/server-groups/${encodeURIComponent(groupId)}/access${query}`, { linuxUser, allowedPrincipals: principals });
163
+ spinner.succeed('Access rule set successfully');
164
+ if (options.json) {
165
+ output.json(access);
166
+ return;
167
+ }
168
+ output.keyValue({
169
+ 'Linux User': access.linuxUser,
170
+ 'Allowed Principals': access.allowedPrincipals.join(', '),
171
+ });
172
+ }
173
+ catch (err) {
174
+ spinner.fail('Failed to set access rule');
175
+ output.error(err instanceof Error ? err.message : String(err));
176
+ process.exit(1);
177
+ }
178
+ });
179
+ // Delete Access Rule
180
+ group
181
+ .command('delete-access <groupId> <linuxUser>')
182
+ .description('Delete access rule from server group')
183
+ .option('--tenant <id>', 'Tenant ID (superadmin only)')
184
+ .option('-y, --yes', 'Skip confirmation')
185
+ .action(async (groupId, linuxUser, options) => {
186
+ try {
187
+ const query = buildTenantQuery(options.tenant);
188
+ if (!options.yes) {
189
+ const confirmed = await promptConfirm(`Delete access rule for Linux user "${linuxUser}"?`);
190
+ if (!confirmed) {
191
+ output.info('Delete cancelled');
192
+ return;
193
+ }
194
+ }
195
+ const spinner = ora('Deleting access rule...').start();
196
+ try {
197
+ await client.delete(`/v1/ssh/server-groups/${encodeURIComponent(groupId)}/access/${encodeURIComponent(linuxUser)}${query}`);
198
+ spinner.succeed('Access rule deleted successfully');
199
+ }
200
+ catch (err) {
201
+ spinner.fail('Failed to delete access rule');
202
+ throw err;
203
+ }
204
+ }
205
+ catch (err) {
206
+ output.error(err instanceof Error ? err.message : String(err));
207
+ process.exit(1);
208
+ }
209
+ });
210
+ // Get Authorized Principals
211
+ group
212
+ .command('authorized-principals <groupId>')
213
+ .description('Get AuthorizedPrincipalsFile content for a server group')
214
+ .option('--tenant <id>', 'Tenant ID (superadmin only)')
215
+ .option('--output <file>', 'Output to file')
216
+ .action(async (groupId, options) => {
217
+ const spinner = ora('Generating authorized principals...').start();
218
+ try {
219
+ const query = buildTenantQuery(options.tenant);
220
+ const response = await client.get(`/v1/ssh/server-groups/${encodeURIComponent(groupId)}/authorized-principals${query}`);
221
+ spinner.stop();
222
+ // Format as AuthorizedPrincipalsFile content
223
+ const lines = [];
224
+ for (const [linuxUser, principals] of Object.entries(response)) {
225
+ lines.push(`# Linux user: ${linuxUser}`);
226
+ for (const principal of principals) {
227
+ lines.push(principal);
228
+ }
229
+ lines.push('');
230
+ }
231
+ const content = lines.join('\n');
232
+ if (options.output) {
233
+ const fs = await import('fs');
234
+ const path = await import('path');
235
+ fs.writeFileSync(path.resolve(options.output), content);
236
+ output.success(`Written to ${options.output}`);
237
+ }
238
+ else {
239
+ console.log(content);
240
+ }
241
+ }
242
+ catch (err) {
243
+ spinner.fail('Failed to get authorized principals');
244
+ output.error(err instanceof Error ? err.message : String(err));
245
+ process.exit(1);
246
+ }
247
+ });
248
+ }
249
+ //# sourceMappingURL=server-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-group.js","sourceRoot":"","sources":["../../../src/commands/ssh/server-group.ts"],"names":[],"mappings":"AAAA,yCAAyC;AAOzC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,UAAU,2BAA2B,CAAC,MAAe;IACzD,MAAM,KAAK,GAAG,MAAM;SACjB,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,6BAA6B,CAAC,CAAC;IAE9C,qBAAqB;IACrB,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,oBAAoB,CAAC;SACjC,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,OAAoB,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,GAAG,CAAC,2BAA2B,CAAC,CAAC,KAAK,EAAE,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAA2B,wBAAwB,KAAK,EAAE,CAAC,CAAC;YAC7F,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC5B,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;YAED,MAAM,CAAC,KAAK,CACV,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,EACxC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtB,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK;gBAC5B,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;gBACvC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;aAC/B,CAAC,CACH,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,UAAU,QAAQ,CAAC,KAAK,CAAC,MAAM,kBAAkB,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC7C,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;IACH,CAAC,CAAC,CAAC;IAEL,sBAAsB;IACtB,KAAK;SACF,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;SACtD,MAAM,CAAC,0BAA0B,EAAE,mBAAmB,CAAC;SACvD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAiC,EAAE,EAAE;QAChE,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;QAExD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,IAAI,CAAc,wBAAwB,KAAK,EAAE,EAAE;gBAClF,IAAI;gBACJ,WAAW,EAAE,OAAO,CAAC,WAAW;aACjC,CAAC,CAAC;YACH,OAAO,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;YAErD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACzB,OAAO;YACT,CAAC;YAED,MAAM,CAAC,QAAQ,CAAC;gBACd,IAAI,EAAE,WAAW,CAAC,EAAE;gBACpB,MAAM,EAAE,WAAW,CAAC,IAAI;gBACxB,aAAa,EAAE,WAAW,CAAC,WAAW,IAAI,GAAG;gBAC7C,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC;aACpD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC9C,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;IACH,CAAC,CAAC,CAAC;IAEL,mBAAmB;IACnB,KAAK;SACF,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,OAAmB,EAAE,EAAE;QAChD,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;QAExD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,GAAG,CAAc,yBAAyB,kBAAkB,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;YAC7G,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACzB,OAAO;YACT,CAAC;YAED,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YAC/B,MAAM,CAAC,QAAQ,CAAC;gBACd,IAAI,EAAE,WAAW,CAAC,EAAE;gBACpB,MAAM,EAAE,WAAW,CAAC,IAAI;gBACxB,aAAa,EAAE,WAAW,CAAC,WAAW,IAAI,GAAG;gBAC7C,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC;aACpD,CAAC,CAAC;YAEH,IAAI,WAAW,CAAC,WAAW,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClE,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBAC/B,MAAM,CAAC,KAAK,CACV,CAAC,YAAY,EAAE,oBAAoB,CAAC,EACpC,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC/B,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;iBAC/B,CAAC,CACH,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC3C,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;IACH,CAAC,CAAC,CAAC;IAEL,sBAAsB;IACtB,KAAK;SACF,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;SACtD,MAAM,CAAC,WAAW,EAAE,mBAAmB,CAAC;SACxC,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,OAAsB,EAAE,EAAE;QACnD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAE/C,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,2BAA2B,CAAC,CAAC;gBACnE,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;oBAChC,OAAO;gBACT,CAAC;YACH,CAAC;YAED,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;YAExD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,MAAM,CAAC,yBAAyB,kBAAkB,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;gBAC/E,OAAO,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;YACvD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;gBAC9C,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,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;IACH,CAAC,CAAC,CAAC;IAEL,kBAAkB;IAClB,KAAK;SACF,OAAO,CAAC,kDAAkD,CAAC;SAC3D,WAAW,CAAC,iFAAiF,CAAC;SAC9F,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,SAAiB,EAAE,UAAoB,EAAE,OAAyB,EAAE,EAAE;QACpG,MAAM,OAAO,GAAG,GAAG,CAAC,wBAAwB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEtD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAC7B,yBAAyB,kBAAkB,CAAC,OAAO,CAAC,UAAU,KAAK,EAAE,EACrE,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAC7C,CAAC;YACF,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;YAEhD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YAED,MAAM,CAAC,QAAQ,CAAC;gBACd,YAAY,EAAE,MAAM,CAAC,SAAS;gBAC9B,oBAAoB,EAAE,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;aAC1D,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC1C,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;IACH,CAAC,CAAC,CAAC;IAEL,qBAAqB;IACrB,KAAK;SACF,OAAO,CAAC,qCAAqC,CAAC;SAC9C,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;SACtD,MAAM,CAAC,WAAW,EAAE,mBAAmB,CAAC;SACxC,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,SAAiB,EAAE,OAAsB,EAAE,EAAE;QAC3E,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAE/C,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,sCAAsC,SAAS,IAAI,CAAC,CAAC;gBAC3F,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;oBAChC,OAAO;gBACT,CAAC;YACH,CAAC;YAED,MAAM,OAAO,GAAG,GAAG,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;YAEvD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,MAAM,CACjB,yBAAyB,kBAAkB,CAAC,OAAO,CAAC,WAAW,kBAAkB,CAAC,SAAS,CAAC,GAAG,KAAK,EAAE,CACvG,CAAC;gBACF,OAAO,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;YACtD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;gBAC7C,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,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;IACH,CAAC,CAAC,CAAC;IAEL,4BAA4B;IAC5B,KAAK;SACF,OAAO,CAAC,iCAAiC,CAAC;SAC1C,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;SACtD,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,OAA6C,EAAE,EAAE;QAC/E,MAAM,OAAO,GAAG,GAAG,CAAC,qCAAqC,CAAC,CAAC,KAAK,EAAE,CAAC;QAEnE,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAC/B,yBAAyB,kBAAkB,CAAC,OAAO,CAAC,yBAAyB,KAAK,EAAE,CACrF,CAAC;YACF,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,6CAA6C;YAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/D,KAAK,CAAC,IAAI,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC;gBACzC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;oBACnC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxB,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;YAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEjC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;gBAClC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;gBACxD,MAAM,CAAC,OAAO,CAAC,cAAc,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACH,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;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * SSH CA command types and interfaces
3
+ */
4
+ export interface CAStatus {
5
+ initialized: boolean;
6
+ publicKey?: string;
7
+ fingerprint?: string;
8
+ keyType?: string;
9
+ defaultTtlSeconds?: number;
10
+ maxTtlSeconds?: number;
11
+ allowedExtensions?: string[];
12
+ totalCertificates?: number;
13
+ activeCertificates?: number;
14
+ createdAt?: string;
15
+ }
16
+ export interface CA {
17
+ id: string;
18
+ publicKey: string;
19
+ fingerprint: string;
20
+ keyType: string;
21
+ defaultTtlSeconds: number;
22
+ maxTtlSeconds: number;
23
+ allowedExtensions: string[];
24
+ createdAt: string;
25
+ }
26
+ export interface Certificate {
27
+ id: string;
28
+ serial: string;
29
+ userId: string;
30
+ username?: string;
31
+ fingerprint: string;
32
+ principals: string[];
33
+ extensions?: string[];
34
+ validAfter: string;
35
+ validBefore: string;
36
+ revoked: boolean;
37
+ revokedAt?: string;
38
+ revokedBy?: string;
39
+ revocationReason?: string;
40
+ requestIp?: string;
41
+ createdAt: string;
42
+ }
43
+ export interface PrincipalMapping {
44
+ id: string;
45
+ groupId: string;
46
+ groupName?: string;
47
+ groupDisplayName?: string;
48
+ principals: string[];
49
+ createdAt: string;
50
+ createdBy?: string;
51
+ }
52
+ export interface ServerGroup {
53
+ id: string;
54
+ name: string;
55
+ description?: string;
56
+ accessRules?: Array<{
57
+ linuxUser: string;
58
+ allowedPrincipals: string[];
59
+ }>;
60
+ createdAt: string;
61
+ createdBy?: string;
62
+ }
63
+ export interface SignResult {
64
+ certificate: string;
65
+ serial: string;
66
+ principals: string[];
67
+ validAfter: string;
68
+ validBefore: string;
69
+ fingerprint: string;
70
+ }
71
+ export interface ListOptions {
72
+ tenant?: string;
73
+ json?: boolean;
74
+ }
75
+ export interface CertListOptions extends ListOptions {
76
+ limit?: string;
77
+ offset?: string;
78
+ activeOnly?: boolean;
79
+ revoked?: boolean;
80
+ userId?: string;
81
+ }
82
+ export interface InitOptions {
83
+ tenant?: string;
84
+ keyType?: string;
85
+ defaultTtl?: string;
86
+ maxTtl?: string;
87
+ extension?: string[];
88
+ json?: boolean;
89
+ }
90
+ export interface SignOptions {
91
+ tenant?: string;
92
+ ttl?: string;
93
+ output?: string;
94
+ json?: boolean;
95
+ }
96
+ export interface CreateMappingOptions {
97
+ tenant?: string;
98
+ json?: boolean;
99
+ }
100
+ export interface CreateServerGroupOptions {
101
+ tenant?: string;
102
+ description?: string;
103
+ json?: boolean;
104
+ }
105
+ export interface SetAccessOptions {
106
+ tenant?: string;
107
+ json?: boolean;
108
+ }
109
+ export interface DeleteOptions {
110
+ tenant?: string;
111
+ yes?: boolean;
112
+ }
113
+ export interface GetOptions {
114
+ tenant?: string;
115
+ json?: boolean;
116
+ }
117
+ export interface ConnectOptions {
118
+ identity?: string;
119
+ port?: string;
120
+ principals?: string;
121
+ ttl?: string;
122
+ tenant?: string;
123
+ forceSign?: boolean;
124
+ dryRun?: boolean;
125
+ verbose?: boolean;
126
+ t?: boolean;
127
+ T?: boolean;
128
+ }
129
+ export interface SSHBookmark {
130
+ name: string;
131
+ host: string;
132
+ port?: number;
133
+ user?: string;
134
+ identity?: string;
135
+ principals?: string[];
136
+ description?: string;
137
+ createdAt: string;
138
+ }
139
+ export interface LocalCertInfo {
140
+ exists: boolean;
141
+ path: string;
142
+ valid?: boolean;
143
+ principals?: string[];
144
+ validAfter?: Date;
145
+ validBefore?: Date;
146
+ fingerprint?: string;
147
+ keyId?: string;
148
+ remainingTime?: string;
149
+ }
150
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/commands/ssh/types.ts"],"names":[],"mappings":"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"}