@fredlackey/devutils 0.0.18 → 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 -1028
  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 -261
  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,504 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * certbot-crontab-init - Add certbot renewal cron job for automatic SSL certificate renewal
5
- *
6
- * Migrated from legacy dotfiles function.
7
- * Original:
8
- * certbot-crontab-init() {
9
- * local cron_line="0 12 * * * /usr/bin/certbot renew --quiet"
10
- * local temp_crontab
11
- * local cron_service=""
12
- *
13
- * # Determine cron service name based on OS
14
- * if [[ -f /etc/debian_version ]]; then
15
- * cron_service="cron"
16
- * elif [[ -f /etc/redhat-release ]]; then
17
- * cron_service="crond"
18
- * else
19
- * cron_service="cron"
20
- * fi
21
- *
22
- * # Check if cron service is running, start/enable if not
23
- * # Check if certbot renewal line already exists
24
- * # Add the cron line if not present
25
- * }
26
- *
27
- * This script sets up automatic SSL certificate renewal using certbot.
28
- * SSL certificates from Let's Encrypt expire every 90 days, so automatic
29
- * renewal is essential for maintaining valid HTTPS on your servers.
30
- *
31
- * The cron job runs daily at 12:00 PM and quietly renews any certificates
32
- * that are within 30 days of expiration.
33
- *
34
- * @module scripts/certbot-crontab-init
35
- */
36
-
37
- const os = require('../utils/common/os');
38
- const { execSync, spawnSync } = require('child_process');
39
- const fs = require('fs');
40
-
41
- // The cron line to add - runs daily at noon, quietly renews certificates
42
- const CRON_LINE = '0 12 * * * /usr/bin/certbot renew --quiet';
43
-
44
- /**
45
- * Helper function to check if a command exists on the system.
46
- *
47
- * @param {string} cmd - The command name to check
48
- * @returns {boolean} True if the command exists, false otherwise
49
- */
50
- function isCommandAvailable(cmd) {
51
- try {
52
- const checkCmd = process.platform === 'win32' ? `where ${cmd}` : `which ${cmd}`;
53
- execSync(checkCmd, { stdio: 'ignore' });
54
- return true;
55
- } catch {
56
- return false;
57
- }
58
- }
59
-
60
- /**
61
- * Helper function to run a command and return success/failure.
62
- *
63
- * @param {string} cmd - The command to execute
64
- * @param {object} options - Options to pass to execSync
65
- * @returns {boolean} True if command succeeded, false otherwise
66
- */
67
- function runCommand(cmd, options = {}) {
68
- try {
69
- execSync(cmd, { stdio: 'pipe', ...options });
70
- return true;
71
- } catch {
72
- return false;
73
- }
74
- }
75
-
76
- /**
77
- * Helper function to run a command and return its output.
78
- *
79
- * @param {string} cmd - The command to execute
80
- * @returns {{ success: boolean, output: string }} Result object with success flag and output
81
- */
82
- function runCommandWithOutput(cmd) {
83
- try {
84
- const output = execSync(cmd, { stdio: 'pipe', encoding: 'utf8' });
85
- return { success: true, output: output.trim() };
86
- } catch (error) {
87
- return { success: false, output: '' };
88
- }
89
- }
90
-
91
- /**
92
- * Pure Node.js implementation - NOT FULLY APPLICABLE for this script.
93
- *
94
- * Cron job management requires OS-level tools:
95
- * - Linux: crontab command and systemd/init for service management
96
- * - macOS: launchd for scheduled tasks (different approach entirely)
97
- * - Windows: Task Scheduler (completely different paradigm)
98
- *
99
- * However, some validation and checks can be done in pure Node.js.
100
- *
101
- * @param {string[]} args - Command line arguments (unused)
102
- * @returns {Promise<void>}
103
- * @throws {Error} Always throws - this function should not be called directly
104
- */
105
- async function do_certbot_crontab_init_nodejs(args) {
106
- // Cron management is inherently platform-specific.
107
- // Linux uses crontab, macOS uses launchd, Windows uses Task Scheduler.
108
- throw new Error(
109
- 'do_certbot_crontab_init_nodejs should not be called directly. ' +
110
- 'Cron/scheduled task management requires OS-specific tools.'
111
- );
112
- }
113
-
114
- /**
115
- * Add certbot renewal cron job on macOS.
116
- *
117
- * macOS uses launchd instead of cron for scheduled tasks. While cron is available
118
- * on macOS, launchd is the preferred and more reliable mechanism. This function
119
- * creates a launchd plist file for certbot renewal.
120
- *
121
- * Alternatively, if certbot was installed via Homebrew, it may already have
122
- * set up automatic renewal.
123
- *
124
- * @param {string[]} args - Command line arguments (unused)
125
- * @returns {Promise<void>}
126
- */
127
- async function do_certbot_crontab_init_macos(args) {
128
- // Check if certbot is installed
129
- if (!isCommandAvailable('certbot')) {
130
- console.error('Error: certbot is not installed.');
131
- console.error('Install it with: brew install certbot');
132
- process.exit(1);
133
- }
134
-
135
- console.log('Setting up certbot automatic renewal on macOS...');
136
- console.log('');
137
-
138
- // On macOS, we can use either cron or launchd
139
- // Cron is simpler and works similarly to Linux, so we'll use that
140
- // for consistency with the original function
141
-
142
- // Check if cron entry already exists
143
- const { success: hasCrontab, output: currentCrontab } = runCommandWithOutput('crontab -l');
144
-
145
- if (hasCrontab && currentCrontab.includes('/usr/local/bin/certbot renew') ||
146
- hasCrontab && currentCrontab.includes('certbot renew')) {
147
- console.log('Certbot renewal cron job already exists.');
148
- console.log('');
149
- console.log('Current crontab entries containing "certbot":');
150
- const certbotLines = currentCrontab.split('\n').filter(line => line.includes('certbot'));
151
- certbotLines.forEach(line => console.log(` ${line}`));
152
- return;
153
- }
154
-
155
- // macOS certbot is typically installed via Homebrew at /usr/local/bin or /opt/homebrew/bin
156
- let certbotPath = '/usr/local/bin/certbot';
157
- if (!fs.existsSync(certbotPath)) {
158
- certbotPath = '/opt/homebrew/bin/certbot';
159
- }
160
- if (!fs.existsSync(certbotPath)) {
161
- // Fall back to whichever certbot is in PATH
162
- const whichResult = runCommandWithOutput('which certbot');
163
- if (whichResult.success) {
164
- certbotPath = whichResult.output;
165
- }
166
- }
167
-
168
- const macosCronLine = `0 12 * * * ${certbotPath} renew --quiet`;
169
-
170
- console.log('Adding certbot renewal cron job...');
171
-
172
- // Add to crontab
173
- const newCrontab = hasCrontab && currentCrontab
174
- ? `${currentCrontab}\n${macosCronLine}`
175
- : macosCronLine;
176
-
177
- try {
178
- // Write new crontab via pipe
179
- const result = spawnSync('crontab', ['-'], {
180
- input: newCrontab + '\n',
181
- encoding: 'utf8',
182
- stdio: ['pipe', 'pipe', 'pipe']
183
- });
184
-
185
- if (result.status !== 0) {
186
- throw new Error(result.stderr || 'Failed to update crontab');
187
- }
188
-
189
- console.log('Certbot renewal cron job added successfully!');
190
- console.log(`Added: ${macosCronLine}`);
191
- console.log('');
192
- console.log('This will automatically renew SSL certificates daily at 12:00 PM.');
193
- console.log('You can view your current crontab with: crontab -l');
194
- } catch (error) {
195
- console.error('Failed to add certbot renewal cron job.');
196
- console.error(error.message);
197
- process.exit(1);
198
- }
199
- }
200
-
201
- /**
202
- * Add certbot renewal cron job on Ubuntu.
203
- *
204
- * Ubuntu uses the "cron" service name and apt package manager.
205
- * This function:
206
- * 1. Checks if the cron service is running, starts/enables it if not
207
- * 2. Checks if the certbot renewal cron entry already exists
208
- * 3. Adds the cron entry if not present
209
- *
210
- * @param {string[]} args - Command line arguments (unused)
211
- * @returns {Promise<void>}
212
- */
213
- async function do_certbot_crontab_init_ubuntu(args) {
214
- await setupCronJobLinux('cron');
215
- }
216
-
217
- /**
218
- * Add certbot renewal cron job on Raspberry Pi OS.
219
- *
220
- * Raspberry Pi OS is Debian-based, so it uses the same "cron" service name
221
- * as Ubuntu/Debian.
222
- *
223
- * @param {string[]} args - Command line arguments (unused)
224
- * @returns {Promise<void>}
225
- */
226
- async function do_certbot_crontab_init_raspbian(args) {
227
- await setupCronJobLinux('cron');
228
- }
229
-
230
- /**
231
- * Add certbot renewal cron job on Amazon Linux.
232
- *
233
- * Amazon Linux is RHEL-based and uses "crond" as the service name.
234
- * Uses dnf or yum for package management.
235
- *
236
- * @param {string[]} args - Command line arguments (unused)
237
- * @returns {Promise<void>}
238
- */
239
- async function do_certbot_crontab_init_amazon_linux(args) {
240
- await setupCronJobLinux('crond');
241
- }
242
-
243
- /**
244
- * Common Linux implementation for setting up the certbot cron job.
245
- * Handles both Debian-based (cron) and RHEL-based (crond) systems.
246
- *
247
- * @param {string} cronServiceName - The name of the cron service ('cron' or 'crond')
248
- * @returns {Promise<void>}
249
- */
250
- async function setupCronJobLinux(cronServiceName) {
251
- // Check if certbot is installed
252
- if (!isCommandAvailable('certbot')) {
253
- console.error('Error: certbot is not installed.');
254
- console.error('');
255
- if (cronServiceName === 'cron') {
256
- console.error('Install it with: sudo apt install certbot python3-certbot-nginx');
257
- } else {
258
- console.error('Install it with: sudo dnf install certbot python3-certbot-nginx');
259
- console.error(' or: sudo yum install certbot python3-certbot-nginx');
260
- }
261
- process.exit(1);
262
- }
263
-
264
- // Check if crontab command is available
265
- if (!isCommandAvailable('crontab')) {
266
- console.error('Error: crontab command not found.');
267
- console.error('');
268
- if (cronServiceName === 'cron') {
269
- console.error('Install it with: sudo apt install cron');
270
- } else {
271
- console.error('Install it with: sudo dnf install cronie');
272
- console.error(' or: sudo yum install cronie');
273
- }
274
- process.exit(1);
275
- }
276
-
277
- // Check if systemctl is available (for service management)
278
- const hasSystemctl = isCommandAvailable('systemctl');
279
-
280
- console.log('Checking cron service status...');
281
-
282
- // Check if cron service is running
283
- let cronRunning = false;
284
- if (hasSystemctl) {
285
- cronRunning = runCommand(`systemctl is-active --quiet ${cronServiceName}`);
286
- }
287
-
288
- if (!cronRunning && hasSystemctl) {
289
- console.log(`Cron service (${cronServiceName}) is not running.`);
290
- console.log('Attempting to start and enable cron service...');
291
- console.log('');
292
- console.log('This requires sudo access to manage the cron service.');
293
-
294
- // Try to start the cron service
295
- const startCmd = `sudo systemctl start ${cronServiceName}`;
296
- const enableCmd = `sudo systemctl enable ${cronServiceName}`;
297
-
298
- if (runCommand(startCmd, { stdio: 'inherit' }) &&
299
- runCommand(enableCmd, { stdio: 'inherit' })) {
300
- console.log('Cron service started and enabled successfully.');
301
- } else {
302
- console.error('Failed to start cron service.');
303
- console.error(`Please start the cron service manually: sudo systemctl start ${cronServiceName}`);
304
- process.exit(1);
305
- }
306
- } else if (hasSystemctl) {
307
- console.log(`Cron service (${cronServiceName}) is running.`);
308
- } else {
309
- console.log('Note: systemctl not available. Assuming cron is managed differently on this system.');
310
- }
311
-
312
- console.log('');
313
- console.log('Checking for existing certbot renewal cron job...');
314
-
315
- // Get current crontab
316
- const { success: hasCrontab, output: currentCrontab } = runCommandWithOutput('crontab -l 2>/dev/null');
317
-
318
- // Check if the certbot renewal line already exists
319
- if (hasCrontab && currentCrontab.includes('/usr/bin/certbot renew --quiet')) {
320
- console.log('Certbot renewal cron job already exists.');
321
- console.log('');
322
- console.log('Current crontab entries containing "certbot":');
323
- const certbotLines = currentCrontab.split('\n').filter(line => line.includes('certbot'));
324
- certbotLines.forEach(line => console.log(` ${line}`));
325
- return;
326
- }
327
-
328
- console.log('Adding certbot renewal cron job...');
329
-
330
- // Build new crontab content
331
- const newCrontab = hasCrontab && currentCrontab
332
- ? `${currentCrontab}\n${CRON_LINE}`
333
- : CRON_LINE;
334
-
335
- try {
336
- // Write new crontab via pipe to crontab -
337
- const result = spawnSync('crontab', ['-'], {
338
- input: newCrontab + '\n',
339
- encoding: 'utf8',
340
- stdio: ['pipe', 'pipe', 'pipe']
341
- });
342
-
343
- if (result.status !== 0) {
344
- throw new Error(result.stderr || 'Failed to update crontab');
345
- }
346
-
347
- console.log('');
348
- console.log('Certbot renewal cron job added successfully!');
349
- console.log(`Added: ${CRON_LINE}`);
350
- console.log('');
351
- console.log('This will automatically renew SSL certificates daily at 12:00 PM.');
352
- console.log('You can view your current crontab with: crontab -l');
353
- } catch (error) {
354
- console.error('Failed to add certbot renewal cron job.');
355
- console.error(error.message);
356
- process.exit(1);
357
- }
358
- }
359
-
360
- /**
361
- * Add certbot renewal scheduled task on Windows Command Prompt.
362
- *
363
- * Windows uses Task Scheduler instead of cron. However, certbot on Windows
364
- * typically sets up its own scheduled task during installation.
365
- *
366
- * This script is primarily designed for Linux servers where certbot is commonly
367
- * used with nginx. Windows is not a typical deployment target for this use case.
368
- *
369
- * @param {string[]} args - Command line arguments (unused)
370
- * @returns {Promise<void>}
371
- */
372
- async function do_certbot_crontab_init_cmd(args) {
373
- console.log('certbot-crontab-init is designed for Linux servers.');
374
- console.log('');
375
- console.log('Windows uses Task Scheduler instead of cron.');
376
- console.log('If you installed certbot on Windows, it should have');
377
- console.log('automatically set up a scheduled task for renewal.');
378
- console.log('');
379
- console.log('To check your scheduled tasks:');
380
- console.log(' schtasks /query /tn "Certbot Renew Task"');
381
- console.log('');
382
- console.log('To manually create a renewal task:');
383
- console.log(' schtasks /create /tn "Certbot Renew" /tr "certbot renew" /sc daily /st 12:00');
384
- }
385
-
386
- /**
387
- * Add certbot renewal scheduled task on Windows PowerShell.
388
- *
389
- * @param {string[]} args - Command line arguments (unused)
390
- * @returns {Promise<void>}
391
- */
392
- async function do_certbot_crontab_init_powershell(args) {
393
- console.log('certbot-crontab-init is designed for Linux servers.');
394
- console.log('');
395
- console.log('Windows uses Task Scheduler instead of cron.');
396
- console.log('If you installed certbot on Windows, it should have');
397
- console.log('automatically set up a scheduled task for renewal.');
398
- console.log('');
399
- console.log('To check your scheduled tasks in PowerShell:');
400
- console.log(' Get-ScheduledTask -TaskName "*Certbot*"');
401
- console.log('');
402
- console.log('To manually create a renewal task:');
403
- console.log(' $action = New-ScheduledTaskAction -Execute "certbot" -Argument "renew"');
404
- console.log(' $trigger = New-ScheduledTaskTrigger -Daily -At 12:00PM');
405
- console.log(' Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "Certbot Renew"');
406
- }
407
-
408
- /**
409
- * Add certbot renewal cron job from Git Bash on Windows.
410
- *
411
- * Git Bash runs on Windows, which doesn't have a native cron.
412
- * This provides guidance on using Windows Task Scheduler instead.
413
- *
414
- * @param {string[]} args - Command line arguments (unused)
415
- * @returns {Promise<void>}
416
- */
417
- async function do_certbot_crontab_init_gitbash(args) {
418
- console.log('certbot-crontab-init is designed for Linux servers.');
419
- console.log('');
420
- console.log('Git Bash runs on Windows, which uses Task Scheduler instead of cron.');
421
- console.log('If you installed certbot on Windows, it should have');
422
- console.log('automatically set up a scheduled task for renewal.');
423
- console.log('');
424
- console.log('To check your scheduled tasks:');
425
- console.log(' schtasks.exe /query /tn "Certbot Renew Task"');
426
- console.log('');
427
- console.log('To manually create a renewal task:');
428
- console.log(' schtasks.exe /create /tn "Certbot Renew" /tr "certbot renew" /sc daily /st 12:00');
429
- }
430
-
431
- /**
432
- * Main entry point - detects environment and executes appropriate implementation.
433
- *
434
- * This script sets up automatic SSL certificate renewal using certbot.
435
- * It creates a cron job (or equivalent scheduled task) that runs daily
436
- * at 12:00 PM to renew any SSL certificates that are nearing expiration.
437
- *
438
- * SSL certificates from Let's Encrypt expire every 90 days. Certbot only
439
- * renews certificates that are within 30 days of expiration, so running
440
- * daily is safe and ensures certificates are always renewed in time.
441
- *
442
- * The script is idempotent - running it multiple times will not create
443
- * duplicate cron entries.
444
- *
445
- * @param {string[]} args - Command line arguments (unused)
446
- * @returns {Promise<void>}
447
- */
448
- async function do_certbot_crontab_init(args) {
449
- const platform = os.detect();
450
-
451
- const handlers = {
452
- 'macos': do_certbot_crontab_init_macos,
453
- 'ubuntu': do_certbot_crontab_init_ubuntu,
454
- 'debian': do_certbot_crontab_init_ubuntu,
455
- 'raspbian': do_certbot_crontab_init_raspbian,
456
- 'amazon_linux': do_certbot_crontab_init_amazon_linux,
457
- 'rhel': do_certbot_crontab_init_amazon_linux,
458
- 'fedora': do_certbot_crontab_init_ubuntu, // Fedora uses 'crond' but same approach
459
- 'linux': do_certbot_crontab_init_ubuntu,
460
- 'wsl': do_certbot_crontab_init_ubuntu,
461
- 'cmd': do_certbot_crontab_init_cmd,
462
- 'windows': do_certbot_crontab_init_cmd,
463
- 'powershell': do_certbot_crontab_init_powershell,
464
- 'gitbash': do_certbot_crontab_init_gitbash
465
- };
466
-
467
- // Fedora uses 'crond' like RHEL-based systems
468
- if (platform.type === 'fedora') {
469
- await setupCronJobLinux('crond');
470
- return;
471
- }
472
-
473
- const handler = handlers[platform.type];
474
- if (!handler) {
475
- console.error(`Platform '${platform.type}' is not supported for this command.`);
476
- console.error('');
477
- console.error('This script is designed for Linux servers running nginx with certbot.');
478
- console.error('Supported platforms:');
479
- console.error(' - Ubuntu, Debian, and other Debian-based distributions');
480
- console.error(' - Amazon Linux, RHEL, Fedora, and other RHEL-based distributions');
481
- console.error(' - Raspberry Pi OS');
482
- console.error(' - macOS (limited support)');
483
- process.exit(1);
484
- }
485
-
486
- await handler(args);
487
- }
488
-
489
- module.exports = {
490
- main: do_certbot_crontab_init,
491
- do_certbot_crontab_init,
492
- do_certbot_crontab_init_nodejs,
493
- do_certbot_crontab_init_macos,
494
- do_certbot_crontab_init_ubuntu,
495
- do_certbot_crontab_init_raspbian,
496
- do_certbot_crontab_init_amazon_linux,
497
- do_certbot_crontab_init_cmd,
498
- do_certbot_crontab_init_powershell,
499
- do_certbot_crontab_init_gitbash
500
- };
501
-
502
- if (require.main === module) {
503
- do_certbot_crontab_init(process.argv.slice(2));
504
- }