version 1.30, 2014/06/30 03:36:07
|
version 1.46, 2018/07/11 01:58:41
|
Line 26
|
Line 26
|
use strict; |
use strict; |
use File::Copy; |
use File::Copy; |
use Term::ReadKey; |
use Term::ReadKey; |
|
use Sys::Hostname::FQDN(); |
use DBI; |
use DBI; |
|
use Cwd(); |
|
use File::Basename(); |
|
use lib File::Basename::dirname(Cwd::abs_path($0)); |
use LCLocalization::localize; |
use LCLocalization::localize; |
|
|
# ========================================================= The language handle |
# ========================================================= The language handle |
Line 277 sub get_distro {
|
Line 281 sub get_distro {
|
return ($distro,$packagecmd,$updatecmd,$installnow); |
return ($distro,$packagecmd,$updatecmd,$installnow); |
} |
} |
|
|
|
sub get_hostname { |
|
my $hostname; |
|
print &mt('Enter the hostname of this server, e.g., loncapa.somewhere.edu'."\n"); |
|
my $choice = <STDIN>; |
|
chomp($choice); |
|
$choice =~ s/(^\s+|\s+$)//g; |
|
if ($choice eq '') { |
|
print &mt("Hostname you entered was either blank or contanied only white space.\n"); |
|
} elsif ($choice =~ /^[\w\.\-]+$/) { |
|
$hostname = $choice; |
|
} else { |
|
print &mt("Hostname you entered was invalid -- a hostname may only contain letters, numbers, - and .\n"); |
|
} |
|
while ($hostname eq '') { |
|
$hostname = &get_hostname(); |
|
} |
|
print "\n"; |
|
return $hostname; |
|
} |
|
|
sub check_prerequisites { |
sub check_prerequisites { |
my ($packagecmd,$distro) = @_; |
my ($packagecmd,$distro) = @_; |
my $gotprereqs; |
my $gotprereqs; |
Line 385 sub check_required {
|
Line 409 sub check_required {
|
unless ($localecmd eq '') { |
unless ($localecmd eq '') { |
return ($distro,$gotprereqs,$localecmd); |
return ($distro,$gotprereqs,$localecmd); |
} |
} |
my ($mysqlon,$mysqlsetup,$dbh,$has_pass,$has_lcdb,%recommended,$downloadstatus, |
my ($mysqlon,$mysqlsetup,$mysqlrestart,$dbh,$has_pass,$has_lcdb,%recommended, |
$filetouse,$production,$testing,$apachefw,$tostop); |
$downloadstatus,$filetouse,$production,$testing,$apachefw,$tostop, |
|
$uses_systemctl,$hostname); |
my $wwwuid = &uid_of_www(); |
my $wwwuid = &uid_of_www(); |
my $wwwgid = getgrnam('www'); |
my $wwwgid = getgrnam('www'); |
if (($wwwuid eq '') || ($wwwgid eq '')) { |
if (($wwwuid eq '') || ($wwwgid eq '')) { |
Line 395 sub check_required {
|
Line 420 sub check_required {
|
unless( -e "/usr/local/sbin/pwauth") { |
unless( -e "/usr/local/sbin/pwauth") { |
$recommended{'pwauth'} = 1; |
$recommended{'pwauth'} = 1; |
} |
} |
|
my $hostname = Sys::Hostname::FQDN::fqdn(); |
|
if ($hostname eq '') { |
|
$hostname =&get_hostname(); |
|
} else { |
|
print &mt("Hostname detected: $hostname. Is that correct? ~[Y/n~]"); |
|
if (!&get_user_selection(1)) { |
|
$hostname =&get_hostname(); |
|
} |
|
} |
|
print_and_log(&mt('Hostname is [_1]',$hostname)."\n"); |
$mysqlon = &check_mysql_running($distro); |
$mysqlon = &check_mysql_running($distro); |
if ($mysqlon) { |
if ($mysqlon) { |
my $mysql_has_wwwuser = &check_mysql_wwwuser(); |
my $mysql_has_wwwuser = &check_mysql_wwwuser(); |
($mysqlsetup,$has_pass,$dbh) = |
($mysqlsetup,$has_pass,$dbh,$mysql_has_wwwuser) = |
&check_mysql_setup($instdir,$dsn); |
&check_mysql_setup($instdir,$dsn,$distro,$mysql_has_wwwuser); |
if ($mysqlsetup eq 'noroot') { |
if ($mysqlsetup eq 'needsrestart') { |
$recommended{'mysqlperms'} = 1; |
$mysqlrestart = ''; |
|
if ($distro eq 'ubuntu') { |
|
$mysqlrestart = 'sudo '; |
|
} |
|
$mysqlrestart .= 'service mysql restart'; |
|
return ($distro,$gotprereqs,$localecmd,$packagecmd,$updatecmd,$installnow,$mysqlrestart); |
} else { |
} else { |
unless ($mysql_has_wwwuser) { |
if ($mysqlsetup eq 'noroot') { |
$recommended{'mysqlperms'} = 1; |
$recommended{'mysqlperms'} = 1; |
|
} else { |
|
unless ($mysql_has_wwwuser) { |
|
$recommended{'mysqlperms'} = 1; |
|
} |
|
} |
|
if ($dbh) { |
|
$has_lcdb = &check_loncapa_mysqldb($dbh); |
|
} |
|
unless ($has_lcdb) { |
|
$recommended{'mysql'} = 1; |
} |
} |
} |
|
if ($dbh) { |
|
$has_lcdb = &check_loncapa_mysqldb($dbh); |
|
} |
|
unless ($has_lcdb) { |
|
$recommended{'mysql'} = 1; |
|
} |
} |
} |
} |
($recommended{'firewall'},$apachefw) = &chkfirewall($distro); |
($recommended{'firewall'},$apachefw) = &chkfirewall($distro); |
($recommended{'runlevels'},$tostop) = &chkconfig($distro,$instdir); |
($recommended{'runlevels'},$tostop,$uses_systemctl) = &chkconfig($distro,$instdir); |
$recommended{'apache'} = &chkapache($distro,$instdir); |
$recommended{'apache'} = &chkapache($distro,$instdir); |
|
$recommended{'apachessl'} = &chkapachessl($distro,$instdir,$hostname); |
$recommended{'stopsrvcs'} = &chksrvcs($distro,$tostop); |
$recommended{'stopsrvcs'} = &chksrvcs($distro,$tostop); |
($recommended{'download'},$downloadstatus,$filetouse,$production,$testing) |
($recommended{'download'},$downloadstatus,$filetouse,$production,$testing) |
= &need_download(); |
= &need_download(); |
return ($distro,$gotprereqs,$localecmd,$packagecmd,$updatecmd,$installnow, |
return ($distro,$gotprereqs,$localecmd,$packagecmd,$updatecmd,$installnow, |
\%recommended,$dbh,$has_pass,$has_lcdb,$downloadstatus, |
$mysqlrestart,\%recommended,$dbh,$has_pass,$has_lcdb,$downloadstatus, |
$filetouse,$production,$testing,$apachefw); |
$filetouse,$production,$testing,$apachefw,$uses_systemctl,$hostname); |
} |
} |
|
|
sub check_mysql_running { |
sub check_mysql_running { |
Line 439 sub check_mysql_running {
|
Line 484 sub check_mysql_running {
|
$process = 'mysqld'; |
$process = 'mysqld'; |
$proc_owner = 'mysql'; |
$proc_owner = 'mysql'; |
} |
} |
} |
} elsif ($distro =~ /^fedora(\d+)/) { |
if ($distro =~ /^fedora(\d+)/) { |
|
if ($1 >= 16) { |
if ($1 >= 16) { |
$process = 'mysqld'; |
$process = 'mysqld'; |
$proc_owner = 'mysql'; |
$proc_owner = 'mysql'; |
$use_systemctl = 1; |
$use_systemctl = 1; |
} |
} |
} |
if ($1 >= 19) { |
if ($distro =~ /^(?:centos|rhes|scientific)(\d+)/) { |
$mysqldaemon ='mariadb'; |
|
} |
|
} elsif ($distro =~ /^(?:centos|rhes|scientific)(\d+)/) { |
if ($1 >= 7) { |
if ($1 >= 7) { |
$mysqldaemon ='mariadb'; |
$mysqldaemon ='mariadb'; |
$process = 'mysqld'; |
$process = 'mysqld'; |
$proc_owner = 'mysql'; |
$proc_owner = 'mysql'; |
$use_systemctl = 1; |
$use_systemctl = 1; |
} |
} |
|
} elsif ($distro =~ /^sles(\d+)/) { |
|
if ($1 >= 12) { |
|
$use_systemctl = 1; |
|
$proc_owner = 'mysql'; |
|
$process = 'mysqld'; |
|
} |
|
} elsif ($distro =~ /^suse(\d+)/) { |
|
if ($1 >= 13) { |
|
$use_systemctl = 1; |
|
} |
} |
} |
if (open(PIPE,"ps -ef |grep $process |grep -v grep 2>&1 |")) { |
if (open(PIPE,"ps -ef |grep $process |grep ^$proc_owner |grep -v grep 2>&1 |")) { |
my $status = <PIPE>; |
my $status = <PIPE>; |
close(PIPE); |
close(PIPE); |
chomp($status); |
chomp($status); |
Line 523 sub chkconfig {
|
Line 579 sub chkconfig {
|
if ($distro =~ /^(suse|sles)9/) { |
if ($distro =~ /^(suse|sles)9/) { |
$daemon{'apache'} = 'apache'; |
$daemon{'apache'} = 'apache'; |
} |
} |
if ($distro =~ /^suse(\d+)/) { |
if ($distro =~ /^(suse|sles)([\d\.]+)/) { |
if ($1 > 11) { |
my $name = $1; |
|
my $num = $2; |
|
if ($num > 11) { |
$uses_systemctl{'apache'} = 1; |
$uses_systemctl{'apache'} = 1; |
|
if (($name eq 'sles') || ($name eq 'suse' && $num >= 13.2)) { |
|
$uses_systemctl{'mysql'} = 1; |
|
$uses_systemctl{'ntp'} = 1; |
|
$uses_systemctl{'cups'} = 1; |
|
$uses_systemctl{'memcached'} = 1; |
|
$daemon{'ntp'} = 'ntpd'; |
|
} |
} |
} |
} |
} |
} elsif ($distro =~ /^(?:debian|ubuntu)(\d+)/) { |
} elsif ($distro =~ /^(?:debian|ubuntu)(\d+)/) { |
my $version = $1; |
my $version = $1; |
@runlevels = qw/2 3 4 5/; |
@runlevels = qw/2 3 4 5/; |
@norunlevels = qw/0 1 6/; |
@norunlevels = qw/0 1 6/; |
$checker_bin = '/usr/sbin/sysv-rc-conf'; |
if (($distro =~ /^ubuntu/) && ($version <= 16)) { |
|
$checker_bin = '/usr/sbin/sysv-rc-conf'; |
|
} else { |
|
$uses_systemctl{'ntp'} = 1; |
|
$uses_systemctl{'mysql'} = 1; |
|
$uses_systemctl{'apache'} = 1; |
|
$uses_systemctl{'memcached'} = 1; |
|
$uses_systemctl{'cups'} = 1; |
|
} |
$daemon{'mysql'} = 'mysql'; |
$daemon{'mysql'} = 'mysql'; |
$daemon{'apache'} = 'apache2'; |
$daemon{'apache'} = 'apache2'; |
$daemon{'ntp'} = 'ntp'; |
$daemon{'ntp'} = 'ntp'; |
Line 547 sub chkconfig {
|
Line 620 sub chkconfig {
|
if ($version >= 16) { |
if ($version >= 16) { |
$uses_systemctl{'mysql'} = 1; |
$uses_systemctl{'mysql'} = 1; |
$uses_systemctl{'apache'} = 1; |
$uses_systemctl{'apache'} = 1; |
|
$uses_systemctl{'memcached'} = 1; |
|
$uses_systemctl{'cups'} = 1; |
|
} |
|
if ($version >= 19) { |
|
$daemon{'mysql'} = 'mariadb'; |
} |
} |
} elsif ($distro =~ /^(?:centos|rhes|scientific)(\d+)/) { |
} elsif ($distro =~ /^(?:centos|rhes|scientific)(\d+)/) { |
my $version = $1; |
my $version = $1; |
Line 554 sub chkconfig {
|
Line 632 sub chkconfig {
|
$uses_systemctl{'ntp'} = 1; |
$uses_systemctl{'ntp'} = 1; |
$uses_systemctl{'mysql'} = 1; |
$uses_systemctl{'mysql'} = 1; |
$uses_systemctl{'apache'} = 1; |
$uses_systemctl{'apache'} = 1; |
|
$uses_systemctl{'memcached'} = 1; |
|
$uses_systemctl{'cups'} = 1; |
$daemon{'mysql'} = 'mariadb'; |
$daemon{'mysql'} = 'mariadb'; |
} |
} |
} |
} |
Line 577 sub chkconfig {
|
Line 657 sub chkconfig {
|
foreach my $type ('apache','mysql','ntp','cups','memcached') { |
foreach my $type ('apache','mysql','ntp','cups','memcached') { |
my $service = $daemon{$type}; |
my $service = $daemon{$type}; |
if ($uses_systemctl{$type}) { |
if ($uses_systemctl{$type}) { |
if (!-l "/etc/systemd/system/multi-user.target.wants/$service.service") { |
if (($type eq 'memcached') || ($type eq 'cups')) { |
$needfix{$type} = "systemctl enable $service.service"; |
if (-l "/etc/systemd/system/multi-user.target.wants/$service.service") { |
|
$tostop{$type} = 1; |
|
} |
|
} else { |
|
if (!-l "/etc/systemd/system/multi-user.target.wants/$service.service") { |
|
$needfix{$type} = "systemctl enable $service.service"; |
|
} |
} |
} |
next; |
|
} else { |
} else { |
my $command = $checker_bin.' --list '.$service.' 2>/dev/null'; |
my $command = $checker_bin.' --list '.$service.' 2>/dev/null'; |
if ($type eq 'cups') { |
if ($type eq 'cups') { |
if ($distro =~ /^(?:debian|ubuntu)(\d+)/) { |
if ($distro =~ /^(?:debian|ubuntu)(\d+)/) { |
my $version = $1; |
my $version = $1; |
if (($distro =~ /^ubuntu/) && ($version <= 8)) { |
if (($distro =~ /^ubuntu/) && ($version <= 8)) { |
Line 640 sub chkconfig {
|
Line 725 sub chkconfig {
|
} |
} |
} |
} |
} |
} |
return (\%needfix,\%tostop); |
return (\%needfix,\%tostop,\%uses_systemctl); |
} |
} |
|
|
sub chkfirewall { |
sub chkfirewall { |
Line 685 sub chkapache {
|
Line 770 sub chkapache {
|
if ($distro =~ /^(debian|ubuntu)(\d+)$/) { |
if ($distro =~ /^(debian|ubuntu)(\d+)$/) { |
my $distname = $1; |
my $distname = $1; |
my $version = $2; |
my $version = $2; |
if (!-e "$instdir/debian-ubuntu/loncapa") { |
my ($stdconf,$stdsite); |
|
if (($distname eq 'ubuntu') && ($version > 12)) { |
|
$stdconf = "$instdir/debian-ubuntu/ubuntu14/loncapa_conf"; |
|
$stdsite = "$instdir/debian-ubuntu/ubuntu14/loncapa_sites"; |
|
} else { |
|
$stdconf = "$instdir/debian-ubuntu/loncapa"; |
|
} |
|
if (!-e $stdconf) { |
$fixapache = 0; |
$fixapache = 0; |
print &mt('Warning: No LON-CAPA Apache configuration file found for installation check.')."\n"; |
print &mt('Warning: No LON-CAPA Apache configuration file found for installation check.')."\n"; |
} else { |
} else { |
my $configfile = "/etc/apache2/sites-available/loncapa"; |
my ($configfile,$sitefile); |
if (($distname eq 'ubuntu') && ($version > 12)) { |
if (($distname eq 'ubuntu') && ($version > 12)) { |
|
$sitefile = '/etc/apache2/sites-available/loncapa'; |
$configfile = "/etc/apache2/conf-available/loncapa"; |
$configfile = "/etc/apache2/conf-available/loncapa"; |
|
} else { |
|
$configfile = "/etc/apache2/sites-available/loncapa"; |
} |
} |
if (-e $configfile) { |
if (($configfile ne '') && (-e $configfile) && (-e $stdconf)) { |
if (open(PIPE, "diff --brief $instdir/debian-ubuntu/loncapa /etc/apache2/sites-available/loncapa |")) { |
if (open(PIPE, "diff --brief $stdconf $configfile |")) { |
my $diffres = <PIPE>; |
my $diffres = <PIPE>; |
close(PIPE); |
close(PIPE); |
chomp($diffres); |
chomp($diffres); |
Line 703 sub chkapache {
|
Line 798 sub chkapache {
|
} |
} |
} |
} |
} |
} |
|
if ((!$fixapache) && ($distname eq 'ubuntu') && ($version > 12)) { |
|
if (($sitefile ne '') && (-e $sitefile) && (-e $stdsite)) { |
|
if (open(PIPE, "diff --brief $stdsite $sitefile |")) { |
|
my $diffres = <PIPE>; |
|
close(PIPE); |
|
chomp($diffres); |
|
unless ($diffres) { |
|
$fixapache = 0; |
|
} |
|
} |
|
} |
|
} |
} |
} |
if (!$fixapache) { |
if (!$fixapache) { |
foreach my $module ('headers.load','expires.load') { |
foreach my $module ('headers.load','expires.load') { |
Line 775 sub chkapache {
|
Line 882 sub chkapache {
|
return $fixapache; |
return $fixapache; |
} |
} |
|
|
|
sub chkapachessl { |
|
my ($distro,$instdir,$hostname) = @_; |
|
my $fixapachessl = 1; |
|
my $stdconf = "$instdir/loncapassl.conf"; |
|
if (!-e $stdconf) { |
|
$fixapachessl = 0; |
|
print &mt('Warning: No LON-CAPA SSL Apache configuration file found for installation check.')."\n"; |
|
} else { |
|
my $sslfile; |
|
if ($distro =~ /^(debian|ubuntu)(\d+)$/) { |
|
$sslfile = '/etc/apache2/sites-available/loncapassl.conf'; |
|
} elsif ($distro =~ /(suse|sles)/) { |
|
$sslfile = '/etc/apache2/vhosts.d/loncapassl.conf'; |
|
} else { |
|
$sslfile = '/etc/httpd/conf.d/loncapassl.conf'; |
|
} |
|
if ((-e $sslfile) && (-e $stdconf)) { |
|
if (open(PIPE, "diff -y -bi --suppress-common-lines $stdconf $sslfile |")) { |
|
my $diffres = <PIPE>; |
|
close(PIPE); |
|
chomp($diffres); |
|
if ($diffres =~ /^\QServerName internal-{[[[[Hostname]]]]}\E\s+\|\s+\QServerName internal-\E$hostname$/) { |
|
$fixapachessl = 0; |
|
} |
|
} |
|
} |
|
unless ($fixapachessl) { |
|
if ($distro =~ /^(debian|ubuntu)(\d+)$/) { |
|
unless ((-l '/etc/apache2/sites-enabled/loncapassl.conf') && |
|
(readlink('/etc/apache2/sites-enabled/loncapassl.conf') eq '/etc/apache2/sites-available/loncapassl.conf')) { |
|
print_and_log(&mt("Warning, use: 'sudo a2ensite loncapassl.conf' to activate LON-CAPA SSL Apache config\n")); |
|
} |
|
} |
|
} |
|
} |
|
return $fixapachessl; |
|
} |
|
|
sub chksrvcs { |
sub chksrvcs { |
my ($distro,$tostop) = @_; |
my ($distro,$tostop) = @_; |
my %stopsrvcs; |
my %stopsrvcs; |
Line 900 sub need_download {
|
Line 1045 sub need_download {
|
} |
} |
|
|
sub check_mysql_setup { |
sub check_mysql_setup { |
my ($instdir,$dsn) = @_; |
my ($instdir,$dsn,$distro,$mysql_has_wwwuser) = @_; |
my ($mysqlsetup,$has_pass); |
my ($mysqlsetup,$has_pass); |
my $dbh = DBI->connect($dsn,'root','',{'PrintError'=>0}); |
my $dbh = DBI->connect($dsn,'root','',{'PrintError'=>0}); |
if ($dbh) { |
if ($dbh) { |
$mysqlsetup = 'noroot'; |
$mysqlsetup = 'noroot'; |
} elsif ($DBI::err =~ /1045/) { |
} elsif ($DBI::err =~ /1045/) { |
$has_pass = 1; |
$has_pass = 1; |
|
} elsif ($distro =~ /^ubuntu(\d+)$/) { |
|
my $version = $1; |
|
if ($1 > 12) { |
|
print_and_log(&mt('Restarting mysql, please be patient')."\n"); |
|
if (open (PIPE, "service mysql restart 2>&1 |")) { |
|
while (<PIPE>) { |
|
print $_; |
|
} |
|
close(PIPE); |
|
} |
|
unless ($mysql_has_wwwuser) { |
|
$mysql_has_wwwuser = &check_mysql_wwwuser(); |
|
} |
|
$dbh = DBI->connect($dsn,'root','',{'PrintError'=>0}); |
|
if ($dbh) { |
|
$mysqlsetup = 'noroot'; |
|
} elsif ($DBI::err =~ /1045/) { |
|
$has_pass = 1; |
|
} else { |
|
$mysqlsetup = 'needsrestart'; |
|
return ($mysqlsetup,$has_pass,$dbh,$mysql_has_wwwuser); |
|
} |
|
} |
} |
} |
if ($has_pass) { |
if ($has_pass) { |
print &mt('You have already set a root password for the MySQL database.')."\n"; |
print &mt('You have already set a root password for the MySQL database.')."\n"; |
Line 933 sub check_mysql_setup {
|
Line 1101 sub check_mysql_setup {
|
} |
} |
} |
} |
} |
} |
} elsif ($mysqlsetup ne 'noroot') { |
} elsif ($mysqlsetup ne 'noroot') { |
print_and_log(&mt('Problem accessing MySQL.')."\n"); |
print_and_log(&mt('Problem accessing MySQL.')."\n"); |
$mysqlsetup = 'rootfail'; |
$mysqlsetup = 'rootfail'; |
} |
} |
return ($mysqlsetup,$has_pass,$dbh); |
return ($mysqlsetup,$has_pass,$dbh,$mysql_has_wwwuser); |
} |
} |
|
|
sub check_mysql_wwwuser { |
sub check_mysql_wwwuser { |
Line 1143 print "
|
Line 1311 print "
|
".&mt('3.')." ".&mt('Set-up the MySQL database.')." |
".&mt('3.')." ".&mt('Set-up the MySQL database.')." |
".&mt('4.')." ".&mt('Set-up MySQL permissions.')." |
".&mt('4.')." ".&mt('Set-up MySQL permissions.')." |
".&mt('5.')." ".&mt('Configure Apache web server.')." |
".&mt('5.')." ".&mt('Configure Apache web server.')." |
".&mt('6.')." ".&mt('Configure start-up of services.')." |
".&mt('6.')." ".&mt('Configure SSL for Apache web server.')." |
".&mt('7.')." ".&mt('Check firewall settings.')." |
".&mt('7.')." ".&mt('Configure start-up of services.')." |
".&mt('8.')." ".&mt('Stop services not used by LON-CAPA,')." |
".&mt('8.')." ".&mt('Check firewall settings.')." |
|
".&mt('9.')." ".&mt('Stop services not used by LON-CAPA,')." |
".&mt('i.e., services for a print server: [_1] daemon.',"'cups'")." |
".&mt('i.e., services for a print server: [_1] daemon.',"'cups'")." |
".&mt('9.')." ".&mt('Download LON-CAPA source code in readiness for installation.')." |
".&mt('10.')." ".&mt('Download LON-CAPA source code in readiness for installation.')." |
|
|
".&mt('Typically, you will run this script only once, when you first install LON-CAPA.')." |
".&mt('Typically, you will run this script only once, when you first install LON-CAPA.')." |
|
|
Line 1177 chomp($instdir);
|
Line 1346 chomp($instdir);
|
|
|
my %callsub; |
my %callsub; |
my @actions = ('wwwuser','pwauth','mysql','mysqlperms','apache', |
my @actions = ('wwwuser','pwauth','mysql','mysqlperms','apache', |
'runlevels','firewall','stopsrvcs','download'); |
'apachessl','runlevels','firewall','stopsrvcs','download'); |
my %prompts = &texthash( |
my %prompts = &texthash( |
wwwuser => "Create the 'www' user?", |
wwwuser => "Create the 'www' user?", |
pwauth => 'Install the package LON-CAPA uses to authenticate users?', |
pwauth => 'Install the package LON-CAPA uses to authenticate users?', |
mysql => 'Set-up the MySQL database?', |
mysql => 'Set-up the MySQL database?', |
mysqlperms => 'Set-up MySQL permissions?', |
mysqlperms => 'Set-up MySQL permissions?', |
apache => 'Configure Apache web server?', |
apache => 'Configure Apache web server?', |
|
apachessl => 'Configure SSL for Apache web server?', |
runlevels => 'Set overrides for start-up order of services?', |
runlevels => 'Set overrides for start-up order of services?', |
firewall => 'Configure firewall settings for Apache', |
firewall => 'Configure firewall settings for Apache', |
stopsrvcs => 'Stop extra services not required on a LON-CAPA server?', |
stopsrvcs => 'Stop extra services not required on a LON-CAPA server?', |
download => 'Download LON-CAPA source code in readiness for installation?', |
download => 'Download LON-CAPA source code in readiness for installation?', |
); |
); |
|
|
print "\n".&mt('Checking system status ...')."\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,$recommended, |
my ($distro,$gotprereqs,$localecmd,$packagecmd,$updatecmd,$installnow,$mysqlrestart, |
$dbh,$has_pass,$has_lcdb,$downloadstatus,$filetouse,$production, |
$recommended,$dbh,$has_pass,$has_lcdb,$downloadstatus,$filetouse,$production, |
$testing,$apachefw) = &check_required($instdir,$dsn); |
$testing,$apachefw,$uses_systemctl,$hostname) = &check_required($instdir,$dsn); |
if ($distro eq '') { |
if ($distro eq '') { |
print "\n".&mt('Linux distribution could not be verified as a supported distribution.')."\n". |
print "\n".&mt('Linux distribution could not be verified as a supported distribution.')."\n". |
&mt('The following are supported: [_1].', |
&mt('The following are supported: [_1].', |
Line 1204 if ($distro eq '') {
|
Line 1374 if ($distro eq '') {
|
&mt('Stopping execution.')."\n"; |
&mt('Stopping execution.')."\n"; |
exit; |
exit; |
} |
} |
|
if ($mysqlrestart) { |
|
print "\n".&mt('The mysql daemon needs to be restarted using the following command:')."\n". |
|
$mysqlrestart."\n\n". |
|
&mt('Stopping execution of install.pl script.')."\n". |
|
&mt('Please run the install.pl script again, once you have restarted mysql.')."\n"; |
|
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, the default locale language for the Linux OS on which it runs should be US English.')."\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". |
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". |
Line 1216 if (!$gotprereqs) {
|
Line 1393 if (!$gotprereqs) {
|
&mt('The following command can be used to install the package (and dependencies):')."\n\n". |
&mt('The following command can be used to install the package (and dependencies):')."\n\n". |
$updatecmd."\n\n"; |
$updatecmd."\n\n"; |
if ($installnow eq '') { |
if ($installnow eq '') { |
print &mt('Stopping execution.')."\n"; |
|
exit; |
exit; |
} else { |
} else { |
print &mt('Run command? ~[Y/n~]'); |
print &mt('Run command? ~[Y/n~]'); |
Line 1231 if (!$gotprereqs) {
|
Line 1407 if (!$gotprereqs) {
|
exit; |
exit; |
} else { |
} else { |
($distro,$gotprereqs,$localecmd,$packagecmd,$updatecmd,$installnow, |
($distro,$gotprereqs,$localecmd,$packagecmd,$updatecmd,$installnow, |
$recommended,$dbh,$has_pass,$has_lcdb,$downloadstatus, |
$mysqlrestart,$recommended,$dbh,$has_pass,$has_lcdb,$downloadstatus, |
$filetouse,$production,$testing,$apachefw) = |
$filetouse,$production,$testing,$apachefw,$uses_systemctl) = |
&check_required($instdir,$dsn); |
&check_required($instdir,$dsn); |
} |
} |
} else { |
} else { |
Line 1356 if ($dbh) {
|
Line 1532 if ($dbh) {
|
|
|
if ($callsub{'apache'}) { |
if ($callsub{'apache'}) { |
if ($distro =~ /^(suse|sles)/) { |
if ($distro =~ /^(suse|sles)/) { |
©_apache2_suseconf($instdir); |
©_apache2_suseconf($instdir,$hostname); |
} elsif ($distro =~ /^(debian|ubuntu)/) { |
} elsif ($distro =~ /^(debian|ubuntu)/) { |
©_apache2_debconf($instdir,$distro); |
©_apache2_debconf($instdir,$distro,$hostname); |
} else { |
} else { |
©_httpd_conf($instdir,$distro); |
©_httpd_conf($instdir,$distro,$hostname); |
} |
} |
} else { |
} else { |
print_and_log(&mt('Skipping configuration of Apache web server.')."\n"); |
print_and_log(&mt('Skipping configuration of Apache web server.')."\n"); |
} |
} |
|
|
|
if ($callsub{'apachessl'}) { |
|
if ($distro =~ /^(suse|sles)/) { |
|
©_apache_sslconf_file($instdir,'/etc/apache2/vhosts.d',$hostname); |
|
} elsif ($distro =~ /^(debian|ubuntu)/) { |
|
my $apache2_sites_available_dir = '/etc/apache2/sites-available'; |
|
if (©_apache_sslconf_file($instdir,$apache2_sites_available_dir,$hostname)) { |
|
my $apache2_sites_enabled_dir = '/etc/apache2/sites-enabled'; |
|
my $made_symlink = eval { symlink("$apache2_sites_available_dir/loncapassl.conf","$apache2_sites_enabled_dir/loncapassl.conf"); 1 }; |
|
if ($made_symlink) { |
|
print_and_log(&mt('Enabling "[_1]" Apache SSL configuration.','loncapassl.conf')."\n"); |
|
} |
|
} |
|
} else { |
|
©_apache_sslconf_file($instdir,'/etc/httpd/conf.d',$hostname); |
|
} |
|
print_and_log("\n"); |
|
} else { |
|
print_and_log(&mt('Skipping configuration of SSL for Apache web server.')."\n"); |
|
} |
|
|
if ($callsub{'runlevels'}) { |
if ($callsub{'runlevels'}) { |
my $count = 0; |
my $count = 0; |
if (ref($recommended) eq 'HASH') { |
if (ref($recommended) eq 'HASH') { |
Line 1426 if ($callsub{'firewall'}) {
|
Line 1622 if ($callsub{'firewall'}) {
|
} |
} |
|
|
if ($callsub{'stopsrvcs'}) { |
if ($callsub{'stopsrvcs'}) { |
&kill_extra_services($distro,$recommended->{'stopsrvcs'}); |
&kill_extra_services($distro,$recommended->{'stopsrvcs'},$uses_systemctl); |
} else { |
} else { |
&print_and_log(&mt('Skipping stopping unnecessary service ([_1] daemons).',"'cups','memcached'")."\n"); |
&print_and_log(&mt('Skipping stopping unnecessary service ([_1] daemons).',"'cups','memcached'")."\n"); |
} |
} |
Line 1613 END
|
Line 1809 END
|
} |
} |
|
|
sub kill_extra_services { |
sub kill_extra_services { |
my ($distro,$stopsrvcs) = @_; |
my ($distro,$stopsrvcs,$uses_systemctl) = @_; |
if (ref($stopsrvcs) eq 'HASH') { |
if (ref($stopsrvcs) eq 'HASH') { |
my @stopping = sort(keys(%{$stopsrvcs})); |
my @stopping = sort(keys(%{$stopsrvcs})); |
if (@stopping) { |
if (@stopping) { |
Line 1644 sub kill_extra_services {
|
Line 1840 sub kill_extra_services {
|
} |
} |
} |
} |
&print_and_log(&mt('Removing [_1] from startup.',$service)."\n"); |
&print_and_log(&mt('Removing [_1] from startup.',$service)."\n"); |
if ($distro =~ /^(debian|ubuntu)/) { |
if ($distro =~ /^(?:debian|ubuntu)(\d+)/) { |
&print_and_log(`update-rc.d -f $daemon remove`); |
my $version = $1; |
|
if (($distro =~ /^ubuntu/) && ($version > 16)) { |
|
if (ref($uses_systemctl) eq 'HASH') { |
|
if ($uses_systemctl->{$service}) { |
|
if (`systemctl is-enabled $service`) { |
|
&print_and_log(`systemctl disable $service`); |
|
} |
|
} |
|
} |
|
} else { |
|
&print_and_log(`update-rc.d -f $daemon remove`); |
|
} |
} else { |
} else { |
&print_and_log(`/sbin/chkconfig --del $service`); |
if (ref($uses_systemctl) eq 'HASH') { |
|
if ($uses_systemctl->{$service}) { |
|
if (`systemctl is-enabled $service`) { |
|
&print_and_log(`systemctl disable $service`); |
|
} |
|
} else { |
|
&print_and_log(`/sbin/chkconfig --del $service`); |
|
} |
|
} else { |
|
&print_and_log(`/sbin/chkconfig --del $service`); |
|
} |
} |
} |
} |
} |
} |
} |
Line 1685 CREATE TABLE IF NOT EXISTS metadata (tit
|
Line 1902 CREATE TABLE IF NOT EXISTS metadata (tit
|
|
|
sub setup_mysql_permissions { |
sub setup_mysql_permissions { |
my ($dbh,$has_pass,@mysql_lc_commands) = @_; |
my ($dbh,$has_pass,@mysql_lc_commands) = @_; |
my $mysqlversion = &get_mysql_version(); |
my ($mysqlversion,$mysqlsubver,$mysqlname) = &get_mysql_version(); |
my @mysql_commands = ("INSERT user (Host, User, Password) VALUES('localhost','www',password('localhostkey'));"); |
my ($usesauth,$hasauthcol,@mysql_commands); |
|
if ($mysqlname =~ /^MariaDB/i) { |
|
if ($mysqlversion >= 10.2) { |
|
$usesauth = 1; |
|
} elsif ($mysqlversion >= 5.5) { |
|
$hasauthcol = 1; |
|
} |
|
} else { |
|
if (($mysqlversion > 5.7) || (($mysqlversion == 5.7) && ($mysqlsubver > 5))) { |
|
$usesauth = 1; |
|
} elsif (($mysqlversion >= 5.6) || (($mysqlversion == 5.5) && ($mysqlsubver >= 7))) { |
|
$hasauthcol = 1; |
|
} |
|
} |
|
if ($usesauth) { |
|
@mysql_commands = ("INSERT user (Host, User, ssl_cipher, x509_issuer, x509_subject, authentication_string) VALUES('localhost','www','','','','')", |
|
"ALTER USER 'www'\@'localhost' IDENTIFIED WITH mysql_native_password BY 'localhostkey'"); |
|
} elsif ($hasauthcol) { |
|
@mysql_commands = ("INSERT user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject, authentication_string) VALUES('localhost','www',password('localhostkey'),'','','','');"); |
|
} else { |
|
@mysql_commands = ("INSERT user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject) VALUES('localhost','www',password('localhostkey'),'','','');"); |
|
} |
if ($mysqlversion < 4) { |
if ($mysqlversion < 4) { |
push (@mysql_commands," |
push (@mysql_commands," |
INSERT db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Grant_priv,References_priv,Index_priv,Alter_priv) VALUES('localhost','loncapa','www','Y','Y','Y','Y','Y','Y','N','Y','Y','Y')"); |
INSERT db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Grant_priv,References_priv,Index_priv,Alter_priv) VALUES('localhost','loncapa','www','Y','Y','Y','Y','Y','Y','N','Y','Y','Y')"); |
Line 1736 INSERT db (Host,Db,User,Select_priv,Inse
|
Line 1974 INSERT db (Host,Db,User,Select_priv,Inse
|
} |
} |
} |
} |
if ($got_passwd) { |
if ($got_passwd) { |
my (@newpass_cmds) = &new_mysql_rootpasswd($newmysqlpass); |
my (@newpass_cmds) = &new_mysql_rootpasswd($newmysqlpass,$usesauth); |
push(@mysql_commands,@newpass_cmds); |
push(@mysql_commands,@newpass_cmds); |
} else { |
} else { |
print_and_log(&mt('Failed to get MySQL root password from user input.')."\n"); |
print_and_log(&mt('Failed to get MySQL root password from user input.')."\n"); |
Line 1745 INSERT db (Host,Db,User,Select_priv,Inse
|
Line 1983 INSERT db (Host,Db,User,Select_priv,Inse
|
if (@mysql_commands) { |
if (@mysql_commands) { |
foreach my $cmd (@mysql_commands) { |
foreach my $cmd (@mysql_commands) { |
$dbh->do($cmd) || print $dbh->errstr."\n"; |
$dbh->do($cmd) || print $dbh->errstr."\n"; |
|
|
} |
} |
} |
} |
if (@mysql_lc_commands) { |
if (@mysql_lc_commands) { |
Line 1767 INSERT db (Host,Db,User,Select_priv,Inse
|
Line 2004 INSERT db (Host,Db,User,Select_priv,Inse
|
} |
} |
|
|
sub new_mysql_rootpasswd { |
sub new_mysql_rootpasswd { |
my ($currmysqlpass) = @_; |
my ($currmysqlpass,$usesauth) = @_; |
return ("SET PASSWORD FOR 'root'\@'localhost'=PASSWORD('$currmysqlpass')", |
if ($usesauth) { |
"FLUSH PRIVILEGES;"); |
return ("ALTER USER 'root'\@'localhost' IDENTIFIED WITH mysql_native_password BY '$currmysqlpass'", |
|
"FLUSH PRIVILEGES;"); |
|
} else { |
|
return ("SET PASSWORD FOR 'root'\@'localhost'=PASSWORD('$currmysqlpass')", |
|
"FLUSH PRIVILEGES;"); |
|
} |
} |
} |
|
|
sub get_mysql_version { |
sub get_mysql_version { |
my $version; |
my ($version,$subversion,$name); |
if (open(PIPE," mysql -V |")) { |
if (open(PIPE," mysql -V |")) { |
my $info = <PIPE>; |
my $info = <PIPE>; |
chomp($info); |
chomp($info); |
close(PIPE); |
close(PIPE); |
($version) = ($info =~ /(\d+\.\d+)\.\d+,/); |
($version,$subversion,$name) = ($info =~ /(\d+\.\d+)\.(\d+)\-?(\w*),/); |
} else { |
} else { |
print &mt('Could not determine which version of MySQL is installed.'). |
print &mt('Could not determine which version of MySQL is installed.'). |
"\n"; |
"\n"; |
} |
} |
return $version; |
return ($version,$subversion,$name); |
} |
} |
|
|
########################################################### |
########################################################### |
Line 1794 sub get_mysql_version {
|
Line 2036 sub get_mysql_version {
|
########################################################### |
########################################################### |
|
|
sub copy_httpd_conf { |
sub copy_httpd_conf { |
my ($instdir,$distro) = @_; |
my ($instdir,$distro,$hostname) = @_; |
my $configfile = 'httpd.conf'; |
my $configfile = 'httpd.conf'; |
if ($distro =~ /^(?:centos|rhes|scientific)(\d+)$/) { |
if ($distro =~ /^(?:centos|rhes|scientific)(\d+)$/) { |
if ($1 >= 7) { |
if ($1 >= 7) { |
Line 1817 sub copy_httpd_conf {
|
Line 2059 sub copy_httpd_conf {
|
print_and_log("\n"); |
print_and_log("\n"); |
} |
} |
|
|
|
############################################### |
|
## |
|
## Copy/Modify loncapassl.conf |
|
## |
|
############################################### |
|
|
|
sub copy_apache_sslconf_file { |
|
my ($instdir,$targetdir,$hostname) = @_; |
|
my ($success,$error); |
|
if (-e "$instdir/loncapassl.conf") { |
|
if (open(my $fh,'<',"$instdir/loncapassl.conf")) { |
|
if (open(my $out,'>',"$targetdir/loncapassl.conf")) { |
|
while (<$fh>) { |
|
if (/^\QServerName internal-\E/) { |
|
chomp(); |
|
s/^(\QServerName internal-\E)(.*)$/$1$hostname\n/; |
|
} |
|
print $out $_; |
|
} |
|
$success = 1; |
|
} else { |
|
$error = "Could not write to $targetdir/loncapassl.conf"; |
|
} |
|
} else { |
|
$error = "Could not read from $instdir/loncapassl.conf"; |
|
} |
|
} else { |
|
$error = "File to copy from: $instdir/loncapassl.conf does not exist"; |
|
} |
|
if ($success) { |
|
print_and_log(&mt('Successfully copied [_1] to [_2].',"'loncapassl.conf'","'$targetdir/loncapassl.conf'")."\n"); |
|
chmod(0444,"$targetdir/loncapassl.conf"); |
|
} else { |
|
print_and_log(&mt('Failed to copy [_1] to [_2].',"'loncapassl.conf'","'$targetdir/loncapassl.conf'")."\n"); |
|
if ($error) { |
|
print_and_log("$error\n"); |
|
} |
|
} |
|
return $success; |
|
} |
|
|
######################################################### |
######################################################### |
## |
## |
## Ubuntu/Debian -- copy our loncapa configuration file to |
## Ubuntu/Debian -- copy our loncapa configuration file to |
Line 1825 sub copy_httpd_conf {
|
Line 2108 sub copy_httpd_conf {
|
######################################################### |
######################################################### |
|
|
sub copy_apache2_debconf { |
sub copy_apache2_debconf { |
my ($instdir,$distro) = @_; |
my ($instdir,$distro,$hostname) = @_; |
my $apache2_mods_enabled_dir = '/etc/apache2/mods-enabled'; |
my $apache2_mods_enabled_dir = '/etc/apache2/mods-enabled'; |
my $apache2_mods_available_dir = '/etc/apache2/mods-available'; |
my $apache2_mods_available_dir = '/etc/apache2/mods-available'; |
foreach my $module ('headers.load','expires.load') { |
foreach my $module ('headers.load','expires.load') { |
Line 1849 sub copy_apache2_debconf {
|
Line 2132 sub copy_apache2_debconf {
|
unlink($defaultconfig); |
unlink($defaultconfig); |
} |
} |
if (($distname eq 'ubuntu') && ($version > 12)) { |
if (($distname eq 'ubuntu') && ($version > 12)) { |
print_and_log(&mt('Copying loncapa [_1] config file to [_2] and pointing [_3] to it from conf-enabled.',"'apache2'","'/etc/apache2/conf-available'","'loncapa symlink'")."\n"); |
print_and_log(&mt('Copying loncapa [_1] config file to [_2] and pointing [_3] to it from conf-enabled.',"'apache2'","'/etc/apache2/conf-available'","'loncapa.conf symlink'")."\n"); |
my $apache2_conf_enabled_dir = '/etc/apache2/conf-enabled'; |
my $apache2_conf_enabled_dir = '/etc/apache2/conf-enabled'; |
my $apache2_conf_available_dir = '/etc/apache2/conf-available'; |
my $apache2_conf_available_dir = '/etc/apache2/conf-available'; |
if (-e "$apache2_conf_available_dir/loncapa") { |
if (-e "$apache2_conf_available_dir/loncapa") { |
copy("$apache2_conf_available_dir/loncapa","$apache2_conf_available_dir/loncapa.original"); |
copy("$apache2_conf_available_dir/loncapa","$apache2_conf_available_dir/loncapa.original"); |
} |
} |
copy("$instdir/debian-ubuntu/loncapa","$apache2_conf_available_dir/loncapa"); |
my $defaultconf = $apache2_conf_enabled_dir.'/loncapa.conf'; |
|
copy("$instdir/debian-ubuntu/ubuntu14/loncapa_conf","$apache2_conf_available_dir/loncapa"); |
chmod(0444,"$apache2_conf_available_dir/loncapa"); |
chmod(0444,"$apache2_conf_available_dir/loncapa"); |
symlink("$apache2_conf_available_dir/loncapa","$apache2_conf_enabled_dir/loncapa.conf"); |
if (-l $defaultconf) { |
|
unlink($defaultconf); |
|
} |
|
symlink("$apache2_conf_available_dir/loncapa","$defaultconf"); |
|
print_and_log(&mt('Copying loncapa [_1] site file to [_2] and pointing [_3] to it from sites-enabled.',"'apache2'","'/etc/apache2/sites-available'","'000-default.conf symlink'")."\n"); |
|
copy("$instdir/debian-ubuntu/ubuntu14/loncapa_site","$apache2_sites_available_dir/loncapa"); |
|
chmod(0444,"$apache2_sites_available_dir/loncapa"); |
|
symlink("$apache2_sites_available_dir/loncapa","$defaultconfig"); |
} else { |
} else { |
print_and_log(&mt('Copying loncapa [_1] config file to [_2] and pointing [_3] to it from sites-enabled.',"'apache2'","'/etc/apache2/sites-available'","'000-default symlink'")."\n"); |
print_and_log(&mt('Copying loncapa [_1] config file to [_2] and pointing [_3] to it from sites-enabled.',"'apache2'","'/etc/apache2/sites-available'","'000-default symlink'")."\n"); |
if (-e "$apache2_sites_available_dir/loncapa") { |
if (-e "$apache2_sites_available_dir/loncapa") { |
Line 1879 sub copy_apache2_debconf {
|
Line 2170 sub copy_apache2_debconf {
|
########################################################### |
########################################################### |
|
|
sub copy_apache2_suseconf { |
sub copy_apache2_suseconf { |
my ($instdir) = @_; |
my ($instdir,$hostname) = @_; |
print_and_log(&mt('Copying the LON-CAPA [_1] to [_2].', |
print_and_log(&mt('Copying the LON-CAPA [_1] to [_2].', |
"'default-server.conf'", |
"'default-server.conf'", |
"'/etc/apache2/default-server.conf'")."\n"); |
"'/etc/apache2/default-server.conf'")."\n"); |