version 1.91, 2024/07/27 18:39:10
|
version 1.98, 2024/11/27 16:24:20
|
Line 437 sub check_prerequisites {
|
Line 437 sub check_prerequisites {
|
|
|
sub check_locale { |
sub check_locale { |
my ($distro) = @_; |
my ($distro) = @_; |
my ($fh,$langvar,$command,$earlyout); |
my ($fh,$langvar,$command,$langcmd,$earlyout,$default); |
$langvar = 'LANG'; |
$langvar = 'LANG'; |
if ($distro =~ /^(ubuntu|debian)/) { |
if ($distro =~ /^(ubuntu|debian)/) { |
if (!open($fh,"</etc/default/locale")) { |
if (!open($fh,"</etc/default/locale")) { |
Line 491 sub check_locale {
|
Line 491 sub check_locale {
|
$earlyout = 1; |
$earlyout = 1; |
} |
} |
} |
} |
return if ($earlyout); |
return () if ($earlyout); |
my @data = <$fh>; |
my @data = <$fh>; |
chomp(@data); |
chomp(@data); |
|
close($fh); |
foreach my $item (@data) { |
foreach my $item (@data) { |
if ($item =~ /^\Q$langvar\E=\"?([^\"]*)\"?/) { |
if ($item =~ /^\Q$langvar\E=\"?([^\"]*)\"?/) { |
my $default = $1; |
$default = $1; |
if ($default ne 'en_US.UTF-8') { |
if ($default ne 'en_US.UTF-8') { |
if ($distro =~ /^debian/) { |
if ($distro =~ /^debian/) { |
$command = 'locale-gen en_US.UTF-8'."\n". |
$command = 'locale-gen en_US.UTF-8'."\n". |
Line 517 sub check_locale {
|
Line 518 sub check_locale {
|
last; |
last; |
} |
} |
} |
} |
close($fh); |
# Check for locales |
return $command; |
if ($default ne 'en_US.UTF-8') { |
|
my ($has_us_english,$has_other_code,$has_other_lang); |
|
if (open(PIPE,"locale -a 2>/dev/null |")) { |
|
while (<PIPE>) { |
|
chomp(); |
|
next if (/^(C(|\.utf8)|POSIX)$/i); |
|
if (/^en_US\.utf8/i) { |
|
$has_us_english = 1; |
|
} elsif (/^[A-Za-z]{2}_[A-Za-z]{2}/) { |
|
$has_other_code = 1; |
|
} elsif (/^[A-Za-z]{3,}/) { |
|
$has_other_lang = 1; |
|
} |
|
} |
|
close(PIPE); |
|
if (!$has_us_english) { |
|
if ($has_other_code || $has_other_lang) { |
|
if ($distro =~ /^ubuntu/) { |
|
$langcmd = "sudo apt-get install language-pack-en\n"; |
|
} elsif ($distro =~ /^debian/) { |
|
$langcmd = "apt-get install language-pack-en\n"; |
|
} elsif ($distro =~ /^(suse|sles)/) { |
|
$langcmd = &mt('Use yast: System > Language > Primary Language = English')."\n"; |
|
} elsif ($distro =~ /^fedora(\d+)$/) { |
|
if ($1 > 23) { |
|
$langcmd = "dnf install glibc-langpack-en\n"; |
|
} else { |
|
$langcmd = "yum install glibc-common\n"; |
|
} |
|
} elsif ($distro =~ /^(?:rhes|centos|scientific|oracle|rocky|alma)(\d+)/) { |
|
if ($1 > 7) { |
|
$langcmd = "dnf install glibc-langpack-en\n"; |
|
} else { |
|
$langcmd = "yum install glibc-common\n"; |
|
} |
|
} |
|
} else { |
|
if ($distro =~ /^ubuntu/) { |
|
$langcmd = "sudo apt-get install language-pack-en\n"; |
|
} elsif ($distro =~ /^debian/) { |
|
$langcmd = "apt-get install language-pack-en\n"; |
|
} elsif ($distro =~ /^(suse|sles)/) { |
|
$langcmd = &mt('Use yast: System > Language > Primary Language = English')."\n"; |
|
} elsif ($distro =~ /^fedora(\d+)$/) { |
|
if ($1 > 23) { |
|
$langcmd = &mt('Either install all languages[_1]or install English only[_2]', |
|
":\ndnf install glibc-all-langpacks\n\n", |
|
":\ndnf install glibc-langpack-en\n"); |
|
} else { |
|
$langcmd = "yum install glibc-common\n"; |
|
} |
|
} elsif ($distro =~ /^(?:rhes|centos|scientific|oracle|rocky|alma)(\d+)/) { |
|
if ($1 > 7) { |
|
$langcmd = &mt('Either install all languages[_1]or install English only[_2]', |
|
":\ndnf install glibc-all-langpacks\n\n", |
|
":\ndnf install glibc-langpack-en\n"); |
|
} else { |
|
$langcmd = "yum install glibc-common\n"; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return ($command,$langcmd); |
} |
} |
|
|
sub check_required { |
sub check_required { |
Line 529 sub check_required {
|
Line 594 sub check_required {
|
} |
} |
my $gotprereqs = &check_prerequisites($packagecmd,$distro); |
my $gotprereqs = &check_prerequisites($packagecmd,$distro); |
if ($gotprereqs eq '') { |
if ($gotprereqs eq '') { |
return ($distro,$gotprereqs,'',$packagecmd,$updatecmd); |
return ($distro,$gotprereqs,'','',$packagecmd,$updatecmd); |
} |
} |
my $localecmd = &check_locale($distro); |
my ($localecmd,$langcmd) = &check_locale($distro); |
unless ($localecmd eq '') { |
unless ($localecmd eq '') { |
return ($distro,$gotprereqs,$localecmd); |
return ($distro,$gotprereqs,$localecmd,$langcmd); |
} |
} |
my ($mysqlon,$mysqlsetup,$mysqlrestart,$dbh,$has_pass,$mysql_unix_socket,$has_lcdb, |
my ($mysqlon,$mysqlsetup,$mysqlrestart,$dbh,$has_pass,$mysql_unix_socket,$has_lcdb, |
%recommended,$downloadstatus,$filetouse,$production,$testing,$apachefw, |
%recommended,$downloadstatus,$filetouse,$production,$testing,$apachefw, |
Line 575 sub check_required {
|
Line 640 sub check_required {
|
$mysqlrestart = 'sudo '; |
$mysqlrestart = 'sudo '; |
} |
} |
$mysqlrestart .= 'service mysql restart'; |
$mysqlrestart .= 'service mysql restart'; |
return ($distro,$gotprereqs,$localecmd,$packagecmd,$updatecmd,$installnow,$mysqlrestart); |
return ($distro,$gotprereqs,$localecmd,$langcmd,$packagecmd,$updatecmd,$installnow,$mysqlrestart); |
} else { |
} else { |
if ($mysqlsetup eq 'noroot') { |
if ($mysqlsetup eq 'noroot') { |
$recommended{'mysqlperms'} = 1; |
$recommended{'mysqlperms'} = 1; |
Line 604 sub check_required {
|
Line 669 sub check_required {
|
$recommended{'stopsrvcs'} = &chksrvcs($distro,$tostop); |
$recommended{'stopsrvcs'} = &chksrvcs($distro,$tostop); |
($recommended{'download'},$downloadstatus,$filetouse,$production,$testing) |
($recommended{'download'},$downloadstatus,$filetouse,$production,$testing) |
= &need_download($distro,$instdir); |
= &need_download($distro,$instdir); |
return ($distro,$gotprereqs,$localecmd,$packagecmd,$updatecmd,$installnow, |
return ($distro,$gotprereqs,$localecmd,$langcmd,$packagecmd,$updatecmd,$installnow, |
$mysqlrestart,\%recommended,$dbh,$has_pass,$mysql_unix_socket, |
$mysqlrestart,\%recommended,$dbh,$has_pass,$mysql_unix_socket, |
$has_lcdb,$downloadstatus,$filetouse,$production,$testing,$apachefw, |
$has_lcdb,$downloadstatus,$filetouse,$production,$testing,$apachefw, |
$uses_systemctl,$hostname,$hostip,$sslhostsfilesref,$has_std,$has_int, |
$uses_systemctl,$hostname,$hostip,$sslhostsfilesref,$has_std,$has_int, |
Line 667 sub check_mysql_running {
|
Line 732 sub check_mysql_running {
|
$proc_owner = 'mysql'; |
$proc_owner = 'mysql'; |
$process = 'mysqld'; |
$process = 'mysqld'; |
} |
} |
if ($1 >= 15) { |
if ($1 >= 12) { |
$mysqldaemon ='mariadb'; |
$mysqldaemon ='mariadb'; |
} |
} |
} elsif ($distro =~ /^suse(\d+)/) { |
} elsif ($distro =~ /^suse(\d+)/) { |
Line 753 sub chkconfig {
|
Line 818 sub chkconfig {
|
$uses_systemctl{'ntp'} = 1; |
$uses_systemctl{'ntp'} = 1; |
$uses_systemctl{'cups'} = 1; |
$uses_systemctl{'cups'} = 1; |
$uses_systemctl{'memcached'} = 1; |
$uses_systemctl{'memcached'} = 1; |
if (($name eq 'sles') && ($num >= 15)) { |
if ($name eq 'sles') { |
$daemon{'ntp'} = 'chronyd'; |
if ($num >= 12) { |
$daemon{'mysql'} = 'mariadb'; |
$daemon{'mysql'} = 'mariadb'; |
|
} |
|
if ($num >= 15) { |
|
$daemon{'ntp'} = 'chronyd'; |
|
} else { |
|
$daemon{'ntp'} = 'ntpd'; |
|
} |
} else { |
} else { |
$daemon{'ntp'} = 'ntpd'; |
$daemon{'ntp'} = 'ntpd'; |
} |
} |
Line 785 sub chkconfig {
|
Line 856 sub chkconfig {
|
(($distro =~ /^debian/) && ($version >= 10))) { |
(($distro =~ /^debian/) && ($version >= 10))) { |
$daemon{'ntp'} = 'chrony'; |
$daemon{'ntp'} = 'chrony'; |
} |
} |
if (($distro =~ /^debian/) && ($version >= 11)) { |
if (($distro =~ /^debian/) && ($version >= 10)) { |
$daemon{'mysql'} = 'mariadb'; |
$daemon{'mysql'} = 'mariadb'; |
} |
} |
} elsif ($distro =~ /^fedora(\d+)/) { |
} elsif ($distro =~ /^fedora(\d+)/) { |
Line 917 sub check_systemd_security {
|
Line 988 sub check_systemd_security {
|
$service = 'apache2.service'; |
$service = 'apache2.service'; |
} |
} |
system("systemctl daemon-reload"); |
system("systemctl daemon-reload"); |
if (open(PIPE,"systemctl show $service --property=ProtectHome 2>/dev/null |")) { |
if (open(PIPE,"systemctl show $service --property=ProtectHome --property=RestrictSUIDSGID 2>/dev/null |")) { |
my $protection = <PIPE>; |
my ($protecthome,$suidsgid); |
|
while (my $line = <PIPE>) { |
|
chomp($line); |
|
if ($line =~ /^ProtectHome=(read-only|yes)$/i) { |
|
$protecthome = 1; |
|
} elsif ($line =~ /^RestrictSUIDSGID=yes$/i) { |
|
$suidsgid = 1; |
|
} |
|
} |
close(PIPE); |
close(PIPE); |
chomp($protection); |
if ($protecthome) { |
if ($protection =~ /^ProtectHome=(read-only|yes)$/i) { |
return 1; |
|
} |
|
if ($suidsgid) { |
return 1; |
return 1; |
} |
} |
} else { |
} else { |
Line 1989 my %prompts = &texthash(
|
Line 2070 my %prompts = &texthash(
|
print "\n".&mt('Checking system status ...')."\n\n"; |
print "\n".&mt('Checking system status ...')."\n\n"; |
|
|
my $dsn = "DBI:mysql:database=mysql"; |
my $dsn = "DBI:mysql:database=mysql"; |
my ($distro,$gotprereqs,$localecmd,$packagecmd,$updatecmd,$installnow,$mysqlrestart, |
my ($distro,$gotprereqs,$localecmd,$langcmd,$packagecmd,$updatecmd,$installnow,$mysqlrestart, |
$recommended,$dbh,$has_pass,$mysql_unix_socket,$has_lcdb,$downloadstatus, |
$recommended,$dbh,$has_pass,$mysql_unix_socket,$has_lcdb,$downloadstatus, |
$filetouse,$production,$testing,$apachefw,$uses_systemctl,$hostname,$hostip, |
$filetouse,$production,$testing,$apachefw,$uses_systemctl,$hostname,$hostip, |
$sslhostsfiles,$has_std,$has_int,$rewritenum,$nochgstd,$nochgint) = |
$sslhostsfiles,$has_std,$has_int,$rewritenum,$nochgstd,$nochgint) = |
Line 2010 if ($mysqlrestart) {
|
Line 2091 if ($mysqlrestart) {
|
exit; |
exit; |
} |
} |
if ($localecmd ne '') { |
if ($localecmd ne '') { |
print "\n".&mt('Although the LON-CAPA application itself is localized for a number of different languages, the default locale language for the Linux OS on which it runs should be US English.')."\n"; |
print "\n".&mt('Although the LON-CAPA application itself is localized for a number of different languages,[_1]the default locale language for the Linux OS on which it runs should be US English.',"\n")."\n\n"; |
print "\n".&mt('Run the following command from the command line to set the default language for your OS, and then run this LON-CAPA installation set-up script again.')."\n\n". |
if ($langcmd ne '') { |
|
print &mt('Use the following command(s) or action(s) to install a required language package.')."\n\n". |
|
"$langcmd\n"; |
|
} |
|
print &mt('Run the following command from the command line to set the default language for your OS,[_1]and then run this LON-CAPA installation set-up script again.',"\n")."\n\n". |
$localecmd."\n\n". |
$localecmd."\n\n". |
&mt('Stopping execution.')."\n"; |
&mt('Stopping execution.')."\n"; |
exit; |
exit; |
Line 2035 if (!$gotprereqs) {
|
Line 2120 if (!$gotprereqs) {
|
&mt('Stopping execution.')."\n"; |
&mt('Stopping execution.')."\n"; |
exit; |
exit; |
} else { |
} else { |
($distro,$gotprereqs,$localecmd,$packagecmd,$updatecmd,$installnow, |
($distro,$gotprereqs,$localecmd,$langcmd,$packagecmd,$updatecmd,$installnow, |
$mysqlrestart,$recommended,$dbh,$has_pass,$mysql_unix_socket, |
$mysqlrestart,$recommended,$dbh,$has_pass,$mysql_unix_socket, |
$has_lcdb,$downloadstatus,$filetouse,$production,$testing,$apachefw, |
$has_lcdb,$downloadstatus,$filetouse,$production,$testing,$apachefw, |
$uses_systemctl,$hostname,$hostip,$sslhostsfiles,$has_std,$has_int, |
$uses_systemctl,$hostname,$hostip,$sslhostsfiles,$has_std,$has_int, |
Line 2904 sub check_systemd_update {
|
Line 2989 sub check_systemd_update {
|
if (-d '/etc/systemd/system/'.$service.'.d') { |
if (-d '/etc/systemd/system/'.$service.'.d') { |
if (-e '/etc/systemd/system/'.$service.'.d/override.conf') { |
if (-e '/etc/systemd/system/'.$service.'.d/override.conf') { |
if (open(my $fh,'<','/etc/systemd/system/'.$service.'.d/override.conf')) { |
if (open(my $fh,'<','/etc/systemd/system/'.$service.'.d/override.conf')) { |
my ($inservice,$addservice,$protectoff,$linenum,$change,@lines); |
my ($category,$addservice,$needs_update,$linenum,%is_no,%lines, |
|
@move,@nocat,@ordered); |
|
$linenum = 0; |
while (my $entry = <$fh>) { |
while (my $entry = <$fh>) { |
$linenum ++; |
$linenum ++; |
chomp($entry); |
chomp($entry); |
if ($entry eq '[Service]') { |
if ($entry =~ /^\s*\[([^\]]+)\]\s*$/) { |
if (!$protectoff) { |
$category = $1; |
$inservice = $linenum; |
if ($category =~ /^Service$/i) { |
push(@lines,$entry); |
unless (grep(/^Service$/,@ordered)) { |
|
push(@ordered,'Service'); |
|
} |
} else { |
} else { |
$addservice = 1; |
unless (grep(/^\Q$category\E$/,@ordered)) { |
next; |
push(@ordered,$category); |
|
} |
} |
} |
} |
} elsif ($entry =~ /^(ProtectHome|RestrictSUIDSGID)\s*=\s*([\w-]+)\s*$/) { |
if ($entry =~ /^ProtectHome\s*=\s*([\w-]+)\s*$/) { |
my ($key,$value) = ($1,$2); |
my $value = $1; |
next if ($is_no{$key}); |
if ($protectoff) { |
if (lc($value) eq 'no') { |
next; |
if ($category =~ /^Service$/i) { |
if (lc($value) eq 'no') { |
push(@{$lines{'Service'}},$entry); |
$protectoff = $linenum; |
|
push(@lines,$entry); |
|
} else { |
} else { |
if ($protectoff) { |
push(@move,$entry); |
next; |
$needs_update = 1; |
} else { |
} |
push(@lines,'ProtectHome=no'); |
} else { |
$protectoff = $linenum; |
my $offstr = $key.'=no'; |
$change = $linenum; |
if ($category =~ /^Service$/i) { |
} |
push(@{$lines{'Service'}},$offstr); |
|
} else { |
|
push(@move,$offstr); |
} |
} |
|
$needs_update = 1; |
|
} |
|
$is_no{$key} = $linenum; |
|
} else { |
|
next if ($entry =~ /^\s*$/); |
|
if ($category =~ /^Service$/i) { |
|
push(@{$lines{'Service'}},$entry); |
|
} elsif ($category ne '') { |
|
push(@{$lines{$category}},$entry); |
|
} else { |
|
push(@nocat,$entry); |
} |
} |
} |
} |
} |
} |
close($fh); |
close($fh); |
if ($addservice || $change || !$protectoff) { |
unless (grep(/^Service$/,@ordered)) { |
|
$addservice = 1; |
|
unshift(@ordered,'Service'); |
|
} |
|
foreach my $item ('ProtectHome','RestrictSUIDSGID') { |
|
unless (exists($is_no{$item})) { |
|
push(@{$lines{'Service'}},$item.'=no'); |
|
$needs_update = 1; |
|
} |
|
} |
|
if ($addservice || $needs_update) { |
if (open(my $fh,'>','/etc/systemd/system/'.$service.'.d/override.conf')) { |
if (open(my $fh,'>','/etc/systemd/system/'.$service.'.d/override.conf')) { |
if ($addservice) { |
if (@ordered) { |
print $fh "[Service]\n"; |
foreach my $category (@ordered) { |
|
print $fh "[$category]\n"; |
|
if (ref($lines{$category}) eq 'ARRAY') { |
|
foreach my $item (@{$lines{$category}}) { |
|
print $fh "$item\n"; |
|
} |
|
} |
|
if ($category eq 'Service') { |
|
if (@move) { |
|
foreach my $item (@move) { |
|
if ($item =~ /^(ProtectHome|RestrictSUIDSGID)\s*=\s*no\s*$/i) { |
|
my $key = $1; |
|
unless (grep/^$key\s*=\s*no\s*$/i,@{$lines{$category}}) { |
|
print $fh "$item\n"; |
|
} |
|
} else { |
|
print $fh "$item\n"; |
|
} |
|
} |
|
} |
|
} |
|
print $fh "\n"; |
|
} |
} |
} |
foreach my $entry (@lines) { |
if (@nocat) { |
print $fh "$entry\n"; |
foreach my $item (@nocat) { |
|
print $fh "$item\n"; |
|
} |
} |
} |
close($fh); |
close($fh); |
print_and_log('Updated /etc/systemd/system/'.$service.'.d/override.conf'); |
print_and_log('Updated /etc/systemd/system/'.$service.'.d/override.conf'); |
|
system('systemctl daemon-reload'); |
} else { |
} else { |
print_and_log('Could not open /etc/systemd/system/'.$service.'.d/override.conf for writing.'); |
print_and_log('Could not open /etc/systemd/system/'.$service.'.d/override.conf for writing.'); |
} |
} |
Line 2958 sub check_systemd_update {
|
Line 3094 sub check_systemd_update {
|
} |
} |
} else { |
} else { |
if (open(my $fh,'>','/etc/systemd/system/'.$service.'.d/override.conf')) { |
if (open(my $fh,'>','/etc/systemd/system/'.$service.'.d/override.conf')) { |
print $fh '[Service]'."\n".'ProtectHome=no'."\n"; |
print $fh '[Service]'."\n".'ProtectHome=no'."\n".'RestrictSUIDSGID=no'."\n"; |
close($fh); |
close($fh); |
print_and_log('Created /etc/systemd/system/'.$service.'.d/override.conf'); |
print_and_log('Created /etc/systemd/system/'.$service.'.d/override.conf'); |
|
system('systemctl daemon-reload'); |
|
} else { |
|
print_and_log('Could not open /etc/systemd/system/'.$service.'.d/override.conf for writing.'); |
} |
} |
} |
} |
} else { |
} else { |