--- doc/install/linux/install.pl 2021/03/28 22:00:27 1.45.2.14 +++ doc/install/linux/install.pl 2021/03/29 03:50:33 1.45.2.16 @@ -76,7 +76,7 @@ if (!open(LOG,">>loncapa_install.log")) &mt('Stopping execution.')."\n"; exit; } else { - print LOG '$Id: install.pl,v 1.45.2.14 2021/03/28 22:00:27 raeburn Exp $'."\n"; + print LOG '$Id: install.pl,v 1.45.2.16 2021/03/29 03:50:33 raeburn Exp $'."\n"; } # @@ -499,7 +499,7 @@ sub check_required { $recommended{'apache'} = &chkapache($distro,$instdir); $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, @@ -799,13 +799,13 @@ sub uses_firewalld { } 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; } } @@ -1065,12 +1065,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$/) { @@ -1080,14 +1080,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; @@ -1101,7 +1101,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) { @@ -1134,21 +1134,21 @@ 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); } @@ -1216,7 +1216,7 @@ sub check_mysql_setup { $has_pass = 1; } else { $mysqlsetup = 'needsrestart'; - $mysql_has_wwwuser = &check_mysql_wwwuser(); + $mysql_has_wwwuser = &check_mysql_wwwuser(); return ($mysqlsetup,$has_pass,$dbh,$mysql_has_wwwuser); } } @@ -1245,14 +1245,14 @@ sub check_mysql_setup { if ($DBI::err =~ /1045/) { print_and_log(&mt('Incorrect password.')."\n"); } - $mysql_has_wwwuser = &check_mysql_wwwuser(); + $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(); + $mysql_has_wwwuser = &check_mysql_wwwuser(); } return ($mysqlsetup,$has_pass,$dbh,$mysql_has_wwwuser); } @@ -1624,26 +1624,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 '') { @@ -1668,7 +1683,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"; } @@ -1855,6 +1870,9 @@ if ($callsub{'download'}) { print "\n".&mt('Requested configuration complete.')."\n\n"; if ($have_tarball && !$updateshown) { my ($lcdir) = ($sourcetarball =~ /^([\w.\-]+)\.tar.gz$/); + if ($lcdir eq 'loncapa-current') { + $lcdir = "loncapa-X.Y.Z (X.Y.Z should correspond to a version number like '2.11.3')"; + } my ($apachename,$lc_uses_systemctl,$uses_sudo); if ($distro =~ /^(suse|sles|debian|ubuntu)([\d.]+)/) { if (($1 eq 'suse') && ($2 < 10)) { @@ -1895,16 +1913,26 @@ if ($have_tarball && !$updateshown) { $apachestop = "systemctl stop $apachename"; } if ($uses_sudo) { - $lcstop = 'sudo '.$lcstop; + $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"; } - print "cd /root\n". - "tar zxf $sourcetarball\n". - "cd $lcdir\n". - "./UPDATE\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') { my $lcstart = '/etc/init.d/loncontrol start'; if ($lc_uses_systemctl) { @@ -2103,10 +2131,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{ @@ -2152,7 +2190,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 { @@ -2730,31 +2769,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);