--- doc/install/linux/install.pl 2020/11/11 20:58:37 1.68 +++ doc/install/linux/install.pl 2021/12/21 14:31:52 1.81 @@ -29,6 +29,7 @@ use Term::ReadKey; use Socket; use Sys::Hostname::FQDN(); use DBI; +use File::Spec; use Cwd(); use File::Basename(); use lib File::Basename::dirname(Cwd::abs_path($0)); @@ -77,7 +78,7 @@ if (!open(LOG,">>loncapa_install.log")) &mt('Stopping execution.')."\n"; exit; } else { - print LOG '$Id: install.pl,v 1.68 2020/11/11 20:58:37 raeburn Exp $'."\n"; + print LOG '$Id: install.pl,v 1.81 2021/12/21 14:31:52 raeburn Exp $'."\n"; } # @@ -211,8 +212,11 @@ sub get_distro { $distro = 'rhes'.$1; $updatecmd = 'dnf install LONCAPA-prerequisites'; $installnow = 'dnf -y install LONCAPA-prerequisites'; - } elsif ($versionstring =~ /CentOS(?:| Linux) release (\d+)/) { - $distro = 'centos'.$1; + } elsif ($versionstring =~ /CentOS(| Linux| Stream) release (\d+)/) { + $distro = 'centos'.$2; + if ($1 eq ' Stream') { + $distro .= '-stream'; + } $updatecmd = 'yum install LONCAPA-prerequisites'; $installnow = 'yum -y install LONCAPA-prerequisites'; } elsif ($versionstring =~ /Scientific Linux (?:SL )?release ([\d.]+) /) { @@ -221,6 +225,18 @@ sub get_distro { $distro = 'scientific'.$ver; $updatecmd = 'yum install LONCAPA-prerequisites'; $installnow = 'yum -y install LONCAPA-prerequisites'; + } elsif ($versionstring =~ /Rocky Linux release ([\d.]+)/) { + my $ver = $1; + $ver =~ s/\.\d+$//; + $distro = 'rocky'.$ver; + $updatecmd = 'dnf install LONCAPA-prerequisites'; + $installnow = 'dnf -y install LONCAPA-prerequisites'; + } elsif ($versionstring =~ /AlmaLinux release ([\d.]+) /) { + my $ver = $1; + $ver =~ s/\.\d+$//; + $distro = 'alma'.$ver; + $updatecmd = 'dnf install LONCAPA-prerequisites'; + $installnow = 'dnf -y install LONCAPA-prerequisites'; } else { print &mt('Unable to interpret [_1] to determine system type.', '/etc/redhat-release')."\n"; @@ -521,7 +537,7 @@ sub check_required { } my ($mysqlon,$mysqlsetup,$mysqlrestart,$dbh,$has_pass,$mysql_unix_socket,$has_lcdb, %recommended,$downloadstatus,$filetouse,$production,$testing,$apachefw, - $tostop,$uses_systemctl,$hostname,$hostip); + $tostop,$uses_systemctl,$mysql_has_wwwuser,$hostname,$hostip); my $wwwuid = &uid_of_www(); my $wwwgid = getgrnam('www'); if (($wwwuid eq '') || ($wwwgid eq '')) { @@ -551,9 +567,8 @@ sub check_required { print_and_log("\n".&mt('Hostname is [_1] and IP address is [_2]',$hostname,$hostip)."\n"); $mysqlon = &check_mysql_running($distro); if ($mysqlon) { - my $mysql_has_wwwuser = &check_mysql_wwwuser(); ($mysqlsetup,$has_pass,$dbh,$mysql_has_wwwuser,$mysql_unix_socket) = - &check_mysql_setup($instdir,$dsn,$distro,$mysql_has_wwwuser); + &check_mysql_setup($instdir,$dsn,$distro); if ($mysqlsetup eq 'needsrestart') { $mysqlrestart = ''; if ($distro eq 'ubuntu') { @@ -585,7 +600,7 @@ sub check_required { $nochgstd,$nochgint) = &chkapachessl($distro,$instdir,$hostname,$hostip); $recommended{'stopsrvcs'} = &chksrvcs($distro,$tostop); ($recommended{'download'},$downloadstatus,$filetouse,$production,$testing) - = &need_download(); + = &need_download($distro,$instdir); return ($distro,$gotprereqs,$localecmd,$packagecmd,$updatecmd,$installnow, $mysqlrestart,\%recommended,$dbh,$has_pass,$mysql_unix_socket, $has_lcdb,$downloadstatus,$filetouse,$production,$testing,$apachefw, @@ -616,7 +631,10 @@ sub check_mysql_running { if ($1 >= 19) { $mysqldaemon ='mariadb'; } - } elsif ($distro =~ /^(?:centos|rhes|scientific|oracle)(\d+)/) { + if ($1 >= 34) { + $process = 'mariadb'; + } + } elsif ($distro =~ /^(?:centos|rhes|scientific|oracle|rocky|alma)(\d+)/) { if ($1 >= 7) { $mysqldaemon ='mariadb'; $process = 'mysqld'; @@ -763,7 +781,7 @@ sub chkconfig { if ($version >= 26) { $daemon{'ntp'} = 'chronyd'; } - } elsif ($distro =~ /^(?:centos|rhes|scientific|oracle)(\d+)/) { + } elsif ($distro =~ /^(?:centos|rhes|scientific|oracle|rocky|alma)(\d+)/) { my $version = $1; if ($version >= 7) { $uses_systemctl{'ntp'} = 1; @@ -879,20 +897,20 @@ sub uses_firewalld { if ($1 >= 18) { $checkfirewalld = 1; } - } elsif ($distro =~ /^(?:centos|rhes|scientific|oracle)(\d+)/) { + } elsif ($distro =~ /^(?:centos|rhes|scientific|oracle|rocky|alma)(\d+)/) { if ($1 >= 7) { $checkfirewalld = 1; } } if ($checkfirewalld) { my ($loaded,$active); - if (open(PIPE,"systemctl status firewalld |")) { + if (open(PIPE,"systemctl status firewalld 2>/dev/null |")) { while () { chomp(); if (/^\s*Loaded:\s+(\w+)/) { $loaded = $1; } - if (/^\s*Active\s+(\w+)/) { + if (/^\s*Active:\s+(\w+)/) { $active = $1; } } @@ -983,10 +1001,10 @@ sub chkapache { } else { my ($configfile,$sitefile); if (($distname eq 'ubuntu') && ($version > 12)) { - $sitefile = '/etc/apache2/sites-available/loncapa'; - $configfile = "/etc/apache2/conf-available/loncapa"; + $sitefile = '/etc/apache2/sites-available/loncapa.conf'; + $configfile = '/etc/apache2/conf-available/loncapa.conf'; } else { - $configfile = "/etc/apache2/sites-available/loncapa"; + $configfile = '/etc/apache2/sites-available/loncapa'; } if (($configfile ne '') && (-e $configfile) && (-e $stdconf)) { if (open(PIPE, "diff --brief $stdconf $configfile |")) { @@ -1072,7 +1090,7 @@ sub chkapache { } else { my $configfile = 'httpd.conf'; my $mpmfile = 'mpm.conf'; - if ($distro =~ /^(?:centos|rhes|scientific|oracle)(\d+)$/) { + if ($distro =~ /^(?:centos|rhes|scientific|oracle|rocky|alma)(\d+)/) { if ($1 >= 7) { $configfile = 'apache2.4/httpd.conf'; } elsif ($1 > 5) { @@ -1440,12 +1458,12 @@ sub chksrvcs { } sub need_download { + my ($distro,$instdir) = @_; my $needs_download = 1; my ($production,$testing,$stdsizes) = &download_versionslist(); - my ($rootdir,$localcurrent,$localtesting,%tarball,%localsize,%bymodtime, + my ($localcurrent,$localtesting,%tarball,%localsize,%bymodtime, %bysize,$filetouse,$downloadstatus); - $rootdir = '/root'; - if (opendir(my $dir,"$rootdir")) { + if (opendir(my $dir,$instdir)) { my (@lcdownloads,$version); foreach my $file (readdir($dir)) { if ($file =~ /^loncapa\-([\w\-.]+)\.tar\.gz$/) { @@ -1455,14 +1473,14 @@ sub need_download { } if (ref($stdsizes) eq 'HASH') { if ($version eq 'current') { - my @stats = stat("$rootdir/$file"); + my @stats = stat("$instdir/$file"); $localcurrent = $stats[7]; if ($localcurrent == $stdsizes->{$production}) { $needs_download = 0; $filetouse = $file; } } elsif ($version eq 'testing') { - my @stats = stat("$rootdir/$file"); + my @stats = stat("$instdir/$file"); $localtesting = $stats[7]; if ($localtesting == $stdsizes->{$testing}) { $needs_download = 0; @@ -1476,7 +1494,7 @@ sub need_download { if ($needs_download) { if (@lcdownloads > 0) { foreach my $version (@lcdownloads) { - my @stats = stat("$rootdir/$tarball{$version}"); + my @stats = stat("$instdir/$tarball{$version}"); my $mtime = $stats[9]; $localsize{$version} = $stats[7]; if ($mtime) { @@ -1509,28 +1527,28 @@ sub need_download { my $newest = $sorted[0]; if (ref($bymodtime{$newest}) eq 'ARRAY') { $downloadstatus = - "Latest LON-CAPA source download in $rootdir is: ". + "Latest LON-CAPA source download in $instdir is: ". join(',',@{$bymodtime{$newest}})." (downloaded ". localtime($newest).")\n"; } } else { $downloadstatus = - "The $rootdir directory already contains the latest LON-CAPA version:". + "The $instdir directory already contains the latest LON-CAPA version:". "\n".$filetouse."\n"."which can be used for installation.\n"; } } else { - $downloadstatus = "The $rootdir directory does not appear to contain any downloaded LON-CAPA source code files which can be used for installation.\n"; + $downloadstatus = "The $instdir directory does not appear to contain any downloaded LON-CAPA source code files which can be used for installation.\n"; } } } else { - $downloadstatus = "Could not open $rootdir directory to look for existing downloads of LON-CAPA source code.\n"; + $downloadstatus = "Could not open $instdir directory to look for existing downloads of LON-CAPA source code.\n"; } return ($needs_download,$downloadstatus,$filetouse,$production,$testing); } sub check_mysql_setup { - my ($instdir,$dsn,$distro,$mysql_has_wwwuser) = @_; - my ($mysqlsetup,$has_pass,$mysql_unix_socket); + my ($instdir,$dsn,$distro) = @_; + my ($mysqlsetup,$has_pass,$mysql_unix_socket,$mysql_has_wwwuser); my $dbh = DBI->connect($dsn,'root','',{'PrintError'=>0}); my ($mysqlversion,$mysqlsubver,$mysqlname) = &get_mysql_version(); if (($mysqlname =~ /^MariaDB/i) && ($mysqlversion >= 10.4)) { @@ -1547,16 +1565,30 @@ sub check_mysql_setup { if ($mysql_unix_socket) { print_and_log(&mt('MariaDB using unix_socket for root access from localhost.')."\n"); $mysqlsetup = 'rootok'; - $mysql_unix_socket = 1; - unless ($mysql_has_wwwuser) { - $mysql_has_wwwuser = &check_mysql_wwwuser(); - } + $mysql_has_wwwuser = &check_mysql_wwwuser($dbh); return ($mysqlsetup,$has_pass,$dbh,$mysql_has_wwwuser,$mysql_unix_socket); } } } if ($dbh) { - $mysqlsetup = 'noroot'; + $mysqlsetup = 'noroot'; + if (($mysqlname !~ /^MariaDB/i) && ($mysqlversion >= 5.7)) { + my $sth = $dbh->prepare("SELECT plugin from mysql.user where User='root'"); + $sth->execute(); + while (my $priv = $sth->fetchrow_array) { + if ($priv =~ /auth_socket/) { + $mysql_unix_socket = 1; + last; + } + } + $sth->finish(); + if ($mysql_unix_socket) { + print_and_log(&mt('MySQL using unix_socket for root access from localhost.')."\n"); + $mysqlsetup = 'rootok'; + $mysql_has_wwwuser = &check_mysql_wwwuser($dbh); + return ($mysqlsetup,$has_pass,$dbh,$mysql_has_wwwuser,$mysql_unix_socket); + } + } } elsif ($DBI::err =~ /1045/) { $has_pass = 1; } elsif ($distro =~ /^ubuntu(\d+)$/) { @@ -1569,16 +1601,15 @@ sub check_mysql_setup { } close(PIPE); } - unless ($mysql_has_wwwuser) { - $mysql_has_wwwuser = &check_mysql_wwwuser(); - } $dbh = DBI->connect($dsn,'root','',{'PrintError'=>0}); if ($dbh) { $mysqlsetup = 'noroot'; + $mysql_has_wwwuser = &check_mysql_wwwuser($dbh); } elsif ($DBI::err =~ /1045/) { $has_pass = 1; } else { $mysqlsetup = 'needsrestart'; + $mysql_has_wwwuser = &check_mysql_wwwuser(); return ($mysqlsetup,$has_pass,$dbh,$mysql_has_wwwuser); } } @@ -1590,6 +1621,7 @@ sub check_mysql_setup { if ($dbh) { $mysqlsetup = 'rootok'; print_and_log(&mt('Password accepted.')."\n"); + $mysql_has_wwwuser = &check_mysql_wwwuser($dbh); } else { $mysqlsetup = 'rootfail'; print_and_log(&mt('Problem accessing MySQL.')."\n"); @@ -1601,27 +1633,35 @@ sub check_mysql_setup { if ($dbh) { $mysqlsetup = 'rootok'; print_and_log(&mt('Password accepted.')."\n"); + $mysql_has_wwwuser = &check_mysql_wwwuser($dbh); } else { if ($DBI::err =~ /1045/) { print_and_log(&mt('Incorrect password.')."\n"); } + $mysql_has_wwwuser = &check_mysql_wwwuser(); } } } } elsif ($mysqlsetup ne 'noroot') { print_and_log(&mt('Problem accessing MySQL.')."\n"); $mysqlsetup = 'rootfail'; + $mysql_has_wwwuser = &check_mysql_wwwuser(); } return ($mysqlsetup,$has_pass,$dbh,$mysql_has_wwwuser); } sub check_mysql_wwwuser { + my ($dbh) = @_; my $mysql_wwwuser; - my $dbhn = DBI->connect("DBI:mysql:database=information_schema",'www','localhostkey', - {PrintError => +0}) || return; - if ($dbhn) { - $mysql_wwwuser = 1; - $dbhn->disconnect; + if ($dbh) { + $mysql_wwwuser = $dbh->selectrow_array("SELECT COUNT(User) FROM mysql.user WHERE (User = 'www' AND Host ='localhost')"); + } else { + my $dbhn = DBI->connect("DBI:mysql:database=information_schema",'www','localhostkey', + {PrintError => +0}) || return; + if ($dbhn) { + $mysql_wwwuser = 1; + $dbhn->disconnect; + } } return $mysql_wwwuser; } @@ -1981,26 +2021,41 @@ my $lctarball = 'loncapa-current.tar.gz' my $sourcetarball = $lctarball; if ($callsub{'download'}) { my ($production,$testing,$sizes) = &download_versionslist(); + my $homedir = '/root'; + if ($distro =~ /^ubuntu/) { + if ($instdir ne $homedir) { + ($homedir) = ($instdir =~ m{^(.*)/[^/]+$}); + } + } if ($production && $testing) { if ($production ne $testing) { print &mt('Two recent LON-CAPA releases are available: ')."\n". &mt('1.').' '.&mt('A production release - version: [_1].',$production)."\n". &mt('2.').' '.&mt('A testing release - version: [_1].',$testing)."\n\n". - &mt('Download the production release? ~[Y/n~]'); + &mt("After download, the tar.gz file will be extracted into $homedir")."\n\n". + &mt("Download the production release into $instdir? ~[Y/n~]"); if (&get_user_selection(1)) { $sourcetarball = 'loncapa-'.$production.'.tar.gz'; + print "$sourcetarball will be downloaded into $instdir\n"; } else { print "\n".&mt('Download the testing release? ~[Y/n~]'); if (&get_user_selection(1)) { $sourcetarball = 'loncapa-'.$testing.'.tar.gz'; + print "$sourcetarball will be downloaded into $instdir\n"; + } else { + $callsub{'download'} = 0; } } } } elsif ($production) { print &mt('The most recent LON-CAPA release is version: [_1].',$production)."\n". - &mt('Download the production release? ~[Y/n~]'); + &mt("After download, the tar.gz file will be extracted into $homedir")."\n\n". + &mt("Download the production release into $instdir? ~[Y/n~]"); if (&get_user_selection(1)) { $sourcetarball = 'loncapa-'.$production.'.tar.gz'; + print "$sourcetarball will be downloaded into $instdir\n"; + } else { + $callsub{'download'} = 0; } } } elsif ($filetouse ne '') { @@ -2025,7 +2080,7 @@ if ($callsub{'pwauth'}) { if ($callsub{'mysql'}) { if ($dbh) { &setup_mysql($callsub{'mysqlperms'},$dbh,$has_pass, - $mysql_unix_socket,$has_lcdb); + $mysql_unix_socket,$has_lcdb,$distro); } else { print &mt('Unable to configure MySQL because access is denied.')."\n"; } @@ -2148,14 +2203,16 @@ if ($callsub{'firewall'}) { if (keys(%added) > 0) { print &mt('Firewall configured to allow access for: [_1].', join(', ',sort(keys(%added))))."\n"; + system('firewall-cmd --reload'); } if ($current{'http'} || $current{'https'}) { print &mt('Firewall already configured to allow access for:[_1].', (($current{'http'})? ' http':'').(($current{'https'})? ' https':''))."\n"; } unless ($current{'ssh'}) { - print &mt('If you would the like to allow access to ssh from outside, use the command[_1].', - "firewall-cmd --permanent --zone=$zone --add-service=ssh")."\n"; + print &mt('If you would like to allow access to ssh from outside, use the commands:')."\n". + "firewall-cmd --permanent --zone=$zone --add-service=ssh\n". + "firewall-cmd --reload\n"; } } elsif ($distro =~ /^(suse|sles)/) { print &mt('Use [_1] to configure the firewall to allow access for [_2].', @@ -2183,7 +2240,7 @@ if ($callsub{'firewall'}) { 'ssh, http')."\n"; } else { my $version; - if ($distro =~ /^(redhat|centos)(\d+)$/) { + if ($distro =~ /^(redhat|centos)(\d+)/) { $version = $1; } if ($version > 5) { @@ -2214,10 +2271,11 @@ if ($callsub{'download'}) { print &mt('LON-CAPA is available for download from: [_1]', 'http://install.loncapa.org/')."\n"; if (!-e '/etc/loncapa-release') { - &print_and_log(&mt('LON-CAPA is not yet installed on your system.'). - "\n\n". - &mt('You may retrieve the source for LON-CAPA by executing:')."\n". - "wget http://install.loncapa.org/versions/$lctarball\n"); + &print_and_log(&mt('LON-CAPA is not yet installed on your system.')."\n\n"; + unless ($filetouse) { + &print_and_log(&mt('You may retrieve the source for LON-CAPA by executing:')."\n". + "wget http://install.loncapa.org/versions/$lctarball\n"); + } } else { my $currentversion; if (open(my $fh," 6) { + $lc_uses_systemctl = 1; + } + } elsif ($distro =~ /^(?:rhes|centos|rocky|alma)(\d+)/) { + if ($1 > 7) { + $lc_uses_systemctl = 1; + } + } elsif ($distro =~ /^ubuntu(\d+)$/) { + if ($1 > 16) { + $lc_uses_systemctl = 1; + } + $uses_sudo = 1; + } elsif ($distro =~ /^sles(\d+)$/) { + if ($1 > 12) { + $lc_uses_systemctl = 1; } - print "/etc/init.d/$apachename stop\n"; } - print "cd /root\n". - "tar zxf $sourcetarball\n". - "cd $lcdir\n". - "./UPDATE\n"; + if (!-e '/etc/loncapa-release') { + print &mt('If you are now ready to install LON-CAPA, enter the following commands:')."\n\n"; + } else { + my $lcstop = '/etc/init.d/loncontrol stop'; + if ($lc_uses_systemctl) { + $lcstop = 'systemctl stop loncontrol'; + } + my $apachestop = "/etc/init.d/$apachename stop"; + if ($uses_systemctl) { + $apachestop = "systemctl stop $apachename"; + } + if ($uses_sudo) { + $lcstop = 'sudo '.$lcstop; + $apachestop = 'sudo '.$apachestop; + } + print &mt('If you are now ready to update LON-CAPA, enter the following commands:'). + "\n\n$lcstop\n$apachestop\n"; + } + my ($extract,$update); + my $homedir = '/root'; + if ($uses_sudo) { + $extract = 'sudo '; + $update = 'sudo '; + if ($instdir ne $homedir) { + ($homedir) = ($instdir =~ m{^(.*)/[^/]+$}); + } + } + $extract .= "tar zxf $sourcetarball --directory $homedir"; + $update .= './UPDATE'; + print "$extract\n". + "cd $homedir/$lcdir\n". + "$update\n"; if (-e '/etc/loncapa-release') { - print "/etc/init.d/loncontrol start\n"; - print "/etc/init.d/$apachename start\n"; + my $lcstart = '/etc/init.d/loncontrol start'; + if ($lc_uses_systemctl) { + $lcstart = '/home/httpd/perl/loncontrol start'; + } + my $apachestart = "/etc/init.d/$apachename start"; + if ($uses_systemctl) { + $apachestart = "systemctl start $apachename"; + } + if ($uses_sudo) { + $lcstart = 'sudo '.$lcstart; + $apachestart = 'sudo '.$apachestart; + } + print "$lcstart\n"; + print "$apachestart\n"; } } exit; @@ -2453,10 +2565,20 @@ sub kill_extra_services { } sub setup_mysql { - my ($setup_mysql_permissions,$dbh,$has_pass,$mysql_unix_socket,$has_lcdb) = @_; + my ($setup_mysql_permissions,$dbh,$has_pass,$mysql_unix_socket,$has_lcdb,$distro) = @_; my @mysql_lc_commands; unless ($has_lcdb) { - push(@mysql_lc_commands,"CREATE DATABASE loncapa"); + my $createcmd = 'CREATE DATABASE loncapa'; + if ($distro =~ /^sles(\d+)/) { + if ($1 > 11) { + $createcmd .= ' CHARACTER SET utf8 COLLATE utf8_general_ci'; + } + } elsif ($distro =~ /^ubuntu(\d+)/) { + if ($1 > 16) { + $createcmd .= ' CHARACTER SET latin1 COLLATE latin1_swedish_ci'; + } + } + push(@mysql_lc_commands,$createcmd); } push(@mysql_lc_commands,"USE loncapa"); push(@mysql_lc_commands,qq{ @@ -2502,7 +2624,8 @@ sub setup_mysql_permissions { if ($usescreate) { @mysql_commands = ("CREATE USER 'www'\@'localhost' IDENTIFIED BY 'localhostkey'"); } elsif ($usesauth) { - @mysql_commands = ("INSERT user (Host, User, ssl_cipher, x509_issuer, x509_subject, authentication_string) VALUES('localhost','www','','','','')"); + @mysql_commands = ("INSERT user (Host, User, ssl_cipher, x509_issuer, x509_subject, authentication_string) VALUES('localhost','www','','','','')", + "FLUSH PRIVILEGES"); if ($is_mariadb) { push(@mysql_commands,"ALTER USER 'www'\@'localhost' IDENTIFIED BY 'localhostkey'"); } else { @@ -2631,7 +2754,7 @@ sub get_mysql_version { sub copy_httpd_conf { my ($instdir,$distro,$hostname) = @_; my $configfile = 'httpd.conf'; - if ($distro =~ /^(?:centos|rhes|scientific|oracle)(\d+)$/) { + if ($distro =~ /^(?:centos|rhes|scientific|oracle|rocky|alma)(\d+)/) { if ($1 >= 7) { $configfile = 'apache2.4/httpd.conf'; } elsif ($1 > 5) { @@ -2678,7 +2801,7 @@ sub copy_mpm_conf { print_and_log("\n"); } else { my $logfail; - if ($distro =~ /^(?:centos|rhes|scientific|oracle)(\d+)$/) { + if ($distro =~ /^(?:centos|rhes|scientific|oracle|rocky|alma)(\d+)/) { if ($1 > 7) { $logfail = 1; } @@ -3193,6 +3316,7 @@ sub copy_apache2_debconf { my $apache2_sites_enabled_dir = '/etc/apache2/sites-enabled'; my $apache2_sites_available_dir = '/etc/apache2/sites-available'; my $defaultconfig = "$apache2_sites_enabled_dir/000-default"; + my $defaultsite = "$apache2_sites_enabled_dir/loncapa.conf"; my ($distname,$version); if ($distro =~ /^(debian|ubuntu)(\d+)$/) { $distname = $1; @@ -3212,11 +3336,39 @@ sub copy_apache2_debconf { close(PIPE); chomp($diffres); if ($diffres) { - copy("$apache2_conf_available_dir/loncapa","$apache2_conf_available_dir/loncapa.original"); + copy("$apache2_conf_available_dir/loncapa","$apache2_conf_available_dir/loncapa.conf.original"); + } else { + copy("$apache2_conf_available_dir/loncapa","$apache2_conf_available_dir/loncapa.conf"); + chdir($apache2_conf_enabled_dir); + symlink('../conf-available/loncapa.conf','loncapa.conf'); + chdir($instdir); } if (-l $defaultconf) { my $linkfname = readlink($defaultconf); + if ($linkfname ne '') { + $linkfname = Cwd::abs_path(File::Spec->rel2abs($linkfname,$apache2_conf_enabled_dir)); + } if ($linkfname eq "$apache2_conf_available_dir/loncapa") { + unlink($defaultconf); + } + } + unlink("$apache2_conf_available_dir/loncapa"); + } + } + if ((-e "$apache2_conf_available_dir/loncapa.conf") && (-e "$instdir/debian-ubuntu/ubuntu14/loncapa_conf")) { + if (open(PIPE, "diff --brief $apache2_conf_available_dir/loncapa.conf $instdir/debian-ubuntu/ubuntu14/loncapa_conf |")) { + my $diffres = ; + close(PIPE); + chomp($diffres); + if ($diffres) { + copy("$apache2_conf_available_dir/loncapa.conf","$apache2_conf_available_dir/loncapa.conf.original"); + } + if (-l $defaultconf) { + my $linkfname = readlink($defaultconf); + if ($linkfname ne '') { + $linkfname = Cwd::abs_path(File::Spec->rel2abs($linkfname,$apache2_conf_enabled_dir)); + } + if ($linkfname eq "$apache2_conf_available_dir/loncapa.conf") { unless ($diffres) { $skipconf = 1; } @@ -3226,12 +3378,14 @@ sub copy_apache2_debconf { } unless ($skipconf) { 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"); - copy("$instdir/debian-ubuntu/ubuntu14/loncapa_conf","$apache2_conf_available_dir/loncapa"); - chmod(0444,"$apache2_conf_available_dir/loncapa"); + copy("$instdir/debian-ubuntu/ubuntu14/loncapa_conf","$apache2_conf_available_dir/loncapa.conf"); + chmod(0444,"$apache2_conf_available_dir/loncapa.conf"); if (-l $defaultconf) { unlink($defaultconf); } - symlink("$apache2_conf_available_dir/loncapa","$defaultconf"); + chdir($apache2_conf_enabled_dir); + symlink('../conf-available/loncapa.conf','loncapa.conf'); + chdir($instdir); } my $stdsite = "$instdir/debian-ubuntu/ubuntu14/loncapa_site"; if ((-e $stdsite) && (-e "$apache2_sites_available_dir/loncapa")) { @@ -3240,11 +3394,36 @@ sub copy_apache2_debconf { close(PIPE); chomp($diffres); if ($diffres) { - copy("$apache2_sites_available_dir/loncapa","$apache2_sites_available_dir/loncapa.original"); + copy("$apache2_sites_available_dir/loncapa","$apache2_sites_available_dir/loncapa.conf.original"); + } else { + copy("$apache2_sites_available_dir/loncapa","$apache2_sites_available_dir/loncapa.conf"); } if (-l $defaultconfig) { my $linkfname = readlink($defaultconfig); + if ($linkfname ne '') { + $linkfname = Cwd::abs_path(File::Spec->rel2abs($linkfname,$apache2_sites_enabled_dir)); + } if ($linkfname eq "$apache2_sites_available_dir/loncapa") { + unlink($defaultconfig); + } + } + unlink("$apache2_sites_available_dir/loncapa"); + } + } + if ((-e $stdsite) && (-e "$apache2_sites_available_dir/loncapa.conf")) { + if (open(PIPE, "diff --brief $stdsite $apache2_sites_available_dir/loncapa.conf |")) { + my $diffres = ; + close(PIPE); + chomp($diffres); + if ($diffres) { + copy("$apache2_sites_available_dir/loncapa.conf","$apache2_sites_available_dir/loncapa.conf.original"); + } + if (-l $defaultsite) { + my $linkfname = readlink($defaultsite); + if ($linkfname ne '') { + $linkfname = Cwd::abs_path(File::Spec->rel2abs($linkfname,$apache2_sites_enabled_dir)); + } + if ($linkfname eq "$apache2_sites_available_dir/loncapa.conf") { unless ($diffres) { $skipsite = 1; } @@ -3253,10 +3432,21 @@ sub copy_apache2_debconf { } } unless ($skipsite) { - 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"); + print_and_log(&mt('Copying loncapa [_1] site file to [_2] and pointing [_3] to it from sites-enabled.',"'apache2'","'/etc/apache2/sites-available'","'loncapa.conf symlink'")."\n"); + copy("$instdir/debian-ubuntu/ubuntu14/loncapa_site","$apache2_sites_available_dir/loncapa.conf"); + chmod(0444,"$apache2_sites_available_dir/loncapa.conf"); + chdir($apache2_sites_enabled_dir); + symlink('../sites-available/loncapa.conf','loncapa.conf'); + chdir($instdir); + } + if (-l $defaultconfig) { + my $linkfname = readlink($defaultconfig); + if ($linkfname ne '') { + $linkfname = Cwd::abs_path(File::Spec->rel2abs($linkfname,$apache2_sites_enabled_dir)); + } + if ($linkfname eq "$apache2_sites_available_dir/000-default.conf") { + unlink($defaultconfig); + } } } else { if ((-e "$instdir/debian-ubuntu/loncapa") && (-e "$apache2_sites_available_dir/loncapa")) { @@ -3490,31 +3680,47 @@ sub download_loncapa { print_and_log(" ------------------------------------------------------------------------ -".&mt('You seem to have a version of loncapa-current.tar.gz in [_1]',$instdir)."\n". +".&mt('You seem to have a version of [_1] in [_2]',$lctarball,$instdir)."\n". &mt('This copy will be used and a new version will NOT be downloaded.')."\n". &mt('If you wish, you may download a new version by executing:')." -wget http://install.loncapa.org/versions/loncapa-current.tar.gz +wget http://install.loncapa.org/versions/$lctarball ------------------------------------------------------------------------ "); } ## - ## untar loncapa.tar.gz + ## untar loncapa-X.Y.Z.tar.gz ## if ($have_tarball) { + my $homedir = '/root'; + my ($targetdir,$chdircmd,$updatecmd); + if (($distro =~ /^ubuntu/) && ($instdir ne $homedir)) { + ($homedir) = ($instdir =~ m{^(.*)/[^/]+$}); + $updatecmd = 'sudo ./UPDATE'; + } else { + $updatecmd = './UPDATE'; + } print_and_log(&mt('Extracting LON-CAPA source files')."\n"); - writelog(`cd ~root; tar zxf $instdir/$lctarball`); + if (-e $homedir) { + writelog(`tar zxf $instdir/$lctarball --directory $homedir`); + $targetdir = $homedir; + } else { + writelog(`tar zxf $instdir/$lctarball`); + $targetdir = $instdir; + } + if ($lctarball =~ /^loncapa\-(\d+\.\d+\.\d+(?:|[^.]+))\.tar\.gz$/) { + $chdircmd = "cd $targetdir/loncapa-".$1; + } else { + $chdircmd = "cd $targetdir/loncapa-X.Y.Z (X.Y.Z should correspond to a version number like '2.11.3')"; + } print_and_log("\n"); print &mt('LON-CAPA source files extracted.')."\n". - &mt('It remains for you to execute the following commands:')." - -cd /root/loncapa-X.Y.Z (X.Y.Z should correspond to a version number like '2.11.3') -./UPDATE - -".&mt('If you have any trouble, please see [_1] and [_2]', - 'http://install.loncapa.org/','http://help.loncapa.org/')."\n"; + &mt('It remains for you to execute the following commands:'). + "\n$chdircmd\n$updatecmd\n". + &mt('If you have any trouble, please see [_1] and [_2]', + 'http://install.loncapa.org/','http://help.loncapa.org/')."\n"; $updateshown = 1; } return ($have_tarball,$updateshown);