@fredlackey/devutils 0.0.17 → 0.0.19

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 (331) hide show
  1. package/README.md +32 -150
  2. package/package.json +5 -82
  3. package/bin/dev.js +0 -16
  4. package/files/README.md +0 -0
  5. package/files/claude/.claude/commands/setup-context.md +0 -3
  6. package/files/monorepos/_archive/README.md +0 -36
  7. package/files/monorepos/_legacy/README.md +0 -36
  8. package/files/monorepos/ai-docs/README.md +0 -33
  9. package/files/monorepos/apps/README.md +0 -24
  10. package/files/monorepos/docs/README.md +0 -40
  11. package/files/monorepos/packages/README.md +0 -25
  12. package/files/monorepos/research/README.md +0 -29
  13. package/files/monorepos/scripts/README.md +0 -24
  14. package/src/cli.js +0 -72
  15. package/src/commands/README.md +0 -41
  16. package/src/commands/configure.js +0 -199
  17. package/src/commands/identity.js +0 -1630
  18. package/src/commands/ignore.js +0 -247
  19. package/src/commands/install.js +0 -526
  20. package/src/commands/setup.js +0 -246
  21. package/src/commands/status.js +0 -223
  22. package/src/commands/update.js +0 -142
  23. package/src/commands/version.js +0 -100
  24. package/src/completion.js +0 -284
  25. package/src/constants.js +0 -45
  26. package/src/ignore/claude-code.txt +0 -10
  27. package/src/ignore/docker.txt +0 -18
  28. package/src/ignore/linux.txt +0 -23
  29. package/src/ignore/macos.txt +0 -36
  30. package/src/ignore/node.txt +0 -55
  31. package/src/ignore/terraform.txt +0 -37
  32. package/src/ignore/vscode.txt +0 -18
  33. package/src/ignore/windows.txt +0 -35
  34. package/src/index.js +0 -0
  35. package/src/installs/README.md +0 -399
  36. package/src/installs/adobe-creative-cloud.js +0 -546
  37. package/src/installs/adobe-creative-cloud.md +0 -605
  38. package/src/installs/appcleaner.js +0 -321
  39. package/src/installs/appcleaner.md +0 -699
  40. package/src/installs/apt-transport-https.js +0 -390
  41. package/src/installs/apt-transport-https.md +0 -678
  42. package/src/installs/atomicparsley.js +0 -642
  43. package/src/installs/atomicparsley.md +0 -795
  44. package/src/installs/aws-cli.js +0 -797
  45. package/src/installs/aws-cli.md +0 -727
  46. package/src/installs/balena-etcher.js +0 -710
  47. package/src/installs/balena-etcher.md +0 -761
  48. package/src/installs/bambu-studio.js +0 -1143
  49. package/src/installs/bambu-studio.md +0 -780
  50. package/src/installs/bash-completion.js +0 -575
  51. package/src/installs/bash-completion.md +0 -833
  52. package/src/installs/bash.js +0 -417
  53. package/src/installs/bash.md +0 -993
  54. package/src/installs/beyond-compare.js +0 -603
  55. package/src/installs/beyond-compare.md +0 -813
  56. package/src/installs/brave-browser.js +0 -968
  57. package/src/installs/brave-browser.md +0 -650
  58. package/src/installs/build-essential.js +0 -529
  59. package/src/installs/build-essential.md +0 -977
  60. package/src/installs/ca-certificates.js +0 -618
  61. package/src/installs/ca-certificates.md +0 -937
  62. package/src/installs/caffeine.js +0 -508
  63. package/src/installs/caffeine.md +0 -839
  64. package/src/installs/camtasia.js +0 -596
  65. package/src/installs/camtasia.md +0 -762
  66. package/src/installs/chatgpt.js +0 -476
  67. package/src/installs/chatgpt.md +0 -814
  68. package/src/installs/chocolatey.js +0 -456
  69. package/src/installs/chocolatey.md +0 -661
  70. package/src/installs/chrome-canary.js +0 -419
  71. package/src/installs/chrome-canary.md +0 -641
  72. package/src/installs/chromium.js +0 -667
  73. package/src/installs/chromium.md +0 -838
  74. package/src/installs/claude-code.js +0 -576
  75. package/src/installs/claude-code.md +0 -1173
  76. package/src/installs/cloudflare-warp.js +0 -900
  77. package/src/installs/cloudflare-warp.md +0 -1047
  78. package/src/installs/comet-browser.js +0 -588
  79. package/src/installs/comet-browser.md +0 -731
  80. package/src/installs/curl.js +0 -379
  81. package/src/installs/curl.md +0 -714
  82. package/src/installs/cursor.js +0 -579
  83. package/src/installs/cursor.md +0 -970
  84. package/src/installs/dbeaver.js +0 -924
  85. package/src/installs/dbeaver.md +0 -939
  86. package/src/installs/dbschema.js +0 -692
  87. package/src/installs/dbschema.md +0 -925
  88. package/src/installs/dependencies.md +0 -453
  89. package/src/installs/development-tools.js +0 -600
  90. package/src/installs/development-tools.md +0 -977
  91. package/src/installs/docker.js +0 -1029
  92. package/src/installs/docker.md +0 -1109
  93. package/src/installs/drawio.js +0 -1019
  94. package/src/installs/drawio.md +0 -795
  95. package/src/installs/elmedia-player.js +0 -347
  96. package/src/installs/elmedia-player.md +0 -556
  97. package/src/installs/ffmpeg.js +0 -889
  98. package/src/installs/ffmpeg.md +0 -852
  99. package/src/installs/file.js +0 -464
  100. package/src/installs/file.md +0 -987
  101. package/src/installs/gemini-cli.js +0 -811
  102. package/src/installs/gemini-cli.md +0 -1153
  103. package/src/installs/git.js +0 -400
  104. package/src/installs/git.md +0 -907
  105. package/src/installs/gitego.js +0 -949
  106. package/src/installs/gitego.md +0 -1172
  107. package/src/installs/go.js +0 -931
  108. package/src/installs/go.md +0 -958
  109. package/src/installs/google-antigravity.js +0 -913
  110. package/src/installs/google-antigravity.md +0 -1075
  111. package/src/installs/google-chrome.js +0 -833
  112. package/src/installs/google-chrome.md +0 -862
  113. package/src/installs/gpg.js +0 -480
  114. package/src/installs/gpg.md +0 -1056
  115. package/src/installs/homebrew.js +0 -1033
  116. package/src/installs/homebrew.md +0 -988
  117. package/src/installs/imageoptim.js +0 -968
  118. package/src/installs/imageoptim.md +0 -1119
  119. package/src/installs/installers.json +0 -4032
  120. package/src/installs/installers.json.tmp +0 -3953
  121. package/src/installs/jq.js +0 -400
  122. package/src/installs/jq.md +0 -809
  123. package/src/installs/keyboard-maestro.js +0 -719
  124. package/src/installs/keyboard-maestro.md +0 -825
  125. package/src/installs/kiro.js +0 -864
  126. package/src/installs/kiro.md +0 -1015
  127. package/src/installs/latex.js +0 -789
  128. package/src/installs/latex.md +0 -1095
  129. package/src/installs/lftp.js +0 -356
  130. package/src/installs/lftp.md +0 -907
  131. package/src/installs/lsb-release.js +0 -346
  132. package/src/installs/lsb-release.md +0 -814
  133. package/src/installs/messenger.js +0 -847
  134. package/src/installs/messenger.md +0 -900
  135. package/src/installs/microsoft-office.js +0 -568
  136. package/src/installs/microsoft-office.md +0 -760
  137. package/src/installs/microsoft-teams.js +0 -801
  138. package/src/installs/microsoft-teams.md +0 -886
  139. package/src/installs/moom.js +0 -326
  140. package/src/installs/moom.md +0 -570
  141. package/src/installs/node.js +0 -904
  142. package/src/installs/node.md +0 -1153
  143. package/src/installs/nordpass.js +0 -716
  144. package/src/installs/nordpass.md +0 -921
  145. package/src/installs/nordvpn.js +0 -892
  146. package/src/installs/nordvpn.md +0 -1052
  147. package/src/installs/nvm.js +0 -995
  148. package/src/installs/nvm.md +0 -1057
  149. package/src/installs/ohmyzsh.js +0 -529
  150. package/src/installs/ohmyzsh.md +0 -1094
  151. package/src/installs/openssh.js +0 -804
  152. package/src/installs/openssh.md +0 -1056
  153. package/src/installs/pandoc.js +0 -662
  154. package/src/installs/pandoc.md +0 -1036
  155. package/src/installs/parallels-desktop.js +0 -431
  156. package/src/installs/parallels-desktop.md +0 -446
  157. package/src/installs/pinentry.js +0 -510
  158. package/src/installs/pinentry.md +0 -1142
  159. package/src/installs/pngyu.js +0 -869
  160. package/src/installs/pngyu.md +0 -896
  161. package/src/installs/postman.js +0 -799
  162. package/src/installs/postman.md +0 -940
  163. package/src/installs/procps.js +0 -425
  164. package/src/installs/procps.md +0 -851
  165. package/src/installs/safari-tech-preview.js +0 -374
  166. package/src/installs/safari-tech-preview.md +0 -533
  167. package/src/installs/sfnt2woff.js +0 -658
  168. package/src/installs/sfnt2woff.md +0 -795
  169. package/src/installs/shellcheck.js +0 -481
  170. package/src/installs/shellcheck.md +0 -1005
  171. package/src/installs/slack.js +0 -741
  172. package/src/installs/slack.md +0 -865
  173. package/src/installs/snagit.js +0 -585
  174. package/src/installs/snagit.md +0 -844
  175. package/src/installs/software-properties-common.js +0 -372
  176. package/src/installs/software-properties-common.md +0 -805
  177. package/src/installs/spotify.js +0 -877
  178. package/src/installs/spotify.md +0 -901
  179. package/src/installs/studio-3t.js +0 -823
  180. package/src/installs/studio-3t.md +0 -918
  181. package/src/installs/sublime-text.js +0 -804
  182. package/src/installs/sublime-text.md +0 -914
  183. package/src/installs/superwhisper.js +0 -706
  184. package/src/installs/superwhisper.md +0 -630
  185. package/src/installs/tailscale.js +0 -745
  186. package/src/installs/tailscale.md +0 -1100
  187. package/src/installs/tar.js +0 -389
  188. package/src/installs/tar.md +0 -946
  189. package/src/installs/termius.js +0 -798
  190. package/src/installs/termius.md +0 -844
  191. package/src/installs/terraform.js +0 -779
  192. package/src/installs/terraform.md +0 -899
  193. package/src/installs/tfenv.js +0 -778
  194. package/src/installs/tfenv.md +0 -1091
  195. package/src/installs/tidal.js +0 -771
  196. package/src/installs/tidal.md +0 -864
  197. package/src/installs/tmux.js +0 -346
  198. package/src/installs/tmux.md +0 -1030
  199. package/src/installs/tree.js +0 -411
  200. package/src/installs/tree.md +0 -833
  201. package/src/installs/unzip.js +0 -460
  202. package/src/installs/unzip.md +0 -879
  203. package/src/installs/vim.js +0 -421
  204. package/src/installs/vim.md +0 -1040
  205. package/src/installs/vlc.js +0 -821
  206. package/src/installs/vlc.md +0 -927
  207. package/src/installs/vscode.js +0 -843
  208. package/src/installs/vscode.md +0 -1002
  209. package/src/installs/wget.js +0 -420
  210. package/src/installs/wget.md +0 -791
  211. package/src/installs/whatsapp.js +0 -729
  212. package/src/installs/whatsapp.md +0 -854
  213. package/src/installs/winpty.js +0 -352
  214. package/src/installs/winpty.md +0 -620
  215. package/src/installs/woff2.js +0 -553
  216. package/src/installs/woff2.md +0 -977
  217. package/src/installs/wsl.js +0 -572
  218. package/src/installs/wsl.md +0 -699
  219. package/src/installs/xcode-clt.js +0 -520
  220. package/src/installs/xcode-clt.md +0 -351
  221. package/src/installs/xcode.js +0 -560
  222. package/src/installs/xcode.md +0 -573
  223. package/src/installs/yarn.js +0 -824
  224. package/src/installs/yarn.md +0 -1074
  225. package/src/installs/yq.js +0 -654
  226. package/src/installs/yq.md +0 -944
  227. package/src/installs/yt-dlp.js +0 -701
  228. package/src/installs/yt-dlp.md +0 -946
  229. package/src/installs/yum-utils.js +0 -297
  230. package/src/installs/yum-utils.md +0 -648
  231. package/src/installs/zoom.js +0 -759
  232. package/src/installs/zoom.md +0 -884
  233. package/src/installs/zsh.js +0 -455
  234. package/src/installs/zsh.md +0 -1008
  235. package/src/scripts/README.md +0 -617
  236. package/src/scripts/STATUS.md +0 -208
  237. package/src/scripts/afk.js +0 -411
  238. package/src/scripts/backup-all.js +0 -746
  239. package/src/scripts/backup-source.js +0 -727
  240. package/src/scripts/brewd.js +0 -389
  241. package/src/scripts/brewi.js +0 -520
  242. package/src/scripts/brewr.js +0 -527
  243. package/src/scripts/brews.js +0 -477
  244. package/src/scripts/brewu.js +0 -504
  245. package/src/scripts/c.js +0 -201
  246. package/src/scripts/ccurl.js +0 -341
  247. package/src/scripts/certbot-crontab-init.js +0 -504
  248. package/src/scripts/certbot-init.js +0 -657
  249. package/src/scripts/ch.js +0 -355
  250. package/src/scripts/claude-danger.js +0 -268
  251. package/src/scripts/clean-dev.js +0 -435
  252. package/src/scripts/clear-dns-cache.js +0 -541
  253. package/src/scripts/clone.js +0 -435
  254. package/src/scripts/code-all.js +0 -437
  255. package/src/scripts/count-files.js +0 -211
  256. package/src/scripts/count-folders.js +0 -211
  257. package/src/scripts/count.js +0 -264
  258. package/src/scripts/d.js +0 -219
  259. package/src/scripts/datauri.js +0 -389
  260. package/src/scripts/delete-files.js +0 -380
  261. package/src/scripts/docker-clean.js +0 -426
  262. package/src/scripts/dp.js +0 -442
  263. package/src/scripts/e.js +0 -390
  264. package/src/scripts/empty-trash.js +0 -513
  265. package/src/scripts/evm.js +0 -444
  266. package/src/scripts/fetch-github-repos.js +0 -456
  267. package/src/scripts/get-channel.js +0 -345
  268. package/src/scripts/get-course.js +0 -399
  269. package/src/scripts/get-dependencies.js +0 -306
  270. package/src/scripts/get-folder.js +0 -799
  271. package/src/scripts/get-tunes.js +0 -426
  272. package/src/scripts/get-video.js +0 -367
  273. package/src/scripts/git-backup.js +0 -577
  274. package/src/scripts/git-clone.js +0 -493
  275. package/src/scripts/git-pup.js +0 -319
  276. package/src/scripts/git-push.js +0 -396
  277. package/src/scripts/h.js +0 -622
  278. package/src/scripts/hide-desktop-icons.js +0 -499
  279. package/src/scripts/hide-hidden-files.js +0 -538
  280. package/src/scripts/install-dependencies-from.js +0 -456
  281. package/src/scripts/ips.js +0 -663
  282. package/src/scripts/iso.js +0 -370
  283. package/src/scripts/killni.js +0 -577
  284. package/src/scripts/ll.js +0 -467
  285. package/src/scripts/local-ip.js +0 -325
  286. package/src/scripts/m.js +0 -524
  287. package/src/scripts/map.js +0 -309
  288. package/src/scripts/mkd.js +0 -351
  289. package/src/scripts/ncu-update-all.js +0 -457
  290. package/src/scripts/nginx-init.js +0 -718
  291. package/src/scripts/npmi.js +0 -382
  292. package/src/scripts/o.js +0 -511
  293. package/src/scripts/org-by-date.js +0 -338
  294. package/src/scripts/p.js +0 -224
  295. package/src/scripts/packages.js +0 -330
  296. package/src/scripts/path.js +0 -225
  297. package/src/scripts/ports.js +0 -597
  298. package/src/scripts/q.js +0 -305
  299. package/src/scripts/refresh-files.js +0 -394
  300. package/src/scripts/remove-smaller-files.js +0 -516
  301. package/src/scripts/rename-files-with-date.js +0 -533
  302. package/src/scripts/resize-image.js +0 -539
  303. package/src/scripts/rm-safe.js +0 -669
  304. package/src/scripts/s.js +0 -540
  305. package/src/scripts/set-git-public.js +0 -365
  306. package/src/scripts/show-desktop-icons.js +0 -475
  307. package/src/scripts/show-hidden-files.js +0 -472
  308. package/src/scripts/tpa.js +0 -280
  309. package/src/scripts/tpo.js +0 -280
  310. package/src/scripts/u.js +0 -505
  311. package/src/scripts/vpush.js +0 -437
  312. package/src/scripts/y.js +0 -283
  313. package/src/utils/README.md +0 -95
  314. package/src/utils/common/apps.js +0 -143
  315. package/src/utils/common/display.js +0 -157
  316. package/src/utils/common/network.js +0 -185
  317. package/src/utils/common/os.js +0 -294
  318. package/src/utils/common/package-manager.js +0 -301
  319. package/src/utils/common/privileges.js +0 -138
  320. package/src/utils/common/shell.js +0 -216
  321. package/src/utils/macos/apps.js +0 -228
  322. package/src/utils/macos/brew.js +0 -315
  323. package/src/utils/ubuntu/apt.js +0 -307
  324. package/src/utils/ubuntu/desktop.js +0 -292
  325. package/src/utils/ubuntu/snap.js +0 -344
  326. package/src/utils/ubuntu/systemd.js +0 -286
  327. package/src/utils/windows/choco.js +0 -465
  328. package/src/utils/windows/env.js +0 -246
  329. package/src/utils/windows/registry.js +0 -269
  330. package/src/utils/windows/shell.js +0 -240
  331. package/src/utils/windows/winget.js +0 -489
@@ -1,618 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * @fileoverview Install CA Certificates - trusted Certificate Authority certificates.
5
- *
6
- * CA certificates (Certificate Authority certificates) are digital certificates
7
- * that establish a chain of trust for SSL/TLS connections. They are used by
8
- * web browsers, command-line tools like cURL and wget, programming languages,
9
- * and other applications to verify that secure connections to remote servers
10
- * are legitimate and not being intercepted by malicious actors.
11
- *
12
- * CA certificates are essential for:
13
- * - Secure web browsing (HTTPS)
14
- * - Package manager operations (downloading from secure repositories)
15
- * - API calls from applications
16
- * - Git operations over HTTPS
17
- * - Email encryption (TLS)
18
- * - VPN connections
19
- *
20
- * Platform-specific packages and tools:
21
- * - macOS: Homebrew ca-certificates formula (Mozilla CA bundle for CLI tools)
22
- * - Ubuntu/Debian/Raspbian: ca-certificates package via APT + update-ca-certificates
23
- * - Amazon Linux/RHEL: ca-certificates package via DNF/YUM + update-ca-trust
24
- * - Windows: Windows Certificate Store (managed via certutil)
25
- * - WSL: ca-certificates package via APT (same as Ubuntu)
26
- * - Git Bash: CA bundle bundled with Git for Windows
27
- *
28
- * @module installs/ca-certificates
29
- */
30
-
31
- const os = require('../utils/common/os');
32
- const shell = require('../utils/common/shell');
33
- const brew = require('../utils/macos/brew');
34
- const apt = require('../utils/ubuntu/apt');
35
-
36
- // -----------------------------------------------------------------------------
37
- // Helper Functions
38
- // -----------------------------------------------------------------------------
39
-
40
- /**
41
- * Checks if the ca-certificates package is installed on Debian-based systems.
42
- * Uses dpkg to query the package installation status.
43
- *
44
- * @returns {Promise<boolean>} True if ca-certificates is installed via APT
45
- */
46
- async function isDebianCaCertsInstalled() {
47
- return await apt.isPackageInstalled('ca-certificates');
48
- }
49
-
50
- /**
51
- * Checks if the certificate bundle file exists on Debian-based systems.
52
- * The bundle file at /etc/ssl/certs/ca-certificates.crt contains all
53
- * trusted CA certificates concatenated together.
54
- *
55
- * @returns {Promise<boolean>} True if the certificate bundle file exists
56
- */
57
- async function doesDebianCertBundleExist() {
58
- const result = await shell.exec('test -f /etc/ssl/certs/ca-certificates.crt');
59
- return result.code === 0;
60
- }
61
-
62
- /**
63
- * Checks if the certificate bundle file exists on RHEL-based systems.
64
- * The actual bundle file is at /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
65
- * (with a symlink at /etc/pki/tls/certs/ca-bundle.crt for compatibility).
66
- * We check the actual file location since the symlink may be missing even when
67
- * the bundle exists.
68
- *
69
- * @returns {Promise<boolean>} True if the certificate bundle file exists
70
- */
71
- async function doesRhelCertBundleExist() {
72
- // Check the actual bundle file location, not the symlink
73
- const result = await shell.exec('test -f /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem');
74
- return result.code === 0;
75
- }
76
-
77
- // -----------------------------------------------------------------------------
78
- // Platform-Specific Installation Functions
79
- // -----------------------------------------------------------------------------
80
-
81
- /**
82
- * Install CA certificates on macOS using Homebrew.
83
- *
84
- * macOS maintains CA certificates in two locations:
85
- * 1. System Keychain - Used by Safari, native macOS applications, and system services
86
- * 2. Homebrew ca-certificates - Used by Homebrew-installed tools like cURL, OpenSSL, and Python
87
- *
88
- * This function installs the Mozilla CA certificate bundle via Homebrew, which
89
- * provides certificates for command-line tools. The certificate bundle is sourced
90
- * from Mozilla (via https://curl.se/docs/caextract.html) and is regularly updated.
91
- *
92
- * Note: System applications use the macOS Keychain, not Homebrew's ca-certificates.
93
- * Use Keychain Access or the security command to manage system-wide certificates.
94
- *
95
- * @returns {Promise<void>}
96
- */
97
- async function install_macos() {
98
- // Check if Homebrew is available - it is required for macOS installation
99
- if (!brew.isInstalled()) {
100
- console.log('Homebrew is not installed. Please install Homebrew first.');
101
- console.log('Run: dev install homebrew');
102
- return;
103
- }
104
-
105
- // Check if ca-certificates is already installed via Homebrew
106
- const isBrewCaCertsInstalled = await brew.isFormulaInstalled('ca-certificates');
107
- if (isBrewCaCertsInstalled) {
108
- console.log('CA certificates are already installed via Homebrew, skipping...');
109
- return;
110
- }
111
-
112
- // Install ca-certificates using Homebrew
113
- // The --quiet flag suppresses non-essential output for cleaner automation
114
- console.log('Installing CA certificates via Homebrew...');
115
- const result = await brew.install('ca-certificates');
116
-
117
- if (!result.success) {
118
- console.log('Failed to install CA certificates via Homebrew.');
119
- console.log(result.output);
120
- return;
121
- }
122
-
123
- // Verify the installation succeeded by checking if the formula is now installed
124
- const verified = await brew.isFormulaInstalled('ca-certificates');
125
- if (!verified) {
126
- console.log('Installation may have failed: ca-certificates formula not found after install.');
127
- return;
128
- }
129
-
130
- console.log('CA certificates installed successfully via Homebrew.');
131
- console.log('');
132
- console.log('Note: Homebrew-installed tools will automatically use this certificate bundle.');
133
- console.log('System applications (Safari, Mail) use the macOS Keychain instead.');
134
- }
135
-
136
- /**
137
- * Install CA certificates on Ubuntu/Debian using APT.
138
- *
139
- * The ca-certificates package is typically pre-installed on Ubuntu and Debian
140
- * systems. This function ensures it is installed and up to date, then regenerates
141
- * the certificate bundle using update-ca-certificates.
142
- *
143
- * The update-ca-certificates command:
144
- * 1. Reads certificate configuration from /etc/ca-certificates.conf
145
- * 2. Processes certificates from /usr/share/ca-certificates/ and /usr/local/share/ca-certificates/
146
- * 3. Generates the unified bundle at /etc/ssl/certs/ca-certificates.crt
147
- * 4. Creates individual certificate symlinks in /etc/ssl/certs/
148
- *
149
- * @returns {Promise<void>}
150
- */
151
- async function install_ubuntu() {
152
- // Check if ca-certificates is already installed and certificate bundle exists
153
- const isInstalled = await isDebianCaCertsInstalled();
154
- const bundleExists = await doesDebianCertBundleExist();
155
-
156
- if (isInstalled && bundleExists) {
157
- console.log('CA certificates are already installed, skipping...');
158
- return;
159
- }
160
-
161
- // Update package lists before installing to ensure we get the latest version
162
- console.log('Updating package lists...');
163
- const updateResult = await shell.exec('sudo DEBIAN_FRONTEND=noninteractive apt-get update -y');
164
- if (updateResult.code !== 0) {
165
- console.log('Warning: Failed to update package lists. Continuing with installation...');
166
- }
167
-
168
- // Install ca-certificates using APT with non-interactive mode
169
- console.log('Installing CA certificates via APT...');
170
- const installResult = await shell.exec('sudo DEBIAN_FRONTEND=noninteractive apt-get install -y ca-certificates');
171
-
172
- if (installResult.code !== 0) {
173
- console.log('Failed to install CA certificates via APT.');
174
- console.log(installResult.stderr || installResult.stdout);
175
- return;
176
- }
177
-
178
- // Regenerate the certificate bundle to ensure it is up to date
179
- // This command processes all certificates and creates the unified bundle
180
- console.log('Regenerating certificate bundle...');
181
- const updateCaResult = await shell.exec('sudo update-ca-certificates');
182
-
183
- if (updateCaResult.code !== 0) {
184
- console.log('Warning: Failed to regenerate certificate bundle.');
185
- console.log(updateCaResult.stderr || updateCaResult.stdout);
186
- }
187
-
188
- // Verify the installation succeeded by checking if the bundle file exists
189
- const verified = await doesDebianCertBundleExist();
190
- if (!verified) {
191
- console.log('Installation may have failed: certificate bundle not found after install.');
192
- return;
193
- }
194
-
195
- console.log('CA certificates installed successfully.');
196
- }
197
-
198
- /**
199
- * Install CA certificates on Ubuntu running in WSL.
200
- *
201
- * WSL Ubuntu installations follow the same process as native Ubuntu using APT.
202
- * The certificate store is separate from the Windows host, so certificates
203
- * added to Windows Certificate Store are not automatically available in WSL.
204
- *
205
- * @returns {Promise<void>}
206
- */
207
- async function install_ubuntu_wsl() {
208
- // WSL Ubuntu uses the same APT-based installation as native Ubuntu
209
- await install_ubuntu();
210
- }
211
-
212
- /**
213
- * Install CA certificates on Raspberry Pi OS using APT.
214
- *
215
- * Raspberry Pi OS is based on Debian, so CA certificates management follows
216
- * the same process as Ubuntu/Debian. The ca-certificates package is typically
217
- * pre-installed on Raspberry Pi OS.
218
- *
219
- * Note: The ca-certificates package is architecture-independent (it contains
220
- * only certificate data files, no compiled binaries), so there is no difference
221
- * between ARM and x86 installations.
222
- *
223
- * @returns {Promise<void>}
224
- */
225
- async function install_raspbian() {
226
- // Check if ca-certificates is already installed and certificate bundle exists
227
- const isInstalled = await isDebianCaCertsInstalled();
228
- const bundleExists = await doesDebianCertBundleExist();
229
-
230
- if (isInstalled && bundleExists) {
231
- console.log('CA certificates are already installed, skipping...');
232
- return;
233
- }
234
-
235
- // Update package lists before installing to ensure we get the latest version
236
- console.log('Updating package lists...');
237
- const updateResult = await shell.exec('sudo DEBIAN_FRONTEND=noninteractive apt-get update -y');
238
- if (updateResult.code !== 0) {
239
- console.log('Warning: Failed to update package lists. Continuing with installation...');
240
- }
241
-
242
- // Install ca-certificates using APT with non-interactive mode
243
- console.log('Installing CA certificates via APT...');
244
- console.log('Note: Installation may take a few minutes on Raspberry Pi.');
245
- const installResult = await shell.exec('sudo DEBIAN_FRONTEND=noninteractive apt-get install -y ca-certificates');
246
-
247
- if (installResult.code !== 0) {
248
- console.log('Failed to install CA certificates via APT.');
249
- console.log(installResult.stderr || installResult.stdout);
250
- return;
251
- }
252
-
253
- // Regenerate the certificate bundle to ensure it is up to date
254
- console.log('Regenerating certificate bundle...');
255
- const updateCaResult = await shell.exec('sudo update-ca-certificates');
256
-
257
- if (updateCaResult.code !== 0) {
258
- console.log('Warning: Failed to regenerate certificate bundle.');
259
- console.log(updateCaResult.stderr || updateCaResult.stdout);
260
- }
261
-
262
- // Verify the installation succeeded by checking if the bundle file exists
263
- const verified = await doesDebianCertBundleExist();
264
- if (!verified) {
265
- console.log('Installation may have failed: certificate bundle not found after install.');
266
- return;
267
- }
268
-
269
- console.log('CA certificates installed successfully.');
270
- }
271
-
272
- /**
273
- * Install CA certificates on Amazon Linux/RHEL using DNF or YUM.
274
- *
275
- * The ca-certificates package is pre-installed on all Amazon Linux versions.
276
- * This function ensures it is installed and up to date, then regenerates
277
- * the certificate bundle using update-ca-trust.
278
- *
279
- * Note: Unlike Debian-based systems that use update-ca-certificates, Red Hat-based
280
- * systems (including Amazon Linux) use update-ca-trust to manage the certificate
281
- * trust store. The bundle is located at /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
282
- * (with a symlink at /etc/pki/tls/certs/ca-bundle.crt for compatibility).
283
- *
284
- * Amazon Linux 2023 uses dnf as the package manager, while Amazon Linux 2 uses yum.
285
- * This function automatically detects which package manager is available.
286
- *
287
- * @returns {Promise<void>}
288
- */
289
- async function install_amazon_linux() {
290
- // Check if the certificate bundle already exists
291
- const bundleExists = await doesRhelCertBundleExist();
292
-
293
- if (bundleExists) {
294
- // Verify the package is installed by checking if rpm can find it
295
- const rpmResult = await shell.exec('rpm -q ca-certificates');
296
- if (rpmResult.code === 0) {
297
- console.log('CA certificates are already installed, skipping...');
298
- return;
299
- }
300
- }
301
-
302
- // Detect the platform to determine which package manager to use
303
- // Amazon Linux 2023 uses dnf, Amazon Linux 2 uses yum
304
- const platform = os.detect();
305
- const packageManager = platform.packageManager;
306
-
307
- // Construct the install command based on available package manager
308
- const installCommand = packageManager === 'dnf'
309
- ? 'sudo dnf install -y ca-certificates'
310
- : 'sudo yum install -y ca-certificates';
311
-
312
- // Install ca-certificates
313
- console.log(`Installing CA certificates via ${packageManager}...`);
314
- const installResult = await shell.exec(installCommand);
315
-
316
- if (installResult.code !== 0) {
317
- console.log(`Failed to install CA certificates via ${packageManager}.`);
318
- console.log(installResult.stderr || installResult.stdout);
319
- return;
320
- }
321
-
322
- // Regenerate the certificate bundle using update-ca-trust
323
- // This command reads certificates from /etc/pki/ca-trust/source/anchors/
324
- // and generates the unified bundle at /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
325
- console.log('Regenerating certificate trust store...');
326
- const updateTrustResult = await shell.exec('sudo update-ca-trust');
327
-
328
- if (updateTrustResult.code !== 0) {
329
- console.log('Warning: Failed to regenerate certificate trust store.');
330
- console.log(updateTrustResult.stderr || updateTrustResult.stdout);
331
- }
332
-
333
- // Verify the installation succeeded by checking if the bundle file exists
334
- const verified = await doesRhelCertBundleExist();
335
- if (!verified) {
336
- console.log('Installation may have failed: certificate bundle not found after install.');
337
- return;
338
- }
339
-
340
- console.log('CA certificates installed successfully.');
341
- }
342
-
343
- /**
344
- * Install/update CA certificates on Windows.
345
- *
346
- * Windows handles CA certificates differently from Linux and macOS. There is no
347
- * "ca-certificates" package to install. Instead, Windows maintains a Certificate
348
- * Trust List (CTL) that is automatically updated through Windows Update.
349
- *
350
- * This function manually triggers an update of the root certificates by:
351
- * 1. Downloading the latest root certificate list from Microsoft
352
- * 2. Importing the certificates to the Trusted Root store
353
- *
354
- * Windows stores certificates in the Windows Certificate Store, accessible via:
355
- * - Certificate Manager (certmgr.msc) for current user certificates
356
- * - Certificate Manager (certlm.msc) for local machine certificates
357
- * - certutil command-line tool
358
- * - PowerShell certificate provider
359
- *
360
- * Note: This function must be run with Administrator privileges.
361
- *
362
- * @returns {Promise<void>}
363
- */
364
- async function install_windows() {
365
- // Check if certutil is available (it should be on all modern Windows versions)
366
- const hasCertutil = shell.commandExists('certutil');
367
- if (!hasCertutil) {
368
- console.log('certutil command not found. This is unexpected on Windows.');
369
- console.log('Please ensure you are running Windows 10 or later.');
370
- return;
371
- }
372
-
373
- // Check if certificates are already present in the Trusted Root store
374
- // A healthy Windows installation should have over 100 root certificates
375
- console.log('Checking current certificate store...');
376
- const countResult = await shell.exec('powershell -Command "(Get-ChildItem Cert:\\LocalMachine\\Root).Count"');
377
-
378
- if (countResult.code === 0) {
379
- const certCount = parseInt(countResult.stdout.trim(), 10);
380
- if (certCount > 100) {
381
- console.log(`Windows Certificate Store contains ${certCount} root certificates.`);
382
- console.log('CA certificates are already present, skipping...');
383
- return;
384
- }
385
- }
386
-
387
- // Download and import the latest root certificates from Microsoft
388
- // This command retrieves the Certificate Trust List from Windows Update servers
389
- console.log('Downloading latest root certificates from Microsoft...');
390
- const downloadResult = await shell.exec('certutil -generateSSTFromWU C:\\Windows\\Temp\\roots.sst');
391
-
392
- if (downloadResult.code !== 0) {
393
- console.log('Failed to download root certificates from Microsoft.');
394
- console.log('This may be due to network issues or Windows Update being blocked.');
395
- console.log(downloadResult.stderr || downloadResult.stdout);
396
- return;
397
- }
398
-
399
- // Import the certificates to the Trusted Root store
400
- console.log('Importing certificates to Trusted Root store...');
401
- const importResult = await shell.exec('certutil -addstore -f Root C:\\Windows\\Temp\\roots.sst');
402
-
403
- if (importResult.code !== 0) {
404
- console.log('Failed to import certificates to Trusted Root store.');
405
- console.log('Ensure you are running this command as Administrator.');
406
- console.log(importResult.stderr || importResult.stdout);
407
- // Clean up temporary file
408
- await shell.exec('del C:\\Windows\\Temp\\roots.sst');
409
- return;
410
- }
411
-
412
- // Clean up the temporary file
413
- await shell.exec('del C:\\Windows\\Temp\\roots.sst');
414
-
415
- console.log('CA certificates updated successfully.');
416
- console.log('');
417
- console.log('Note: Windows Update automatically maintains root CA certificates.');
418
- console.log('This manual update ensures you have the latest certificates immediately.');
419
- }
420
-
421
- /**
422
- * Install CA certificates on Git Bash (Windows).
423
- *
424
- * Git for Windows includes its own CA certificate bundle that is used by Git
425
- * and the bundled cURL. This bundle is separate from both the Windows Certificate
426
- * Store and any WSL certificate stores.
427
- *
428
- * The CA certificate bundle is located at:
429
- * - C:\Program Files\Git\mingw64\etc\ssl\certs\ca-bundle.crt (Git commands)
430
- * - C:\Program Files\Git\mingw64\ssl\certs\ca-bundle.crt (cURL/OpenSSL)
431
- *
432
- * No separate installation is required. If the certificate bundle is missing or
433
- * needs to be updated, users can:
434
- * 1. Upgrade Git for Windows (which includes an updated certificate bundle)
435
- * 2. Configure Git to use the Windows SChannel backend instead
436
- *
437
- * @returns {Promise<void>}
438
- */
439
- async function install_gitbash() {
440
- // Check if the CA bundle file exists (it should be bundled with Git Bash)
441
- const bundleCheckResult = await shell.exec('test -f /mingw64/etc/ssl/certs/ca-bundle.crt');
442
-
443
- if (bundleCheckResult.code === 0) {
444
- console.log('CA certificates are already installed (bundled with Git for Windows), skipping...');
445
- return;
446
- }
447
-
448
- // If the bundle is missing, provide guidance
449
- console.log('CA certificate bundle not found at expected location.');
450
- console.log('');
451
- console.log('Git for Windows includes its own CA certificate bundle. If it is missing:');
452
- console.log('');
453
- console.log('Option 1: Reinstall or upgrade Git for Windows');
454
- console.log(' Download from: https://git-scm.com/download/win');
455
- console.log('');
456
- console.log('Option 2: Configure Git to use Windows Certificate Store');
457
- console.log(' git config --global http.sslBackend schannel');
458
- console.log('');
459
- console.log('Option 3: Manually download the Mozilla CA bundle');
460
- console.log(' curl -o /mingw64/etc/ssl/certs/ca-bundle.crt https://curl.se/ca/cacert.pem');
461
- }
462
-
463
- // -----------------------------------------------------------------------------
464
- // Eligibility Check
465
- // -----------------------------------------------------------------------------
466
-
467
- /**
468
- * Check if CA certificates are installed on the current platform.
469
- *
470
- * This function performs platform-specific checks to determine if CA certificates
471
- * are installed:
472
- * - macOS: Checks for ca-certificates Homebrew formula
473
- * - Linux (Debian-based): Checks for ca-certificates APT package and bundle file
474
- * - Linux (RHEL-based): Checks for ca-certificates RPM package and bundle file
475
- * - Windows/Git Bash: Checks for certificate store or bundle file
476
- *
477
- * @returns {Promise<boolean>} True if CA certificates are installed
478
- */
479
- async function isInstalled() {
480
- const platform = os.detect();
481
-
482
- // macOS: Check for ca-certificates via Homebrew
483
- if (platform.type === 'macos') {
484
- return await brew.isFormulaInstalled('ca-certificates');
485
- }
486
-
487
- // Ubuntu/Debian/WSL/Raspberry Pi: Check for package and bundle file
488
- if (['ubuntu', 'debian', 'wsl', 'raspbian'].includes(platform.type)) {
489
- const packageInstalled = await isDebianCaCertsInstalled();
490
- const bundleExists = await doesDebianCertBundleExist();
491
- return packageInstalled && bundleExists;
492
- }
493
-
494
- // Amazon Linux/RHEL/Fedora: Check for RPM package and bundle file
495
- if (['amazon_linux', 'rhel', 'fedora'].includes(platform.type)) {
496
- const rpmResult = await shell.exec('rpm -q ca-certificates 2>/dev/null');
497
- const bundleExists = await doesRhelCertBundleExist();
498
- return rpmResult.code === 0 && bundleExists;
499
- }
500
-
501
- // Windows: Check if certificate store has certificates
502
- if (platform.type === 'windows') {
503
- const countResult = await shell.exec('powershell -Command "(Get-ChildItem Cert:\\LocalMachine\\Root).Count"');
504
- if (countResult.code === 0) {
505
- const certCount = parseInt(countResult.stdout.trim(), 10);
506
- return certCount > 100;
507
- }
508
- return false;
509
- }
510
-
511
- // Git Bash: Check if CA bundle file exists
512
- if (platform.type === 'gitbash') {
513
- const bundleCheckResult = await shell.exec('test -f /mingw64/etc/ssl/certs/ca-bundle.crt');
514
- return bundleCheckResult.code === 0;
515
- }
516
-
517
- return false;
518
- }
519
-
520
- /**
521
- * Check if this installer is supported on the current platform.
522
- *
523
- * CA certificates can be installed on all supported platforms:
524
- * - macOS (Homebrew ca-certificates formula)
525
- * - Ubuntu/Debian (ca-certificates package via APT)
526
- * - Ubuntu on WSL (ca-certificates package via APT)
527
- * - Raspberry Pi OS (ca-certificates package via APT)
528
- * - Amazon Linux/RHEL/Fedora (ca-certificates package via DNF/YUM)
529
- * - Windows (certutil for Windows Certificate Store)
530
- * - Git Bash (bundled with Git for Windows)
531
- *
532
- * @returns {boolean} True if installation is supported on this platform
533
- */
534
- function isEligible() {
535
- const platform = os.detect();
536
- return ['macos', 'ubuntu', 'debian', 'wsl', 'raspbian', 'amazon_linux', 'fedora', 'rhel', 'windows', 'gitbash'].includes(platform.type);
537
- }
538
-
539
- // -----------------------------------------------------------------------------
540
- // Main Installation Entry Point
541
- // -----------------------------------------------------------------------------
542
-
543
- /**
544
- * Main installation entry point - detects platform and runs appropriate installer.
545
- *
546
- * This function detects the current operating system and dispatches to the
547
- * appropriate platform-specific installer function. CA certificates are
548
- * supported on all major platforms.
549
- *
550
- * Supported platforms:
551
- * - macOS (Homebrew ca-certificates formula)
552
- * - Ubuntu/Debian (ca-certificates package via APT)
553
- * - Ubuntu on WSL (ca-certificates package via APT)
554
- * - Raspberry Pi OS (ca-certificates package via APT)
555
- * - Amazon Linux/RHEL/Fedora (ca-certificates package via DNF/YUM)
556
- * - Windows (certutil for Windows Certificate Store)
557
- * - Git Bash (bundled with Git for Windows)
558
- *
559
- * @returns {Promise<void>}
560
- */
561
- async function install() {
562
- const platform = os.detect();
563
-
564
- // Map platform types to their corresponding installer functions
565
- // Multiple platform types can map to the same installer (e.g., debian and ubuntu)
566
- const installers = {
567
- 'macos': install_macos,
568
- 'ubuntu': install_ubuntu,
569
- 'debian': install_ubuntu,
570
- 'wsl': install_ubuntu_wsl,
571
- 'raspbian': install_raspbian,
572
- 'amazon_linux': install_amazon_linux,
573
- 'fedora': install_amazon_linux,
574
- 'rhel': install_amazon_linux,
575
- 'windows': install_windows,
576
- 'gitbash': install_gitbash,
577
- };
578
-
579
- // Look up the installer for the detected platform
580
- const installer = installers[platform.type];
581
-
582
- // If no installer exists for this platform, inform the user gracefully
583
- if (!installer) {
584
- console.log(`CA certificates are not available for ${platform.type}.`);
585
- return;
586
- }
587
-
588
- // Run the platform-specific installer
589
- await installer();
590
- }
591
-
592
- // -----------------------------------------------------------------------------
593
- // Module Exports
594
- // -----------------------------------------------------------------------------
595
-
596
- module.exports = {
597
- install,
598
- isInstalled,
599
- isEligible,
600
- install_macos,
601
- install_ubuntu,
602
- install_ubuntu_wsl,
603
- install_raspbian,
604
- install_amazon_linux,
605
- install_windows,
606
- install_gitbash,
607
- };
608
-
609
- // -----------------------------------------------------------------------------
610
- // Direct Execution Handler
611
- // -----------------------------------------------------------------------------
612
-
613
- if (require.main === module) {
614
- install().catch(err => {
615
- console.error(err.message);
616
- process.exit(1);
617
- });
618
- }