@fredlackey/devutils 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/package.json +1 -1
- package/src/commands/install.js +374 -36
- package/src/installs/adobe-creative-cloud.js +527 -25
- package/src/installs/adobe-creative-cloud.md +605 -0
- package/src/installs/appcleaner.js +303 -26
- package/src/installs/appcleaner.md +699 -0
- package/src/installs/apt-transport-https.js +390 -0
- package/src/installs/apt-transport-https.md +678 -0
- package/src/installs/atomicparsley.js +624 -26
- package/src/installs/atomicparsley.md +795 -0
- package/src/installs/aws-cli.js +779 -26
- package/src/installs/aws-cli.md +727 -0
- package/src/installs/balena-etcher.js +688 -26
- package/src/installs/balena-etcher.md +761 -0
- package/src/installs/bambu-studio.js +912 -26
- package/src/installs/bambu-studio.md +780 -0
- package/src/installs/bash-completion.js +554 -23
- package/src/installs/bash-completion.md +833 -0
- package/src/installs/bash.js +399 -26
- package/src/installs/bash.md +993 -0
- package/src/installs/beyond-compare.js +585 -26
- package/src/installs/beyond-compare.md +813 -0
- package/src/installs/build-essential.js +511 -26
- package/src/installs/build-essential.md +977 -0
- package/src/installs/ca-certificates.js +618 -0
- package/src/installs/ca-certificates.md +937 -0
- package/src/installs/caffeine.js +490 -26
- package/src/installs/caffeine.md +839 -0
- package/src/installs/camtasia.js +577 -25
- package/src/installs/camtasia.md +762 -0
- package/src/installs/chatgpt.js +458 -26
- package/src/installs/chatgpt.md +814 -0
- package/src/installs/chocolatey.js +447 -0
- package/src/installs/chocolatey.md +661 -0
- package/src/installs/chrome-canary.js +472 -26
- package/src/installs/chrome-canary.md +641 -0
- package/src/installs/chromium.js +645 -26
- package/src/installs/chromium.md +838 -0
- package/src/installs/claude-code.js +558 -26
- package/src/installs/claude-code.md +1173 -0
- package/src/installs/curl.js +361 -26
- package/src/installs/curl.md +714 -0
- package/src/installs/cursor.js +561 -26
- package/src/installs/cursor.md +970 -0
- package/src/installs/dbschema.js +674 -26
- package/src/installs/dbschema.md +925 -0
- package/src/installs/dependencies.md +435 -0
- package/src/installs/development-tools.js +600 -0
- package/src/installs/development-tools.md +977 -0
- package/src/installs/docker.js +1010 -25
- package/src/installs/docker.md +1109 -0
- package/src/installs/drawio.js +1001 -26
- package/src/installs/drawio.md +795 -0
- package/src/installs/elmedia-player.js +328 -25
- package/src/installs/elmedia-player.md +556 -0
- package/src/installs/ffmpeg.js +870 -25
- package/src/installs/ffmpeg.md +852 -0
- package/src/installs/file.js +464 -0
- package/src/installs/file.md +987 -0
- package/src/installs/gemini-cli.js +793 -26
- package/src/installs/gemini-cli.md +1153 -0
- package/src/installs/git.js +382 -26
- package/src/installs/git.md +907 -0
- package/src/installs/gitego.js +931 -26
- package/src/installs/gitego.md +1172 -0
- package/src/installs/go.js +913 -26
- package/src/installs/go.md +958 -0
- package/src/installs/google-chrome.js +801 -25
- package/src/installs/google-chrome.md +862 -0
- package/src/installs/gpg.js +412 -73
- package/src/installs/gpg.md +1056 -0
- package/src/installs/homebrew.js +1015 -26
- package/src/installs/homebrew.md +988 -0
- package/src/installs/imageoptim.js +950 -26
- package/src/installs/imageoptim.md +1119 -0
- package/src/installs/installers.json +2297 -0
- package/src/installs/jq.js +382 -26
- package/src/installs/jq.md +809 -0
- package/src/installs/keyboard-maestro.js +701 -26
- package/src/installs/keyboard-maestro.md +825 -0
- package/src/installs/latex.js +771 -26
- package/src/installs/latex.md +1095 -0
- package/src/installs/lftp.js +338 -26
- package/src/installs/lftp.md +907 -0
- package/src/installs/lsb-release.js +346 -0
- package/src/installs/lsb-release.md +814 -0
- package/src/installs/messenger.js +829 -26
- package/src/installs/messenger.md +900 -0
- package/src/installs/microsoft-office.js +550 -26
- package/src/installs/microsoft-office.md +760 -0
- package/src/installs/microsoft-teams.js +782 -25
- package/src/installs/microsoft-teams.md +886 -0
- package/src/installs/node.js +886 -26
- package/src/installs/node.md +1153 -0
- package/src/installs/nordpass.js +698 -26
- package/src/installs/nordpass.md +921 -0
- package/src/installs/nvm.js +977 -26
- package/src/installs/nvm.md +1057 -0
- package/src/installs/openssh.js +734 -64
- package/src/installs/openssh.md +1056 -0
- package/src/installs/pandoc.js +644 -26
- package/src/installs/pandoc.md +1036 -0
- package/src/installs/pinentry.js +492 -26
- package/src/installs/pinentry.md +1142 -0
- package/src/installs/pngyu.js +851 -26
- package/src/installs/pngyu.md +896 -0
- package/src/installs/postman.js +781 -26
- package/src/installs/postman.md +940 -0
- package/src/installs/procps.js +425 -0
- package/src/installs/procps.md +851 -0
- package/src/installs/safari-tech-preview.js +355 -25
- package/src/installs/safari-tech-preview.md +533 -0
- package/src/installs/sfnt2woff.js +640 -26
- package/src/installs/sfnt2woff.md +795 -0
- package/src/installs/shellcheck.js +463 -26
- package/src/installs/shellcheck.md +1005 -0
- package/src/installs/slack.js +722 -25
- package/src/installs/slack.md +865 -0
- package/src/installs/snagit.js +566 -25
- package/src/installs/snagit.md +844 -0
- package/src/installs/software-properties-common.js +372 -0
- package/src/installs/software-properties-common.md +805 -0
- package/src/installs/spotify.js +858 -25
- package/src/installs/spotify.md +901 -0
- package/src/installs/studio-3t.js +803 -26
- package/src/installs/studio-3t.md +918 -0
- package/src/installs/sublime-text.js +780 -25
- package/src/installs/sublime-text.md +914 -0
- package/src/installs/superwhisper.js +687 -25
- package/src/installs/superwhisper.md +630 -0
- package/src/installs/tailscale.js +727 -26
- package/src/installs/tailscale.md +1100 -0
- package/src/installs/tar.js +389 -0
- package/src/installs/tar.md +946 -0
- package/src/installs/termius.js +780 -26
- package/src/installs/termius.md +844 -0
- package/src/installs/terraform.js +761 -26
- package/src/installs/terraform.md +899 -0
- package/src/installs/tidal.js +752 -25
- package/src/installs/tidal.md +864 -0
- package/src/installs/tmux.js +328 -26
- package/src/installs/tmux.md +1030 -0
- package/src/installs/tree.js +393 -26
- package/src/installs/tree.md +833 -0
- package/src/installs/unzip.js +460 -0
- package/src/installs/unzip.md +879 -0
- package/src/installs/vim.js +403 -26
- package/src/installs/vim.md +1040 -0
- package/src/installs/vlc.js +803 -26
- package/src/installs/vlc.md +927 -0
- package/src/installs/vscode.js +825 -26
- package/src/installs/vscode.md +1002 -0
- package/src/installs/wget.js +415 -0
- package/src/installs/wget.md +791 -0
- package/src/installs/whatsapp.js +710 -25
- package/src/installs/whatsapp.md +854 -0
- package/src/installs/winpty.js +352 -0
- package/src/installs/winpty.md +620 -0
- package/src/installs/woff2.js +535 -26
- package/src/installs/woff2.md +977 -0
- package/src/installs/wsl.js +572 -0
- package/src/installs/wsl.md +699 -0
- package/src/installs/xcode-clt.js +520 -0
- package/src/installs/xcode-clt.md +351 -0
- package/src/installs/xcode.js +542 -26
- package/src/installs/xcode.md +573 -0
- package/src/installs/yarn.js +806 -26
- package/src/installs/yarn.md +1074 -0
- package/src/installs/yq.js +636 -26
- package/src/installs/yq.md +944 -0
- package/src/installs/yt-dlp.js +683 -26
- package/src/installs/yt-dlp.md +946 -0
- package/src/installs/yum-utils.js +297 -0
- package/src/installs/yum-utils.md +648 -0
- package/src/installs/zoom.js +740 -25
- package/src/installs/zoom.md +884 -0
- package/src/scripts/README.md +567 -45
- package/src/scripts/STATUS.md +208 -0
- package/src/scripts/afk.js +395 -7
- package/src/scripts/backup-all.js +731 -9
- package/src/scripts/backup-source.js +711 -8
- package/src/scripts/brewd.js +373 -7
- package/src/scripts/brewi.js +505 -9
- package/src/scripts/brewr.js +512 -9
- package/src/scripts/brews.js +462 -9
- package/src/scripts/brewu.js +488 -7
- package/src/scripts/c.js +185 -7
- package/src/scripts/ccurl.js +325 -8
- package/src/scripts/certbot-crontab-init.js +488 -8
- package/src/scripts/certbot-init.js +641 -9
- package/src/scripts/ch.js +339 -7
- package/src/scripts/claude-danger.js +253 -8
- package/src/scripts/clean-dev.js +419 -8
- package/src/scripts/clear-dns-cache.js +525 -7
- package/src/scripts/clone.js +417 -7
- package/src/scripts/code-all.js +420 -7
- package/src/scripts/count-files.js +195 -8
- package/src/scripts/count-folders.js +195 -8
- package/src/scripts/count.js +248 -8
- package/src/scripts/d.js +203 -7
- package/src/scripts/datauri.js +373 -8
- package/src/scripts/delete-files.js +363 -7
- package/src/scripts/docker-clean.js +410 -8
- package/src/scripts/dp.js +426 -7
- package/src/scripts/e.js +375 -9
- package/src/scripts/empty-trash.js +497 -7
- package/src/scripts/evm.js +428 -9
- package/src/scripts/fetch-github-repos.js +441 -10
- package/src/scripts/get-channel.js +329 -8
- package/src/scripts/get-course.js +384 -11
- package/src/scripts/get-dependencies.js +290 -9
- package/src/scripts/get-folder.js +783 -10
- package/src/scripts/get-tunes.js +411 -10
- package/src/scripts/get-video.js +352 -9
- package/src/scripts/git-backup.js +561 -9
- package/src/scripts/git-clone.js +477 -9
- package/src/scripts/git-pup.js +303 -7
- package/src/scripts/git-push.js +380 -8
- package/src/scripts/h.js +607 -9
- package/src/scripts/hide-desktop-icons.js +483 -7
- package/src/scripts/hide-hidden-files.js +522 -7
- package/src/scripts/install-dependencies-from.js +440 -9
- package/src/scripts/ips.js +647 -10
- package/src/scripts/iso.js +354 -8
- package/src/scripts/killni.js +561 -7
- package/src/scripts/ll.js +451 -8
- package/src/scripts/local-ip.js +310 -8
- package/src/scripts/m.js +508 -8
- package/src/scripts/map.js +293 -8
- package/src/scripts/mkd.js +287 -7
- package/src/scripts/ncu-update-all.js +441 -8
- package/src/scripts/nginx-init.js +702 -12
- package/src/scripts/npmi.js +366 -7
- package/src/scripts/o.js +495 -8
- package/src/scripts/org-by-date.js +321 -7
- package/src/scripts/p.js +208 -7
- package/src/scripts/packages.js +313 -8
- package/src/scripts/path.js +209 -7
- package/src/scripts/ports.js +582 -8
- package/src/scripts/q.js +290 -8
- package/src/scripts/refresh-files.js +378 -10
- package/src/scripts/remove-smaller-files.js +500 -8
- package/src/scripts/rename-files-with-date.js +517 -9
- package/src/scripts/resize-image.js +523 -9
- package/src/scripts/rm-safe.js +653 -8
- package/src/scripts/s.js +525 -9
- package/src/scripts/set-git-public.js +349 -7
- package/src/scripts/show-desktop-icons.js +459 -7
- package/src/scripts/show-hidden-files.js +456 -7
- package/src/scripts/tpa.js +265 -8
- package/src/scripts/tpo.js +264 -7
- package/src/scripts/u.js +489 -7
- package/src/scripts/vpush.js +422 -8
- package/src/scripts/y.js +267 -7
- package/src/utils/common/os.js +94 -2
- package/src/utils/ubuntu/apt.js +13 -7
- package/src/utils/windows/choco.js +82 -26
- package/src/utils/windows/winget.js +89 -27
|
@@ -1,24 +1,504 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
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
|
+
*
|
|
5
34
|
* @module scripts/certbot-crontab-init
|
|
6
35
|
*/
|
|
7
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
|
+
|
|
8
431
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
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.
|
|
12
444
|
*
|
|
13
445
|
* @param {string[]} args - Command line arguments (unused)
|
|
14
446
|
* @returns {Promise<void>}
|
|
15
447
|
*/
|
|
16
|
-
async function
|
|
17
|
-
|
|
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);
|
|
18
487
|
}
|
|
19
488
|
|
|
20
|
-
module.exports = {
|
|
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
|
+
};
|
|
21
501
|
|
|
22
502
|
if (require.main === module) {
|
|
23
|
-
|
|
503
|
+
do_certbot_crontab_init(process.argv.slice(2));
|
|
24
504
|
}
|