Merge pull request #2752 from webmin/dev/fix-broken-renewals
Some checks failed
Tests / prove (push) Has been cancelled
Build / build (push) Has been cancelled

Fix LE renewal to schedule by elapsed interval
This commit is contained in:
Jamie Cameron
2026-06-06 08:37:54 -07:00
committed by GitHub
2 changed files with 33 additions and 8 deletions

View File

@@ -132,7 +132,7 @@ else {
&save_renewal_only(\@doms, $webroot, $mode,
$size, $in{'subset'}, $in{'use'},
$in{'directory_url'},
$in{'eab_kid'}, $in{'eab_hmac'});
$in{'eab_kid'}, $in{'eab_hmac'}, 1);
# Copy cert, key and chain to Webmin
if ($in{'use'}) {
@@ -182,12 +182,12 @@ else {
}
# save_renewal_only(&doms, webroot, mode, size, subset-mode, used-by-webmin,
# directory-url, eab-kid, eab-hmac)
# directory-url, eab-kid, eab-hmac, [reset-renewal-time])
# Save for future renewals
sub save_renewal_only
{
my ($doms, $webroot, $mode, $size, $subset, $usewebmin, $directory_url,
$eab_kid, $eab_hmac) = @_;
$eab_kid, $eab_hmac, $reset_renewal_time) = @_;
$config{'letsencrypt_doms'} = join(" ", @$doms);
$config{'letsencrypt_webroot'} = $webroot;
$config{'letsencrypt_mode'} = $mode;
@@ -219,14 +219,24 @@ if (&foreign_check("webmincron")) {
&webmincron::delete_webmin_cron($job) if ($job);
}
else {
my @tm = localtime(time() - 60);
# A manual cert request does not update Webmin cron's last-run
# state, so re-create the job to start the elapsed renewal
# interval from now instead of immediately running an overdue
# job with the old ID
if ($job && $reset_renewal_time) {
&webmincron::delete_webmin_cron($job);
$job = undef;
}
$job ||= { 'module' => $module_name,
'func' => 'renew_letsencrypt_cert' };
$job->{'mins'} ||= $tm[1];
$job->{'hours'} ||= $tm[2];
$job->{'days'} ||= $tm[3];
# Scheduling is driven by 'interval' (elapsed seconds); 'months'
# is retained only so edit_ssl.cgi can show the renewal interval
$job->{'mins'} = '';
$job->{'hours'} = '';
$job->{'days'} = '';
$job->{'months'} = '*/'.$in{'renew'};
$job->{'weekdays'} = '*';
$job->{'weekdays'} = '';
$job->{'interval'} = $in{'renew'}*30*24*60*60;
&webmincron::create_webmin_cron($job);
}
}

View File

@@ -34,6 +34,21 @@ elsif ($miniserv{'cipher_list_def'} == 2 || $miniserv{'cipher_list_def'} == 3) {
$strong_ssl_ciphers : $pfs_ssl_ciphers;
}
# Convert old Let's Encrypt renewal schedules to elapsed interval timers
if (&foreign_check("webmincron")) {
my $job = &find_letsencrypt_cron_job();
if ($job && !$job->{'interval'} &&
$job->{'months'} =~ /^\*\/([1-9][0-9]*)$/) {
my $renew = $1;
$job->{'mins'} = '';
$job->{'hours'} = '';
$job->{'days'} = '';
$job->{'weekdays'} = '';
$job->{'interval'} = $renew*30*24*60*60;
&webmincron::save_webmin_cron($job);
}
}
# If this is the first install, enable recording of logins by default
if (!-r $first_install_file || $miniserv{'login_script'} eq $record_login_cmd) {
&foreign_require("cron");