Compare commits

..

23 Commits
2.401 ... 2.402

Author SHA1 Message Date
Jamie Cameron
01867c86e0 new version bump 2025-06-16 21:09:27 -07:00
Ilia Ross
008890dfa1 Update changelog 2025-06-16 20:52:29 +03:00
Ilia Ross
5d846e80b2 Fix to use new API to properly resolve default value
55d03d426a (commitcomment-159889070)
2025-06-15 23:54:37 +03:00
Jamie Cameron
ce6bbe44ff Factor out code to create the site file, and add a function to force a re-gen 2025-06-15 08:24:17 -07:00
Ilia Ross
3bc15788af Fix warnings 2025-06-15 14:52:29 +03:00
Jamie Cameron
faa5dddb0a Merge branch 'master' of github.com:webmin/webmin 2025-06-12 09:57:24 -07:00
Jamie Cameron
55d03d426a Add option for SMTPUTF8 2025-06-12 09:57:16 -07:00
Ilia Ross
da9aa22fa7 Fix not to rely on which, or the scriptlets will fail on EL 10 systems 2025-06-12 19:17:50 +03:00
Ilia Ross
06ce137903 Fix to consider path separator as config init may never be run 2025-06-12 01:57:35 +03:00
Ilia Ross
5462c3bbf8 Fix to use API to check for command 2025-06-12 01:52:48 +03:00
Ilia Ross
bae4af7490 Fix not to depend on the path 2025-06-11 23:53:32 +03:00
Ilia Ross
bfd2bfbc11 Update changelog for 2.402 2025-06-09 00:46:51 +03:00
Ilia Ross
8de7fde8bb Fix license 2025-06-08 21:03:36 +03:00
Ilia Ross
e5e8cde28e Fix support for old RPM module name prefixes 2025-06-08 18:02:12 +03:00
Ilia Ross
09d0b26aea Add module list flag support when building modules 2025-06-06 22:41:05 +03:00
Ilia Ross
87ba4dd181 Add minimal list of modules in a separate file 2025-06-05 23:47:48 +03:00
Ilia Ross
282b28da5e Fix to use new file names for modes 2025-06-05 23:38:46 +03:00
Ilia Ross
d519c4099f Add missing "webmincron" module to the core 2025-06-05 03:23:48 +03:00
Ilia Ross
0be73ac433 Add missing "servers" module to the core 2025-06-05 03:07:17 +03:00
Ilia Ross
b0c029887f Add missing modules for core 2025-06-05 03:02:37 +03:00
Ilia Ross
ce16f80848 Add support for building on given list of modules 2025-06-05 02:56:18 +03:00
Ilia Ross
cc407bc1c3 Fix to sort alphabetically default modules list 2025-06-05 00:28:05 +03:00
Ilia Ross
8e5633d9af Fix provides 2025-06-04 23:01:08 +03:00
19 changed files with 173 additions and 124 deletions

View File

@@ -1,5 +1,9 @@
## Changelog
#### 2.402 (June 16, 2025)
* Update the Authentic theme to the latest version with various fixes and improvements
* Fix support for EL10-based systems
#### 2.401 (June 2, 2025)
* Add forgotten password recovery support for Virtualmin mailbox users
* Add forgotten password recovery support in Usermin

View File

@@ -26,82 +26,94 @@ $last_restart_time_flag = $module_var_directory."/restart-flag";
# if the Apache binary changes, when Webmin is upgraded, or once every five
# minutes if automatic rebuilding is enabled.
if ($module_name ne 'htaccess') {
local %oldsite;
local $httpd = &find_httpd();
local @st = stat($httpd);
&read_file($site_file, \%oldsite);
local @sst = stat($site_file);
if ($oldsite{'path'} ne $httpd ||
$oldsite{'size'} != $st[7] ||
$oldsite{'webmin'} != &get_webmin_version() ||
$config{'auto_mods'} && $sst[9] < time()-5*60) {
# Need to build list of supported modules
local ($ver, $mods, $fullver) = &httpd_info($httpd);
if ($ver) {
my @allmods = &available_modules();
local @mods = map { "$_/$ver" }
&configurable_modules(\@allmods);
foreach my $m (@mods) {
if ($m =~ /(\S+)\/(\S+)/) {
$httpd_modules{$1} = $2;
}
}
# Call again now that known modules have been set, as
# sometimes there are dependencies due to LoadModule
# statements in an IfModule block
undef(@get_config_cache);
@allmods = &available_modules();
@mods = map { "$_/$ver" }
&configurable_modules(\@allmods);
local %site = ( 'size' => $st[7],
'path' => $httpd,
'modules' => join(' ', @mods),
'allmodules' => join(' ', @allmods),
'version' => $ver,
'fullversion' => $fullver,
'webmin' => &get_webmin_version() );
&lock_file($site_file);
&write_file($site_file, \%site);
chmod(0644, $site_file);
&unlock_file($site_file);
}
}
}
# Read the site-specific setup file, then require in all the module-specific
# .pl files
if (&read_file($site_file, \%site)) {
local($m, $f, $d);
$httpd_size = $site{'size'};
foreach $m (split(/\s+/, $site{'modules'})) {
if ($m =~ /(\S+)\/(\S+)/) {
$httpd_modules{$1} = $2;
}
}
foreach $m (split(/\s+/, $site{'allmodules'})) {
$all_httpd_modules{$m} = $site{'version'};
}
foreach $m (keys %httpd_modules) {
if (!-r "$module_root_directory/$m.pl") {
delete($httpd_modules{$m});
}
}
foreach $f (split(/\s+/, $site{'htaccess'})) {
if (-r $f) { push(@htaccess_files, $f); }
}
foreach $m (keys %httpd_modules) {
do "$m.pl";
}
foreach $d (split(/\s+/, $site{'defines'})) {
$httpd_defines{$d}++;
}
&create_site_file();
}
&read_site_file();
$apache_docbase = $config{'apache_docbase'} ? $config{'apache_docbase'} :
$httpd_modules{'core'} >= 2.0 ?
"http://httpd.apache.org/docs-2.0/mod/" :
"http://httpd.apache.org/docs/mod/";
# create_site_file()
# If the Apache binary or Webmin version has changed, create the site
# file containing all known Apache modules
sub create_site_file
{
my %oldsite;
my $httpd = &find_httpd();
my @st = stat($httpd);
&read_file($site_file, \%oldsite);
my @sst = stat($site_file);
if ($oldsite{'path'} ne $httpd ||
$oldsite{'size'} != $st[7] ||
$oldsite{'webmin'} != &get_webmin_version() ||
$config{'auto_mods'} && $sst[9] < time()-5*60) {
# Need to build list of supported modules
my ($ver, $mods, $fullver) = &httpd_info($httpd);
if ($ver) {
my @allmods = &available_modules();
my @mods = map { "$_/$ver" }
&configurable_modules(\@allmods);
foreach my $m (@mods) {
if ($m =~ /(\S+)\/(\S+)/) {
$httpd_modules{$1} = $2;
}
}
# Call again now that known modules have been set, as
# sometimes there are dependencies due to LoadModule
# statements in an IfModule block
undef(@get_config_cache);
@allmods = &available_modules();
@mods = map { "$_/$ver" }
&configurable_modules(\@allmods);
my %site = ( 'size' => $st[7],
'path' => $httpd,
'modules' => join(' ', @mods),
'allmodules' => join(' ', @allmods),
'version' => $ver,
'fullversion' => $fullver,
'webmin' => &get_webmin_version() );
&lock_file($site_file);
&write_file($site_file, \%site);
chmod(0644, $site_file);
&unlock_file($site_file);
}
}
}
# read_site_file()
# Read the site-specific setup file, then require in all the module-specific
# .pl files
sub read_site_file
{
if (&read_file($site_file, \%site)) {
foreach my $m (split(/\s+/, $site{'modules'})) {
if ($m =~ /(\S+)\/(\S+)/) {
$httpd_modules{$1} = $2;
}
}
foreach my $m (split(/\s+/, $site{'allmodules'})) {
$all_httpd_modules{$m} = $site{'version'};
}
foreach my $m (keys %httpd_modules) {
if (!-r "$module_root_directory/$m.pl") {
delete($httpd_modules{$m});
}
}
foreach my $f (split(/\s+/, $site{'htaccess'})) {
if (-r $f) { push(@htaccess_files, $f); }
}
foreach my $m (keys %httpd_modules) {
do "$m.pl";
}
foreach my $d (split(/\s+/, $site{'defines'})) {
$httpd_defines{$d}++;
}
}
}
# parse_config_file(handle, lines, file, [recursive])
# Parses lines of text from some config file into a data structure. The
# return value is an array of references, one for each directive in the file.
@@ -2274,5 +2286,15 @@ sub format_config_allowed
return $config{'format_config'};
}
# clear_apache_modules_cache()
# If new Apache modules were enabled, force re-gen of the site file
# that contains the modules cache
sub clear_apache_modules_cache
{
&unlink_file($site_file);
&create_site_file();
&read_site_file();
}
1;

View File

@@ -23,7 +23,7 @@ foreach $m (@mods) {
}
# Force re-detection of modules
unlink($site_file);
&clear_apache_modules_cache();
# Force restart Apache
if ($changed && &is_apache_running()) {

View File

@@ -64,7 +64,7 @@ sub run
};
root($o->{'config'}, \&$conf_check);
my $service = ($o->{'config'} =~ /usermin/ ? 'usermin' : 'webmin');
my $systemctlcmd = `which systemctl`;
my $systemctlcmd = &has_command('systemctl');
$systemctlcmd =~ s/\s+$//;
if ($o->{'cmd'} =~ /^(start|stop|restart|reload)$/) {
my $rs = system("$o->{'config'}/$o->{'cmd'} $service");

View File

@@ -95,8 +95,10 @@ sub main {
undef, 1, undef, undef, 5);
if ($latest_known_versions_remote &&
!$latest_known_versions_remote_error) {
%versions_remote = map{split /=/, $_}
(split(/\n/, $latest_known_versions_remote));
%versions_remote = map {
my ($k, $v) = split(/=/, $_, 2);
defined($v) ? ($k => $v) : ();
} split(/\n/, $latest_known_versions_remote);
} elsif ($latest_known_versions_remote_error) {
say BRIGHT_YELLOW, "Warning: ", RESET, "Cannot fetch remote packages versions list - $latest_known_versions_remote_error";
}

View File

@@ -1,34 +1,28 @@
#!/usr/local/bin/perl
# Builds a tar.gz package of a specified Webmin version
if ($0 =~ /^(.*)\//) {
chdir($1);
}
@ARGV == 1 || @ARGV == 2 || @ARGV == 3 || usage();
if ($ARGV[0] eq "-minimal" || $ARGV[0] eq "--minimal") {
$min++;
shift(@ARGV);
}
if ($ARGV[0] =~ /^--exclude-modules/) {
$exclude_modules = $ARGV[0];
shift(@ARGV);
}
if ($ARGV[0] =~ /^--product-type/) {
$product_type = $ARGV[0];
$product_type =~ s/--product-type=//;
if ($product_type =~ /^(minimal|essential)$/) {
$product_suff = "-$product_type";
$product_pref = "$product_type-";
# Parse command line options
$mod_list = 'full';
@ARGV = map { /^--\S+\s+/ ? split(/\s+/, $_) : $_ } @ARGV;
while (@ARGV && $ARGV[0] =~ /^--?/) {
my $opt = shift(@ARGV);
if ($opt eq '--minimal' || $opt eq '-minimal') {
$min = 1;
next;
}
shift(@ARGV);
if ($opt eq '--mod-list') {
$mod_list = shift(@ARGV) // usage();
next;
}
usage();
}
@ARGV == 1 || usage();
$fullvers = $ARGV[0];
$fullvers =~ /^([0-9\.]+)(\-(\d+))?$/ || usage();
$vers = $1;
$release = $3;
$tardir = $min ? "minimal" : "tarballs";
$vfile = $product_pref ? "$product_pref$fullvers" : $min ? "$fullvers-minimal" : $fullvers;
$zipdir = "zips";
$fullvers =~ /^([0-9\.]+)(?:-(\d+))?$/ || usage();
($vers, $release) = ($1, $2);
$tardir = $min ? 'minimal' : 'tarballs';
$vfile = $min ? "$fullvers-minimal" : $fullvers;
$zipdir = 'zips';
$vers || usage();
@files = ("config.cgi", "config-*-linux",
@@ -70,20 +64,15 @@ if ($min) {
}
else {
# All the modules
my $mod_def_list;
my $mods_list;
my $curr_dir = $0;
($curr_dir) = $curr_dir =~ /^(.+)\/[^\/]+$/;
$curr_dir = "." if ($curr_dir !~ /^\//);
open(my $fh, '<', "$curr_dir/mod_def_list.txt") || die "Error opening \"mod_def_list.txt\" : $!\n";
$mod_def_list = do { local $/; <$fh> };
open(my $fh, '<', "$curr_dir/mod_${mod_list}_list.txt") ||
die "Error opening \"mod_${mod_list}_list.txt\" : $!\n";
$mods_list = do { local $/; <$fh> };
close($fh);
@mlist = split(/\s+/, $mod_def_list);
if ($exclude_modules) {
$exclude_modules =~ s/--exclude-modules=//;
my @mlist_excluded =
grep { my $f = $_; ! grep $_ eq $f, split(',', $exclude_modules) } @mlist;
@mlist = @mlist_excluded;
}
@mlist = split(/\s+/, $mods_list);
}
# Build EOL data
@@ -296,6 +285,6 @@ close(ARFILE);
sub usage
{
die "usage: makedist.pl [-minimal] [--exclude-modules] <version>";
die "Usage: $0 [--minimal] [--mod-list type] <version>\n";
}

View File

@@ -29,6 +29,8 @@ my ($force_theme, $url, $upstream, $debdepends, $debrecommends,
$no_prefix, $force_usermin, $release, $allow_overwrite, $final_mod,
$dsc_file, $dir, $ver, @exclude);
my $mod_list = 'full';
while(@ARGV) {
my $a = shift(@ARGV);
if ($a eq "--deb-depends") {
@@ -79,6 +81,9 @@ while(@ARGV) {
elsif ($a eq "--exclude") {
push(@exclude, shift(@ARGV));
}
elsif ($a eq "--mod-list") {
$mod_list = shift(@ARGV);
}
elsif ($a =~ /^\-\-/) {
print STDERR "Unknown option $a\n";
exit(1);
@@ -113,6 +118,7 @@ if (!$dir) {
print " [--dsc-file file.dsc]\n";
print " [--force-theme]\n";
print " [--exclude file-or-dir]\n";
print " [--mod-list full|core|minimal]\n";
print RESET, "\n";
exit(1);
}
@@ -246,7 +252,7 @@ if ($debdepends && exists($minfo{'depends'})) {
my $curr_dir = $0;
($curr_dir) = $curr_dir =~ /^(.+)\/[^\/]+$/;
$curr_dir = "." if ($curr_dir !~ /^\//);
my $mod_def_file = "$curr_dir/mod_def_list.txt";
my $mod_def_file = "$curr_dir/mod_${mod_list}_list.txt";
next if (! -r $mod_def_file);
open(my $fh, '<', $mod_def_file) ||
die "Error opening \"$mod_def_file\" : $!\n";

View File

@@ -32,10 +32,12 @@ my $release = 1;
$ENV{'PATH'} = "/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin";
my $allow_overwrite = 0;
my ($force_theme, $rpmdepends, $rpmrecommends, $no_prefix, $set_prefix, $vendor,
$url, $force_usermin, $final_mod, $sign, $keyname,
my ($force_theme, $rpmdepends, $rpmrecommends, $no_prefix, $set_prefix,
$obsolete_wbm, $vendor, $url, $force_usermin, $final_mod, $sign, $keyname,
$epoch, $dir, $ver, @exclude);
my $mod_list = 'full';
# Parse command-line args
while(@ARGV) {
# XXX Untainting isn't needed when running as non-root?
@@ -52,6 +54,12 @@ while(@ARGV) {
elsif ($a eq "--no-prefix") {
$no_prefix = 1;
}
elsif ($a eq "--prefix") {
$set_prefix = &untaint(shift(@ARGV));
}
elsif ($a eq "--obsolete-wbm") {
$obsolete_wbm = 1;
}
elsif ($a eq "--licence" || $a eq "--license") {
$licence = &untaint(shift(@ARGV));
}
@@ -79,9 +87,6 @@ while(@ARGV) {
elsif ($a eq "--rpm-dir") {
$basedir = &untaint(shift(@ARGV));
}
elsif ($a eq "--prefix") {
$set_prefix = &untaint(shift(@ARGV));
}
elsif ($a eq "--vendor") {
$vendor = &untaint(shift(@ARGV));
}
@@ -97,6 +102,9 @@ while(@ARGV) {
elsif ($a eq "--exclude") {
push(@exclude, shift(@ARGV));
}
elsif ($a eq "--mod-list") {
$mod_list = shift(@ARGV);
}
elsif ($a =~ /^\-\-/) {
print STDERR "Unknown option $a\n";
exit(1);
@@ -121,6 +129,7 @@ if (!$dir) {
print " [--rpm-dir directory]\n";
print " [--no-prefix]\n";
print " [--prefix prefix]\n";
print " [--no-wbm-prefix]\n";
print " [--vendor name]\n";
print " [--licence name]\n";
print " [--url url]\n";
@@ -134,6 +143,7 @@ if (!$dir) {
print " [--sign]\n";
print " [--key keyname]\n";
print " [--exclude file]\n";
print " [--mod-list full|core|minimal]\n";
print RESET, "\n";
exit(1);
}
@@ -164,7 +174,8 @@ if (!-d $spec_dir || !-d $rpm_source_dir || !-d $rpm_dir) {
# Is this actually a module or theme directory?
-d $source_dir || die "$dir is not a directory";
my ($depends, $prefix, $desc, $prog, $iver, $istheme, $post_config);
my ($depends, $prefix, $prefix_auto, $desc, $prog, $iver,
$istheme, $post_config);
if ($minfo{'desc'}) {
$depends = join(" ", map { s/\/[0-9\.]+//; $_ }
grep { !/^[0-9\.]+$/ }
@@ -200,6 +211,7 @@ elsif ($tinfo{'desc'}) {
else {
die "$source_dir does not appear to be a webmin module or theme";
}
$prefix_auto = $prefix;
$prefix = "" if ($no_prefix);
$prefix = $set_prefix if ($set_prefix);
my $ucprog = ucfirst($prog);
@@ -267,7 +279,7 @@ if ($rpmdepends && defined($minfo{'depends'})) {
my $curr_dir = $0;
($curr_dir) = $curr_dir =~ /^(.+)\/[^\/]+$/;
$curr_dir = "." if ($curr_dir !~ /^\//);
my $mod_def_file = "$curr_dir/mod_def_list.txt";
my $mod_def_file = "$curr_dir/mod_${mod_list}_list.txt";
next if (! -r $mod_def_file);
open(my $fh, '<', $mod_def_file) ||
die "Error opening \"$mod_def_file\" : $!\n";
@@ -344,6 +356,12 @@ if (exists($minfo{'rpm_obsoletes'})) {
}
}
# Fix support for old module name prefixes
if ($obsolete_wbm) {
push(@rprovides, "$prefix_auto$mod");
push(@robsoletes, "$prefix_auto$mod");
}
# Create the SPEC file
my $vendorheader = $vendor ? "Vendor: $vendor" : "";
my $urlheader = $url ? "URL: $url" : "";
@@ -360,7 +378,7 @@ Summary: $desc
Name: $prefix$mod
Version: $ver
Release: $release
Requires: /bin/sh /usr/bin/perl /usr/libexec/$prog $rdeps
Requires: /bin/sh /usr/bin/perl $prog $rdeps
EOF
print $SPEC "Recommends: $rrecom\n" if ($rrecom);
print $SPEC "Suggests: " . join(" ", @rsuggests) . "\n" if (@rsuggests);

View File

@@ -90,7 +90,7 @@ Requires(pre): /usr/bin/perl
Requires: /bin/sh /usr/bin/perl perl(lib) perl(open) perl(Net::SSLeay) perl(Time::Local) perl(Data::Dumper) perl(File::Path) perl(File::Basename) perl(Digest::SHA) perl(Digest::MD5) openssl unzip tar gzip
Recommends: perl(DateTime) perl(DateTime::TimeZone) perl(DateTime::Locale) perl(Time::Piece) perl(Encode::Detect) perl(Time::HiRes) perl(Socket6) html2text shared-mime-info perl-File-Basename perl-File-Path perl-JSON-XS qrencode perl(DBI) perl(DBD::mysql)
AutoReq: 0
License: BSD-3-clause
License: BSD-3-Clause
Group: System/Tools
Source: http://www.webmin.com/download/$tarfile
Vendor: $rpm_maintainer

1
mod_core_list.txt Normal file
View File

@@ -0,0 +1 @@
acl apache authentic-theme backup-config bind8 change-user cron dovecot fail2ban fdisk filemin firewalld fsdump gray-theme htaccess-htpasswd init logrotate logviewer lvm mailboxes mailcap mount mysql net package-updates passwd phpini postfix proc procmail proftpd quota servers software spam sshd status system-status time updown useradmin usermin webmin webmincron webminlog xterm

View File

@@ -1 +0,0 @@
cron dfsadmin exports inetd init mount samba useradmin fdisk format proc webmin quota software pap acl apache lpadmin bind8 sendmail squid bsdexports hpuxexports net dhcpd custom servers time syslog mysql man inittab raid postfix webminlog postgresql xinetd status cpan pam nis shell fetchmail passwd at proftpd sshd heartbeat cluster-software cluster-useradmin qmailadmin stunnel usermin fsdump lvm procmail cluster-webmin firewall sgiexports openslp webalizer shorewall adsl-client updown ppp-client pptp-server pptp-client ipsec ldap-useradmin change-user cluster-shell cluster-cron spam htaccess-htpasswd logrotate cluster-passwd mailboxes ipfw sarg bandwidth cluster-copy backup-config smart-status idmapd krb5 smf ipfilter rbac tunnel zones cluster-usermin dovecot syslog-ng mailcap ldap-client phpini filter bacula-backup ldap-server exim tcpwrappers package-updates system-status webmincron shorewall6 iscsi-server iscsi-client gray-theme iscsi-target iscsi-tgtd bsdfdisk fail2ban authentic-theme firewalld filemin firewall6 logviewer xterm

1
mod_full_list.txt Normal file
View File

@@ -0,0 +1 @@
acl adsl-client apache at authentic-theme backup-config bacula-backup bandwidth bind8 bsdexports bsdfdisk change-user cluster-copy cluster-cron cluster-passwd cluster-shell cluster-software cluster-useradmin cluster-usermin cluster-webmin cpan cron custom dfsadmin dhcpd dovecot exim exports fail2ban fdisk fetchmail filemin filter firewall firewall6 firewalld format fsdump gray-theme heartbeat hpuxexports htaccess-htpasswd idmapd inetd init inittab ipfilter ipfw ipsec iscsi-client iscsi-server iscsi-target iscsi-tgtd krb5 ldap-client ldap-server ldap-useradmin logrotate logviewer lpadmin lvm mailboxes mailcap man mount mysql net nis openslp package-updates pam pap passwd phpini postfix postgresql ppp-client pptp-client pptp-server proc procmail proftpd qmailadmin quota raid rbac samba sarg sendmail servers sgiexports shell shorewall shorewall6 smart-status smf software spam squid sshd status stunnel syslog syslog-ng system-status tcpwrappers time tunnel updown useradmin usermin webalizer webmin webmincron webminlog xinetd xterm zones

1
mod_minimal_list.txt Normal file
View File

@@ -0,0 +1 @@
acl cron init inittab man proc servers system-status webmin webmincron webminlog

View File

@@ -868,6 +868,7 @@ opts_smtpd_tls_key_file=TLS private key file
opts_smtpd_tls_CAfile=TLS certificate authority file
opts_smtpd_use_tls=Enable TLS encryption?
opts_smtp_enforce_tls=Require TLS encryption?
opts_smtputf8_enable=Enable SMTPUTF8 support?
sasl_err=Failed to save SMTP authentication and encryption
sasl_ecert=Missing or invalid TLS certificate file
sasl_ekey=Missing or invalid TLS key file

View File

@@ -436,7 +436,7 @@ sub option_freefield
sub option_yesno
{
my $name = $_[0];
my $v = &get_current_value($name);
my $v = &resolve_current_value($name);
my $key = 'opts_'.$name;
print &ui_table_row(defined($_[1]) ? &hlink($text{$key}, "opt_".$name)

View File

@@ -100,6 +100,11 @@ if (&compare_version_numbers($postfix_version, 3.3) >= 0) {
&option_yesno("smtp_balance_inet_protocols");
}
# SMTPUTF8 support
if (&compare_version_numbers($postfix_version, 3.0) >= 0) {
&option_yesno("smtputf8_enable");
}
print &ui_table_end();
print &ui_form_end([ [ undef, $text{'opts_save'} ] ]);

View File

@@ -662,7 +662,7 @@ if [ ! -f "$config_dir/.pre-install" ]; then
fi
# Test if we have systemd system
systemctlcmd=$(which systemctl 2>/dev/null)
systemctlcmd=$(command -v systemctl 2>/dev/null || :)
if [ -x "$systemctlcmd" ]; then
initsys=$(cat /proc/1/comm 2>/dev/null)
if [ "$initsys" != "systemd" ]; then

View File

@@ -1 +1 @@
2.401
2.402

View File

@@ -2126,7 +2126,7 @@ if ($_[0] =~ /^\// || $_[0] =~ /^[a-z]:[\\\/]/i) {
else {
# Check each directory in the path
my %donedir;
foreach my $d (split($path_separator, $ENV{'PATH'})) {
foreach my $d (split($path_separator || ":", $ENV{'PATH'})) {
next if ($donedir{$d}++);
$d =~ s/$slash$// if ($d ne $slash);
my $t = &translate_filename("$d/$_[0]");