Files
webmin/usermin/change_log.cgi
Ilia Ross 6183a4006a Add an option to rotate Miniserv logs using logrotate
This PR adds the ability for the logging pages to hand the Miniserv access and error logs, and the Webmin actions log, to logrotate instead of having Miniserv periodically delete them. The generated section uses copy-truncate rotation, since Miniserv only reopens its error log when the file disappears.

The option only appears when the Log File Rotation module is available and configured correctly.
2026-08-22 01:03:48 +02:00

66 lines
2.2 KiB
Perl
Executable File

#!/usr/local/bin/perl
# Save Usermin webserver logging options
require './usermin-lib.pl';
&ReadParse();
$access{'log'} || &error($text{'acl_ecannot'});
&error_setup($text{'log_err'});
&get_usermin_miniserv_config(\%miniserv);
# Only a change of error destination on a systemd-managed service needs the
# drop-in and a full restart; otherwise the option is ignored.
my $journal_changed = defined($in{'error_journal'}) &&
&webmin::miniserv_systemd_journal_available("usermin.service") &&
($miniserv{'errorlog'} eq '-' ? 1 : 0) != ($in{'error_journal'} ? 1 : 0);
# Either Miniserv clears the logs itself, or logrotate takes them over. There
# is no setting for the latter, so it is on when clearing is off and a section
# already rotates the logs.
my $logrotate = $in{'logclear'} == 2 ? 1 : 0;
!$logrotate || &webmin::miniserv_logrotate_available() ||
&error($text{'log_elogrotate'});
my $was_logrotate = !int($miniserv{'logclear'}) &&
&webmin::miniserv_logrotate_available() &&
&webmin::get_miniserv_logrotate_section(\%miniserv) ? 1 : 0;
# Validate and save the access-log settings.
$miniserv{'log'} = $in{'log'};
$miniserv{'loghost'} = $in{'loghost'};
$miniserv{'logtrust'} = $in{'logtrust'};
$miniserv{'logclf'} = $in{'logclf'};
$miniserv{'logclear'} = $logrotate ? 0 : $in{'logclear'};
!$miniserv{'logclear'} || $in{'logtime'} =~ /^[1-9][0-9]*$/ ||
&error(&text('log_ehours', $in{'logtime'}));
$miniserv{'logtime'} = $in{'logtime'};
# Save the error destination and matching systemd drop-in when supported.
&lock_file($usermin_miniserv_config);
if ($journal_changed) {
&webmin::set_miniserv_error_destination(\%miniserv,
$usermin_miniserv_config, "usermin.service",
$in{'error_journal'});
}
else {
&put_usermin_miniserv_config(\%miniserv);
}
&unlock_file($usermin_miniserv_config);
# Hand the Miniserv logs to logrotate, or take them back from it
if ($logrotate) {
&webmin::setup_miniserv_logrotate(\%miniserv, "usermin");
}
elsif ($was_logrotate) {
&webmin::remove_miniserv_logrotate(\%miniserv);
}
# Restart through systemd when stderr needs to be re-attached.
if ($journal_changed) {
&webmin::restart_miniserv_systemd_service("usermin.service", 2);
}
else {
&restart_usermin_miniserv();
}
&webmin_log("log");
&redirect("");