@mtndev/cli 2.0.0 → 2.0.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.
Files changed (264) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/cjs/__chunks/VH7oDXx4.cjs +28 -0
  3. package/cjs/commands/aws/ec2/allow-ip/handler.cjs +261 -12
  4. package/cjs/commands/aws/ec2/allow-ip/index.cjs +25 -55
  5. package/cjs/commands/aws/ec2/allow-ip/schema.cjs +33 -13
  6. package/cjs/commands/aws/ec2/allow-ip/utils.cjs +379 -39
  7. package/cjs/commands/aws/iam/admin-group.cjs +111 -15
  8. package/cjs/commands/aws/iam/break-glass/handler.cjs +127 -12
  9. package/cjs/commands/aws/iam/break-glass/index.cjs +7 -19
  10. package/cjs/commands/aws/iam/break-glass/schema.cjs +21 -12
  11. package/cjs/commands/aws/iam/check-admin/handler.cjs +89 -10
  12. package/cjs/commands/aws/iam/check-admin/index.cjs +7 -17
  13. package/cjs/commands/aws/iam/check-admin/schema.cjs +19 -12
  14. package/cjs/commands/aws/iam/policies/s3-restrictions-deny-non-s3-services.json +20 -0
  15. package/cjs/commands/aws/iam/policies/sts-federation.json +11 -0
  16. package/cjs/commands/aws/iam/policies/user-admins-deny-list.json +175 -0
  17. package/cjs/commands/aws/iam/policies/user-admins-deny-regions-list.json +41 -0
  18. package/cjs/commands/aws/iam/policies/user-admins-self-service-iam.json +56 -0
  19. package/cjs/commands/aws/iam/policies/user-admins-write-list.json +117 -0
  20. package/cjs/commands/aws/iam/remove-admin/handler.cjs +120 -11
  21. package/cjs/commands/aws/iam/remove-admin/index.cjs +7 -18
  22. package/cjs/commands/aws/iam/remove-admin/schema.cjs +22 -12
  23. package/cjs/commands/aws/iam/setup-acl/handler.cjs +227 -14
  24. package/cjs/commands/aws/iam/setup-acl/index.cjs +13 -33
  25. package/cjs/commands/aws/iam/setup-acl/schema.cjs +19 -7
  26. package/cjs/commands/aws/iam/setup-acl/utils.cjs +305 -20
  27. package/cjs/commands/aws/iam/users/handler.cjs +59 -12
  28. package/cjs/commands/aws/iam/users/index.cjs +18 -41
  29. package/cjs/commands/aws/iam/users/schema.cjs +17 -7
  30. package/cjs/commands/aws/iam/users/utils.cjs +454 -30
  31. package/cjs/commands/aws/index.cjs +223 -229
  32. package/cjs/commands/aws/route53/add-record/handler.cjs +264 -18
  33. package/cjs/commands/aws/route53/add-record/index.cjs +26 -57
  34. package/cjs/commands/aws/route53/add-record/schema.cjs +43 -11
  35. package/cjs/commands/aws/route53/add-record/utils.cjs +404 -37
  36. package/cjs/commands/aws/route53/remove-record/handler.cjs +114 -14
  37. package/cjs/commands/aws/route53/remove-record/index.cjs +5 -18
  38. package/cjs/commands/aws/route53/remove-record/schema.cjs +22 -8
  39. package/cjs/commands/aws/schema.cjs +19 -10
  40. package/cjs/commands/aws/ses/send-email/handler.cjs +73 -12
  41. package/cjs/commands/aws/ses/send-email/index.cjs +9 -23
  42. package/cjs/commands/aws/ses/send-email/schema.cjs +24 -7
  43. package/cjs/commands/aws/ses/send-email/utils.cjs +87 -11
  44. package/cjs/commands/aws/ses/smtp-password.cjs +72 -10
  45. package/cjs/commands/aws/utils/exec-aws.cjs +145 -16
  46. package/cjs/commands/aws/utils/resolve-policy-path.cjs +15 -6
  47. package/cjs/commands/aws/utils/resolve-profile.cjs +93 -11
  48. package/cjs/commands/aws/utils/tty.cjs +54 -10
  49. package/cjs/commands/db/create-readonly-user/handler.cjs +254 -11
  50. package/cjs/commands/db/create-readonly-user/index.cjs +18 -40
  51. package/cjs/commands/db/create-readonly-user/mysql.cjs +102 -9
  52. package/cjs/commands/db/create-readonly-user/postgres.cjs +209 -9
  53. package/cjs/commands/db/create-readonly-user/schema.cjs +39 -12
  54. package/cjs/commands/db/create-readonly-user/utils.cjs +160 -22
  55. package/cjs/commands/db/index.cjs +46 -44
  56. package/cjs/commands/doppler/handler.cjs +95 -11
  57. package/cjs/commands/doppler/index.cjs +33 -68
  58. package/cjs/commands/doppler/schema.cjs +130 -14
  59. package/cjs/commands/doppler/set-secret.cjs +378 -19
  60. package/cjs/commands/doppler/utils/exec.cjs +106 -12
  61. package/cjs/commands/doppler/utils.cjs +412 -34
  62. package/cjs/commands/icons/handler.cjs +82 -8
  63. package/cjs/commands/icons/index.cjs +15 -31
  64. package/cjs/commands/icons/schema.cjs +101 -13
  65. package/cjs/commands/icons/utils.cjs +131 -13
  66. package/cjs/commands/index.cjs +54 -161
  67. package/cjs/commands/schema.cjs +25 -8
  68. package/cjs/index.cjs +3 -4
  69. package/esm/commands/aws/ec2/allow-ip/handler.js +258 -12
  70. package/esm/commands/aws/ec2/allow-ip/index.js +4 -55
  71. package/esm/commands/aws/ec2/allow-ip/schema.js +29 -13
  72. package/esm/commands/aws/ec2/allow-ip/utils.js +363 -39
  73. package/esm/commands/aws/iam/admin-group.js +104 -15
  74. package/esm/commands/aws/iam/break-glass/handler.js +124 -12
  75. package/esm/commands/aws/iam/break-glass/index.js +4 -19
  76. package/esm/commands/aws/iam/break-glass/schema.js +19 -12
  77. package/esm/commands/aws/iam/check-admin/handler.js +86 -10
  78. package/esm/commands/aws/iam/check-admin/index.js +4 -17
  79. package/esm/commands/aws/iam/check-admin/schema.js +17 -12
  80. package/esm/commands/aws/iam/policies/s3-restrictions-deny-non-s3-services.json +20 -0
  81. package/esm/commands/aws/iam/policies/sts-federation.json +11 -0
  82. package/esm/commands/aws/iam/policies/user-admins-deny-list.json +175 -0
  83. package/esm/commands/aws/iam/policies/user-admins-deny-regions-list.json +41 -0
  84. package/esm/commands/aws/iam/policies/user-admins-self-service-iam.json +56 -0
  85. package/esm/commands/aws/iam/policies/user-admins-write-list.json +117 -0
  86. package/esm/commands/aws/iam/remove-admin/handler.js +117 -11
  87. package/esm/commands/aws/iam/remove-admin/index.js +4 -18
  88. package/esm/commands/aws/iam/remove-admin/schema.js +20 -12
  89. package/esm/commands/aws/iam/setup-acl/handler.js +224 -14
  90. package/esm/commands/aws/iam/setup-acl/index.js +4 -33
  91. package/esm/commands/aws/iam/setup-acl/schema.js +18 -7
  92. package/esm/commands/aws/iam/setup-acl/utils.js +298 -20
  93. package/esm/commands/aws/iam/users/handler.js +56 -12
  94. package/esm/commands/aws/iam/users/index.js +4 -41
  95. package/esm/commands/aws/iam/users/schema.js +16 -7
  96. package/esm/commands/aws/iam/users/utils.js +440 -30
  97. package/esm/commands/aws/index.js +142 -229
  98. package/esm/commands/aws/route53/add-record/handler.js +258 -18
  99. package/esm/commands/aws/route53/add-record/index.js +4 -57
  100. package/esm/commands/aws/route53/add-record/schema.js +40 -11
  101. package/esm/commands/aws/route53/add-record/utils.js +389 -37
  102. package/esm/commands/aws/route53/remove-record/handler.js +111 -14
  103. package/esm/commands/aws/route53/remove-record/index.js +3 -18
  104. package/esm/commands/aws/route53/remove-record/schema.js +21 -8
  105. package/esm/commands/aws/schema.js +16 -10
  106. package/esm/commands/aws/ses/send-email/handler.js +70 -12
  107. package/esm/commands/aws/ses/send-email/index.js +4 -23
  108. package/esm/commands/aws/ses/send-email/schema.js +23 -7
  109. package/esm/commands/aws/ses/send-email/utils.js +84 -11
  110. package/esm/commands/aws/ses/smtp-password.js +69 -10
  111. package/esm/commands/aws/utils/exec-aws.js +136 -15
  112. package/esm/commands/aws/utils/resolve-policy-path.js +14 -6
  113. package/esm/commands/aws/utils/resolve-profile.js +88 -11
  114. package/esm/commands/aws/utils/tty.js +51 -10
  115. package/esm/commands/db/create-readonly-user/handler.js +251 -11
  116. package/esm/commands/db/create-readonly-user/index.js +4 -40
  117. package/esm/commands/db/create-readonly-user/mysql.js +98 -9
  118. package/esm/commands/db/create-readonly-user/postgres.js +205 -9
  119. package/esm/commands/db/create-readonly-user/schema.js +35 -12
  120. package/esm/commands/db/create-readonly-user/utils.js +151 -22
  121. package/esm/commands/db/index.js +31 -44
  122. package/esm/commands/doppler/handler.js +92 -11
  123. package/esm/commands/doppler/index.js +6 -68
  124. package/esm/commands/doppler/schema.js +125 -15
  125. package/esm/commands/doppler/set-secret.js +370 -19
  126. package/esm/commands/doppler/utils/exec.js +100 -12
  127. package/esm/commands/doppler/utils.js +396 -34
  128. package/esm/commands/icons/handler.js +79 -8
  129. package/esm/commands/icons/index.js +4 -31
  130. package/esm/commands/icons/schema.js +97 -15
  131. package/esm/commands/icons/utils.js +125 -13
  132. package/esm/commands/index.js +47 -155
  133. package/esm/commands/schema.js +22 -7
  134. package/esm/index.js +3 -4
  135. package/package.json +5 -2
  136. package/vitest.config.ts +11 -0
  137. package/cjs/__chunks/2FSYDFUV.cjs +0 -146
  138. package/cjs/__chunks/3A5ZYU5M.cjs +0 -105
  139. package/cjs/__chunks/3BY5Y4W7.cjs +0 -1
  140. package/cjs/__chunks/3NOHGUCF.cjs +0 -9
  141. package/cjs/__chunks/3T2LXW7J.cjs +0 -387
  142. package/cjs/__chunks/4SFWHCB3.cjs +0 -133
  143. package/cjs/__chunks/4XT5JEAS.cjs +0 -1
  144. package/cjs/__chunks/AZEB4H4I.cjs +0 -208
  145. package/cjs/__chunks/B2KFW7T7.cjs +0 -1
  146. package/cjs/__chunks/B5ENMOCD.cjs +0 -288
  147. package/cjs/__chunks/B6XM5KSF.cjs +0 -338
  148. package/cjs/__chunks/BDU2UCE5.cjs +0 -1
  149. package/cjs/__chunks/BLMSMR5E.cjs +0 -46
  150. package/cjs/__chunks/CMUD7LLN.cjs +0 -47
  151. package/cjs/__chunks/DTQ2LB3I.cjs +0 -49
  152. package/cjs/__chunks/FM5MVRQF.cjs +0 -23
  153. package/cjs/__chunks/FRHST54J.cjs +0 -135
  154. package/cjs/__chunks/FU4VP2LN.cjs +0 -1
  155. package/cjs/__chunks/G5K4PVIL.cjs +0 -26
  156. package/cjs/__chunks/GU3R54MK.cjs +0 -127
  157. package/cjs/__chunks/GUL36IFZ.cjs +0 -61
  158. package/cjs/__chunks/GZMTNK5N.cjs +0 -1
  159. package/cjs/__chunks/H74JSDBU.cjs +0 -30
  160. package/cjs/__chunks/INFOPAHN.cjs +0 -117
  161. package/cjs/__chunks/J36P6UNE.cjs +0 -75
  162. package/cjs/__chunks/JB7T7PKQ.cjs +0 -538
  163. package/cjs/__chunks/JSL2JDMW.cjs +0 -1
  164. package/cjs/__chunks/K4QNHRTP.cjs +0 -163
  165. package/cjs/__chunks/KU76LC42.cjs +0 -192
  166. package/cjs/__chunks/LFDSHANP.cjs +0 -34
  167. package/cjs/__chunks/LHE24ECK.cjs +0 -192
  168. package/cjs/__chunks/LIKQ3SI4.cjs +0 -1
  169. package/cjs/__chunks/LXDF5QVZ.cjs +0 -313
  170. package/cjs/__chunks/LXOOJR2R.cjs +0 -74
  171. package/cjs/__chunks/N5MXFOQZ.cjs +0 -167
  172. package/cjs/__chunks/N7D56LPP.cjs +0 -25
  173. package/cjs/__chunks/NFXQNOQH.cjs +0 -393
  174. package/cjs/__chunks/NIMXXHJQ.cjs +0 -92
  175. package/cjs/__chunks/NLKJIUEX.cjs +0 -126
  176. package/cjs/__chunks/NT2XXAI6.cjs +0 -89
  177. package/cjs/__chunks/NWZGFHKH.cjs +0 -121
  178. package/cjs/__chunks/R3GUC7O7.cjs +0 -110
  179. package/cjs/__chunks/RPVAXPJ4.cjs +0 -1
  180. package/cjs/__chunks/S3LVCWPN.cjs +0 -23
  181. package/cjs/__chunks/SBBNW2BF.cjs +0 -249
  182. package/cjs/__chunks/T2A7TN4F.cjs +0 -81
  183. package/cjs/__chunks/TKNNDDIB.cjs +0 -97
  184. package/cjs/__chunks/TNSRDJPR.cjs +0 -1
  185. package/cjs/__chunks/UWHPE2GI.cjs +0 -20
  186. package/cjs/__chunks/W6K7BV74.cjs +0 -1
  187. package/cjs/__chunks/WBOQ6AUN.cjs +0 -320
  188. package/cjs/__chunks/WHGN5PZI.cjs +0 -299
  189. package/cjs/__chunks/WOYF2L6T.cjs +0 -11
  190. package/cjs/__chunks/X26XY2N6.cjs +0 -18
  191. package/cjs/__chunks/XMKOKRXZ.cjs +0 -16
  192. package/cjs/__chunks/XTJPQ3EX.cjs +0 -1
  193. package/cjs/__chunks/YRHFKTW2.cjs +0 -63
  194. package/cjs/__chunks/ZMDIOZPT.cjs +0 -22
  195. package/cjs/commands/aws/iam/policies/s3-restrictions-deny-non-s3-services.cjs +0 -28
  196. package/cjs/commands/aws/iam/policies/sts-federation.cjs +0 -19
  197. package/cjs/commands/aws/iam/policies/user-admins-deny-list.cjs +0 -183
  198. package/cjs/commands/aws/iam/policies/user-admins-deny-regions-list.cjs +0 -49
  199. package/cjs/commands/aws/iam/policies/user-admins-self-service-iam.cjs +0 -64
  200. package/cjs/commands/aws/iam/policies/user-admins-write-list.cjs +0 -125
  201. package/esm/__chunks/2FTTEFEK.js +0 -97
  202. package/esm/__chunks/33UYMUQD.js +0 -338
  203. package/esm/__chunks/3BKWTHLJ.js +0 -25
  204. package/esm/__chunks/3HE4BEJX.js +0 -105
  205. package/esm/__chunks/3QLI5BDL.js +0 -387
  206. package/esm/__chunks/5GIUAFXL.js +0 -89
  207. package/esm/__chunks/5ZBVGSOK.js +0 -0
  208. package/esm/__chunks/6G4PXXKF.js +0 -75
  209. package/esm/__chunks/73BJG53F.js +0 -11
  210. package/esm/__chunks/7VF4Q43Q.js +0 -0
  211. package/esm/__chunks/AEDEAYF5.js +0 -0
  212. package/esm/__chunks/AZCP3SFJ.js +0 -0
  213. package/esm/__chunks/B2DVQ2UL.js +0 -61
  214. package/esm/__chunks/CVQVHLW5.js +0 -0
  215. package/esm/__chunks/D62SPZXC.js +0 -0
  216. package/esm/__chunks/DLEJ25GZ.js +0 -121
  217. package/esm/__chunks/DMYFNF54.js +0 -192
  218. package/esm/__chunks/DNFTUMGD.js +0 -23
  219. package/esm/__chunks/DVKD6YSR.js +0 -49
  220. package/esm/__chunks/EMSH4P76.js +0 -20
  221. package/esm/__chunks/FFKFVMIE.js +0 -167
  222. package/esm/__chunks/FL7AILGH.js +0 -133
  223. package/esm/__chunks/FNXUONAV.js +0 -110
  224. package/esm/__chunks/G4NJHFFU.js +0 -320
  225. package/esm/__chunks/HJSXC6HP.js +0 -117
  226. package/esm/__chunks/IEOGAQYI.js +0 -46
  227. package/esm/__chunks/IZFGBYGE.js +0 -34
  228. package/esm/__chunks/J34UVKLA.js +0 -26
  229. package/esm/__chunks/JZPBBBIG.js +0 -74
  230. package/esm/__chunks/KWUJP5MG.js +0 -135
  231. package/esm/__chunks/M35URMT4.js +0 -313
  232. package/esm/__chunks/NF3M2L6C.js +0 -81
  233. package/esm/__chunks/O3CCA76Q.js +0 -22
  234. package/esm/__chunks/PNPPDYKC.js +0 -299
  235. package/esm/__chunks/QFXN4EHM.js +0 -393
  236. package/esm/__chunks/QKDDLIWD.js +0 -146
  237. package/esm/__chunks/QSE66AKY.js +0 -208
  238. package/esm/__chunks/QUF7PS4R.js +0 -18
  239. package/esm/__chunks/S7IJPJ4R.js +0 -126
  240. package/esm/__chunks/SD3E3EPH.js +0 -163
  241. package/esm/__chunks/SJXQJ7RS.js +0 -92
  242. package/esm/__chunks/SNCKIAOR.js +0 -0
  243. package/esm/__chunks/T3TTUHTW.js +0 -30
  244. package/esm/__chunks/TIOVE6HR.js +0 -0
  245. package/esm/__chunks/TXKMEIDQ.js +0 -0
  246. package/esm/__chunks/U7HAE2RF.js +0 -288
  247. package/esm/__chunks/UXWY7BYE.js +0 -63
  248. package/esm/__chunks/VKAKISRG.js +0 -192
  249. package/esm/__chunks/WD2YR6I7.js +0 -0
  250. package/esm/__chunks/WOZFZKFY.js +0 -0
  251. package/esm/__chunks/XI7GZDE2.js +0 -0
  252. package/esm/__chunks/XOUWDB3T.js +0 -249
  253. package/esm/__chunks/XQN2TA4S.js +0 -23
  254. package/esm/__chunks/XXK32TIM.js +0 -16
  255. package/esm/__chunks/YGWTVPZE.js +0 -538
  256. package/esm/__chunks/YRG7PT33.js +0 -127
  257. package/esm/__chunks/ZHKVJO2U.js +0 -47
  258. package/esm/__chunks/ZO55YUSY.js +0 -9
  259. package/esm/commands/aws/iam/policies/s3-restrictions-deny-non-s3-services.js +0 -28
  260. package/esm/commands/aws/iam/policies/sts-federation.js +0 -19
  261. package/esm/commands/aws/iam/policies/user-admins-deny-list.js +0 -183
  262. package/esm/commands/aws/iam/policies/user-admins-deny-regions-list.js +0 -49
  263. package/esm/commands/aws/iam/policies/user-admins-self-service-iam.js +0 -64
  264. package/esm/commands/aws/iam/policies/user-admins-write-list.js +0 -125
@@ -1,81 +0,0 @@
1
- import {
2
- runAws,
3
- runAwsVault
4
- } from "./FNXUONAV.js";
5
-
6
- // src/commands/aws/iam/admin-group.js
7
- import { spawnSync } from "child_process";
8
- import chalk from "chalk";
9
- var ADMIN_GROUP_NAME = "acl-admin-do-not-use";
10
- var VAULT_DURATION = process.env.AWS_VAULT_DURATION ?? "15m";
11
- function listVaultProfiles() {
12
- const result = spawnSync("aws-vault", ["list", "--credentials"], {
13
- encoding: "utf-8"
14
- });
15
- if (result.status !== 0) {
16
- return [];
17
- }
18
- return (result.stdout ?? "").split("\n").map((line) => line.trim()).filter((line) => line.length > 0);
19
- }
20
- function resolveAdminScanProfiles({ profile, all = false }) {
21
- const targetProfile = profile ?? process.env.AWS_PROFILE;
22
- if (!all && targetProfile) {
23
- return [targetProfile];
24
- }
25
- const profiles = listVaultProfiles();
26
- if (profiles.length === 0) {
27
- throw new Error("No aws-vault profiles with credentials found.");
28
- }
29
- return profiles;
30
- }
31
- function groupUserNames(group) {
32
- return (group.Users ?? []).map((user) => user.UserName);
33
- }
34
- function resolveProfileScan(params) {
35
- const { profile, verbose = false } = params;
36
- const idArgs = ["sts", "get-caller-identity"];
37
- const groupArgs = ["iam", "get-group", "--group-name", ADMIN_GROUP_NAME];
38
- const directRun = (args, options = {}) => runAws({ profile, args, expectJson: options.expectJson ?? true, verbose });
39
- const vaultRun = (args, options = {}) => runAwsVault({
40
- profile,
41
- args,
42
- duration: VAULT_DURATION,
43
- expectJson: options.expectJson ?? true,
44
- verbose
45
- });
46
- try {
47
- const identity = directRun(idArgs);
48
- const group = directRun(groupArgs);
49
- return {
50
- accountId: identity.Account,
51
- arn: identity.Arn,
52
- users: groupUserNames(group),
53
- run: directRun
54
- };
55
- } catch (directError) {
56
- try {
57
- const identity = vaultRun(idArgs);
58
- const group = vaultRun(groupArgs);
59
- return {
60
- accountId: identity.Account,
61
- arn: identity.Arn,
62
- users: groupUserNames(group),
63
- run: vaultRun
64
- };
65
- } catch {
66
- if (verbose) {
67
- const reason = directError instanceof Error ? directError.message.split("\n")[0] ?? "" : String(directError);
68
- console.log(chalk.dim(`skip ${profile} \u2014 ${reason}`));
69
- }
70
- return null;
71
- }
72
- }
73
- }
74
-
75
- export {
76
- ADMIN_GROUP_NAME,
77
- listVaultProfiles,
78
- resolveAdminScanProfiles,
79
- groupUserNames,
80
- resolveProfileScan
81
- };
@@ -1,22 +0,0 @@
1
- // src/commands/schema.js
2
- import { z } from "zod";
3
- var globalOptionsSchema = z.object({
4
- verbose: z.boolean().default(false).optional().describe("Enable verbose logging for detailed output and error traces")
5
- });
6
- var globalCommandsMetadata = {
7
- name: "mtndev-cli",
8
- version: "1.0.0",
9
- description: "Omnibus CLI tool for mtndev projects",
10
- options: {
11
- verbose: {
12
- description: globalOptionsSchema.shape.verbose.description,
13
- default: false,
14
- alias: "v"
15
- }
16
- }
17
- };
18
-
19
- export {
20
- globalOptionsSchema,
21
- globalCommandsMetadata
22
- };
@@ -1,299 +0,0 @@
1
- import {
2
- authorizeRule,
3
- describeSecurityGroups,
4
- extractRoamingFirstName,
5
- getCurrentPublicIp,
6
- getSecurityGroupDetails,
7
- instanceLabel,
8
- listEnabledRegions,
9
- listInstances,
10
- listSshIngressRules,
11
- printSshRules,
12
- resolveRoamingRule,
13
- revokeRule,
14
- roamingRuleDescription,
15
- ruleAlreadyAllowsIp,
16
- securityGroupLabel
17
- } from "./U7HAE2RF.js";
18
- import {
19
- DEFAULT_REGION,
20
- allowIpOptionsSchema
21
- } from "./J34UVKLA.js";
22
- import {
23
- AwsCliError,
24
- getCallerIdentity,
25
- requireCommands
26
- } from "./FNXUONAV.js";
27
- import {
28
- resolveProfile
29
- } from "./5GIUAFXL.js";
30
- import {
31
- promptChoice
32
- } from "./ZHKVJO2U.js";
33
-
34
- // src/commands/aws/ec2/allow-ip/handler.js
35
- import chalk from "chalk";
36
- import { ZodError } from "zod";
37
- async function resolveRegion(params) {
38
- const { profile, region, verbose } = params;
39
- if (region) {
40
- return region;
41
- }
42
- const instances = listInstances({ profile, region: DEFAULT_REGION, verbose });
43
- if (instances.length > 0) {
44
- return DEFAULT_REGION;
45
- }
46
- const regions = listEnabledRegions({
47
- profile,
48
- region: DEFAULT_REGION,
49
- verbose
50
- });
51
- if (regions.length === 0) {
52
- throw new Error("No enabled AWS regions found for this profile");
53
- }
54
- console.log(`No EC2 instances found in ${DEFAULT_REGION}.`);
55
- const index = await promptChoice({
56
- message: "Choose a region:",
57
- options: regions
58
- });
59
- const chosen = regions[index];
60
- if (!chosen) {
61
- throw new Error("No region selected");
62
- }
63
- return chosen;
64
- }
65
- function handleRuleChangeError(error, ctx) {
66
- const { securityGroup, sshRules, newCidr, ruleDescription, action } = ctx;
67
- if (error.code === "InvalidPermission.Duplicate") {
68
- const matching = ruleAlreadyAllowsIp(sshRules, newCidr);
69
- const label = matching ? matching.description : ruleDescription;
70
- console.log(
71
- `Security group ${securityGroup.groupId} already allows SSH from ${newCidr} (${label}). Nothing to do.`
72
- );
73
- return;
74
- }
75
- if (error.code === "UnauthorizedOperation") {
76
- console.error(
77
- `Could not ${action} the SSH rule: your AWS profile does not have ec2:AuthorizeSecurityGroupIngress or ec2:RevokeSecurityGroupIngress on ${securityGroup.groupName} (${securityGroup.groupId}).`
78
- );
79
- console.error("");
80
- console.error("Current single-host SSH rules on port 22:");
81
- printSshRules(sshRules, (message) => console.error(message));
82
- if (action === "create" && sshRules.length > 0) {
83
- console.error("");
84
- console.error(
85
- "A rule may already exist. Re-run to update your named roaming rule, or ask an admin to grant security group ingress permissions."
86
- );
87
- }
88
- process.exit(1);
89
- }
90
- throw error;
91
- }
92
- async function allowIpCommand(options) {
93
- try {
94
- const {
95
- profile: profileOption,
96
- region: regionOption,
97
- ruleName,
98
- verbose
99
- } = allowIpOptionsSchema.parse(options);
100
- const profile = await resolveProfile({ profile: profileOption });
101
- if (!profile) {
102
- console.error(chalk.red("Error: pass --profile or set AWS_PROFILE."));
103
- process.exit(1);
104
- }
105
- requireCommands(["aws"]);
106
- const identity = getCallerIdentity({
107
- profile,
108
- region: DEFAULT_REGION,
109
- verbose
110
- });
111
- const firstName = extractRoamingFirstName({ profile, identity });
112
- const ruleDescription = ruleName ?? roamingRuleDescription(firstName);
113
- console.log("Caller:");
114
- console.log(` Account: ${identity.Account}`);
115
- console.log(` Arn: ${identity.Arn}`);
116
- console.log(` Roaming rule: ${ruleDescription}`);
117
- console.log("");
118
- const region = await resolveRegion({
119
- profile,
120
- region: regionOption,
121
- verbose
122
- });
123
- console.log(`Region: ${region}`);
124
- console.log("");
125
- const instances = listInstances({ profile, region, verbose });
126
- if (instances.length === 0) {
127
- console.log(`No EC2 instances found in ${region}.`);
128
- process.exit(1);
129
- }
130
- const instanceIndex = await promptChoice({
131
- message: "Choose an EC2 instance:",
132
- options: instances.map((instance2) => instanceLabel(instance2))
133
- });
134
- const instance = instances[instanceIndex];
135
- if (!instance) {
136
- throw new Error("No instance selected");
137
- }
138
- console.log("");
139
- const securityGroups = describeSecurityGroups({
140
- profile,
141
- region,
142
- groupIds: instance.securityGroupIds,
143
- verbose
144
- });
145
- if (securityGroups.length === 0) {
146
- console.log("No security groups found on the selected instance.");
147
- process.exit(1);
148
- }
149
- let securityGroup;
150
- if (securityGroups.length === 1) {
151
- const onlyGroup = securityGroups[0];
152
- if (!onlyGroup) {
153
- throw new Error("No security group found on the selected instance");
154
- }
155
- securityGroup = onlyGroup;
156
- console.log(`Security group: ${securityGroupLabel(securityGroup)}`);
157
- } else {
158
- const groupIndex = await promptChoice({
159
- message: "Choose a security group:",
160
- options: securityGroups.map((group) => securityGroupLabel(group))
161
- });
162
- securityGroup = securityGroups[groupIndex];
163
- }
164
- if (!securityGroup) {
165
- throw new Error("No security group selected");
166
- }
167
- console.log("");
168
- const currentIp = await getCurrentPublicIp();
169
- const newCidr = `${currentIp}/32`;
170
- console.log(`Current public IP: ${currentIp}`);
171
- console.log("");
172
- const sgDetails = getSecurityGroupDetails({
173
- profile,
174
- region,
175
- groupId: securityGroup.groupId,
176
- verbose
177
- });
178
- if (!sgDetails) {
179
- console.log("Could not load security group details.");
180
- process.exit(1);
181
- }
182
- const sshRules = listSshIngressRules(sgDetails);
183
- const roamingRule = resolveRoamingRule(sshRules, ruleDescription);
184
- if (roamingRule && roamingRule.cidrIp === newCidr) {
185
- console.log(
186
- `Security group ${securityGroup.groupId} already allows SSH from ${newCidr} (${ruleDescription}). Nothing to do.`
187
- );
188
- return;
189
- }
190
- const otherRuleAtIp = ruleAlreadyAllowsIp(sshRules, newCidr);
191
- if (otherRuleAtIp && (!roamingRule || otherRuleAtIp.cidrIp !== roamingRule.cidrIp)) {
192
- const label = otherRuleAtIp.description || "(no description)";
193
- console.log(
194
- `Security group ${securityGroup.groupId} already allows SSH from ${newCidr} (${label}). Nothing to do.`
195
- );
196
- return;
197
- }
198
- if (roamingRule) {
199
- console.log(
200
- `Updating SSH rule (${ruleDescription}): ${roamingRule.cidrIp} -> ${newCidr}`
201
- );
202
- try {
203
- revokeRule({
204
- profile,
205
- region,
206
- groupId: securityGroup.groupId,
207
- rule: roamingRule,
208
- verbose
209
- });
210
- authorizeRule({
211
- profile,
212
- region,
213
- groupId: securityGroup.groupId,
214
- cidrIp: newCidr,
215
- description: ruleDescription,
216
- fromPort: roamingRule.fromPort,
217
- toPort: roamingRule.toPort,
218
- ipProtocol: roamingRule.ipProtocol,
219
- verbose
220
- });
221
- } catch (error) {
222
- if (error instanceof AwsCliError) {
223
- handleRuleChangeError(error, {
224
- securityGroup,
225
- sshRules,
226
- newCidr,
227
- ruleDescription,
228
- action: "update"
229
- });
230
- return;
231
- }
232
- throw error;
233
- }
234
- } else {
235
- if (sshRules.length > 0) {
236
- console.log("Existing single-host SSH rules (unchanged):");
237
- printSshRules(sshRules);
238
- console.log("");
239
- }
240
- console.log(`Creating new "${ruleDescription}" SSH rule for ${newCidr}`);
241
- try {
242
- authorizeRule({
243
- profile,
244
- region,
245
- groupId: securityGroup.groupId,
246
- cidrIp: newCidr,
247
- description: ruleDescription,
248
- verbose
249
- });
250
- } catch (error) {
251
- if (error instanceof AwsCliError) {
252
- handleRuleChangeError(error, {
253
- securityGroup,
254
- sshRules,
255
- newCidr,
256
- ruleDescription,
257
- action: "create"
258
- });
259
- return;
260
- }
261
- throw error;
262
- }
263
- }
264
- console.log("");
265
- console.log(
266
- `Done. ${securityGroup.groupName} (${securityGroup.groupId}) now allows SSH from ${newCidr} (${ruleDescription}).`
267
- );
268
- } catch (error) {
269
- if (error instanceof ZodError) {
270
- console.error(chalk.red("\n\u274C Invalid command options:"));
271
- error.errors.forEach((err) => {
272
- console.error(chalk.red(` ${err.path.join(".")}: ${err.message}`));
273
- });
274
- process.exit(1);
275
- }
276
- const verbose = (
277
- /** @type {any} */
278
- options?.verbose || false
279
- );
280
- console.error(chalk.red("\n\u274C allow-ip failed:"));
281
- if (error instanceof Error) {
282
- console.error(chalk.red(` ${error.message}`));
283
- if (verbose && error.stack) {
284
- console.error(chalk.gray("\nStack trace:"));
285
- console.error(chalk.gray(error.stack));
286
- }
287
- } else {
288
- console.error(chalk.red(` ${String(error)}`));
289
- }
290
- console.error(
291
- chalk.yellow("\n\u{1F4A1} Use --verbose for detailed error information\n")
292
- );
293
- process.exit(1);
294
- }
295
- }
296
-
297
- export {
298
- allowIpCommand
299
- };