Diff for /doc/install/linux/install.pl between versions 1.18 and 1.45.2.1

version 1.18, 2011/05/31 03:06:20 version 1.45.2.1, 2019/02/16 16:19:11
Line 27  use strict; Line 27  use strict;
 use File::Copy;  use File::Copy;
 use Term::ReadKey;  use Term::ReadKey;
 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 159  sub get_user_selection { Line 162  sub get_user_selection {
 }  }
   
 sub get_distro {  sub get_distro {
     my ($distro,$gotprereqs,$updatecmd,$packagecmd,$installnow);      my ($distro,$gotprereqs,$updatecmd,$packagecmd,$installnow,$unknown);
     $packagecmd = '/bin/rpm -q LONCAPA-prerequisites ';      $packagecmd = '/bin/rpm -q LONCAPA-prerequisites ';
     if (-e '/etc/redhat-release') {      if (-e '/etc/redhat-release') {
         open(IN,'</etc/redhat-release');          open(IN,'</etc/redhat-release');
Line 191  sub get_distro { Line 194  sub get_distro {
             $distro = 'rhes'.$1;              $distro = 'rhes'.$1;
             $updatecmd = 'yum install LONCAPA-prerequisites';              $updatecmd = 'yum install LONCAPA-prerequisites';
             $installnow = 'yum -y install LONCAPA-prerequisites';              $installnow = 'yum -y install LONCAPA-prerequisites';
         } elsif ($versionstring =~ /CentOS release (\d+)/) {          } elsif ($versionstring =~ /CentOS(?:| Linux) release (\d+)/) {
             $distro = 'centos'.$1;              $distro = 'centos'.$1;
             $updatecmd = 'yum install LONCAPA-prerequisites';              $updatecmd = 'yum install LONCAPA-prerequisites';
             $installnow = 'yum -y install LONCAPA-prerequisites';              $installnow = 'yum -y install LONCAPA-prerequisites';
         } elsif ($versionstring =~ /Scientific Linux (SL )?release ([\d.]+) /) {          } elsif ($versionstring =~ /Scientific Linux (?:SL )?release ([\d.]+) /) {
             my $ver = $1;              my $ver = $1;
             $ver =~ s/\.\d+$//;              $ver =~ s/\.\d+$//;
             $distro = 'scientific'.$ver;              $distro = 'scientific'.$ver;
Line 204  sub get_distro { Line 207  sub get_distro {
         } else {          } else {
             print &mt('Unable to interpret [_1] to determine system type.',              print &mt('Unable to interpret [_1] to determine system type.',
                       '/etc/redhat-release')."\n";                        '/etc/redhat-release')."\n";
               $unknown = 1;
         }          }
     } elsif (-e '/etc/SuSE-release') {      } elsif (-e '/etc/SuSE-release') {
         open(IN,'</etc/SuSE-release');          open(IN,'</etc/SuSE-release');
Line 230  sub get_distro { Line 234  sub get_distro {
         } else {          } else {
             print &mt('Unable to interpret [_1] to determine system type.',              print &mt('Unable to interpret [_1] to determine system type.',
                       '/etc/SuSE-release')."\n";                        '/etc/SuSE-release')."\n";
               $unknown = 1;
         }          }
     } elsif (-e '/etc/issue') {      } elsif (-e '/etc/issue') {
         open(IN,'</etc/issue');          open(IN,'</etc/issue');
         my $versionstring=<IN>;          my $versionstring=<IN>;
         chomp($versionstring);          chomp($versionstring);
         close(IN);          close(IN);
         $packagecmd = '/usr/bin/dpkg -l loncapa-prerequisites ';  
         $updatecmd = 'apt-get install loncapa-prerequisites';  
         if ($versionstring =~ /^Ubuntu (\d+)\.\d+/i) {          if ($versionstring =~ /^Ubuntu (\d+)\.\d+/i) {
             $distro = 'ubuntu'.$1;              $distro = 'ubuntu'.$1;
             $updatecmd = 'sudo apt-get install loncapa-prerequisites';              $updatecmd = 'sudo apt-get install loncapa-prerequisites';
         } elsif ($versionstring =~ /^Debian\s+GNU\/Linux\s+(\d+)\.\d+/i) {          } elsif ($versionstring =~ /^Debian\s+GNU\/Linux\s+(\d+)\.\d+/i) {
             $distro = 'debian'.$1;              $distro = 'debian'.$1;
               $updatecmd = 'apt-get install loncapa-prerequisites';
         } elsif (-e '/etc/debian_version') {          } elsif (-e '/etc/debian_version') {
             open(IN,'</etc/debian_version');              open(IN,'</etc/debian_version');
             my $version=<IN>;              my $version=<IN>;
Line 250  sub get_distro { Line 254  sub get_distro {
             close(IN);              close(IN);
             if ($version =~ /^(\d+)\.\d+\.?\d*/) {              if ($version =~ /^(\d+)\.\d+\.?\d*/) {
                 $distro='debian'.$1;                  $distro='debian'.$1;
                   $updatecmd = 'apt-get install loncapa-prerequisites';
             } else {              } else {
                 print &mt('Unable to interpret [_1] to determine system type.',                  print &mt('Unable to interpret [_1] to determine system type.',
                           '/etc/debian_version')."\n";                            '/etc/debian_version')."\n";
                   $unknown = 1;
             }              }
         } else {          }
             print &mt('Unable to interpret [_1] to determine system type.',          if ($distro ne '') {
                       '/etc/issue')."\n";              $packagecmd = '/usr/bin/dpkg -l loncapa-prerequisites ';
         }          }
     } elsif (-e '/etc/debian_version') {      } elsif (-e '/etc/debian_version') {
         open(IN,'</etc/debian_version');          open(IN,'</etc/debian_version');
Line 270  sub get_distro { Line 276  sub get_distro {
         } else {          } else {
             print &mt('Unable to interpret [_1] to determine system type.',              print &mt('Unable to interpret [_1] to determine system type.',
                       '/etc/debian_version')."\n";                        '/etc/debian_version')."\n";
               $unknown = 1;
           }
       }
       if (($distro eq '') && (!$unknown)) {
           if (-e '/etc/os-release') {
               if (open(IN,'<','/etc/os-release')) {
                   my ($id,$version);
                   while(<IN>) {
                       chomp();
                       if (/^ID="(\w+)"/) {
                           $id=$1;
                       } elsif (/^VERSION_ID="([\d\.]+)"/) {
                           $version=$1;
                       }
                   }
                   close(IN);
                   if ($id eq 'sles') {
                       my ($major,$minor) = split(/\./,$version);
                       if ($major =~ /^\d+$/) {
                           $distro = $id.$major;
                           $updatecmd = 'zypper install LONCAPA-prerequisites';
                       }
                   }
               }
               if ($distro eq '') {
                   print &mt('Unable to interpret [_1] to determine system type.',
                             '/etc/os-release')."\n";
                   $unknown = 1;
               }
           } else {
               print &mt('Unknown installation: expecting a debian, ubuntu, suse, sles, redhat, fedora or scientific linux system.')."\n";
         }          }
     } else {  
         print &mt('Unknown installation: expecting a debian, ubuntu, suse, sles, redhat, fedora or scientific linux system.')."\n";  
     }      }
     return ($distro,$packagecmd,$updatecmd,$installnow);      return ($distro,$packagecmd,$updatecmd,$installnow);
 }  }
Line 314  sub check_locale { Line 349  sub check_locale {
             print &mt('Failed to open: [_1], default locale not checked.',              print &mt('Failed to open: [_1], default locale not checked.',
                       '/etc/default/locale');                        '/etc/default/locale');
         }          }
     } elsif ($distro =~ /^(suse|sles)/) {      } elsif ($distro =~ /^(suse|sles)(\d+)/) {
         if (!open($fh,"</etc/sysconfig/language")) {          if (($1 eq 'sles') && ($2 >= 15)) {
               if (!open($fh,"</etc/locale.conf")) {
                   print &mt('Failed to open: [_1], default locale not checked.',
                             '/etc/locale.conf');
               }
           } else {
               if (!open($fh,"</etc/sysconfig/language")) {
                   print &mt('Failed to open: [_1], default locale not checked.',
                             '/etc/sysconfig/language');
               }
               $langvar = 'RC_LANG';
           }
       } elsif ($distro =~ /^fedora(\d+)/) {
           if ($1 >= 18) {
               if (!open($fh,"</etc/locale.conf")) {
                   print &mt('Failed to open: [_1], default locale not checked.',
                             '/etc/locale.conf');
               }
           } elsif (!open($fh,"</etc/sysconfig/i18n")) {
               print &mt('Failed to open: [_1], default locale not checked.',
                         '/etc/sysconfig/i18n');
           }
       } elsif ($distro =~ /^(?:rhes|centos|scientific)(\d+)/) {
           if ($1 >= 7) {
               if (!open($fh,"</etc/locale.conf")) {
                   print &mt('Failed to open: [_1], default locale not checked.',
                             '/etc/locale.conf');
               }
           } elsif (!open($fh,"</etc/sysconfig/i18n")) {
             print &mt('Failed to open: [_1], default locale not checked.',              print &mt('Failed to open: [_1], default locale not checked.',
                       '/etc/sysconfig/language');                        '/etc/sysconfig/i18n');
         }          }
         $langvar = 'RC_LANG';  
     } else {      } else {
         if (!open($fh,"</etc/sysconfig/i18n")) {          if (!open($fh,"</etc/sysconfig/i18n")) {
             print &mt('Failed to open: [_1], default locale not checked.',              print &mt('Failed to open: [_1], default locale not checked.',
Line 329  sub check_locale { Line 391  sub check_locale {
     my @data = <$fh>;      my @data = <$fh>;
     chomp(@data);      chomp(@data);
     foreach my $item (@data) {      foreach my $item (@data) {
         if ($item =~ /^\Q$langvar\E=\"([^\"]*)\"/) {          if ($item =~ /^\Q$langvar\E=\"?([^\"]*)\"?/) {
             my $default = $1;              my $default = $1;
             if ($default ne 'en_US.UTF-8') {              if ($default ne 'en_US.UTF-8') {
                 if ($distro =~ /^debian/) {                  if ($distro =~ /^debian/) {
                     $command = 'dpkg-reconfigure locales';                      $command = 'locale-gen en_US.UTF-8'."\n".
                                  'update-locale LANG=en_US.UTF-8';
                 } elsif ($distro =~ /^ubuntu/) {                  } elsif ($distro =~ /^ubuntu/) {
                     $command = 'sudo set-language-env -E';                       $command = 'sudo locale-gen en_US.UTF-8'."\n".
                                  'sudo update-locale LANG=en_US.UTF-8';
                 } elsif ($distro =~ /^(suse|sles)/) {                  } elsif ($distro =~ /^(suse|sles)/) {
                     $command = 'yast language';                       $command = 'yast language'; 
                 } else {                  } else {
Line 357  sub check_required { Line 421  sub check_required {
     }      }
     my $gotprereqs = &check_prerequisites($packagecmd,$distro);       my $gotprereqs = &check_prerequisites($packagecmd,$distro); 
     if ($gotprereqs eq '') {      if ($gotprereqs eq '') {
         return ($distro,$gotprereqs);          return ($distro,$gotprereqs,'',$packagecmd,$updatecmd);
     }      }
     my $localecmd = &check_locale($distro);      my $localecmd = &check_locale($distro);
     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);
     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 376  sub check_required { Line 440  sub check_required {
     $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{'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);
 }  }
   
 sub check_mysql_running {  sub check_mysql_running {
     my ($distro) = @_;      my ($distro) = @_;
       my $use_systemctl;
     my $mysqldaemon ='mysqld';      my $mysqldaemon ='mysqld';
     if ($distro =~ /^(suse|sles|debian|ubuntu)/) {      if ($distro =~ /^(suse|sles|debian|ubuntu)/) {
         $mysqldaemon = 'mysql';          $mysqldaemon = 'mysql';
Line 416  sub check_mysql_running { Line 490  sub check_mysql_running {
             $process = 'mysqld';              $process = 'mysqld';
             $proc_owner = 'mysql';              $proc_owner = 'mysql';
         }          }
       } elsif ($distro =~ /^fedora(\d+)/) {
           if ($1 >= 16) {
               $process = 'mysqld';
               $proc_owner = 'mysql';
               $use_systemctl = 1;
           }
           if ($1 >= 19) {
               $mysqldaemon ='mariadb';
           }
       } elsif ($distro =~ /^(?:centos|rhes|scientific)(\d+)/) {
           if ($1 >= 7) {
               $mysqldaemon ='mariadb';
               $process = 'mysqld';
               $proc_owner = 'mysql';
               $use_systemctl = 1;
           }
       } elsif ($distro =~ /^sles(\d+)/) {
           if ($1 >= 12) {
               $use_systemctl = 1;
               $proc_owner = 'mysql';
               $process = 'mysqld';
           }
           if ($1 >= 15) {
               $mysqldaemon ='mariadb';
           }
       } 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 425  sub check_mysql_running { Line 528  sub check_mysql_running {
             print_and_log(&mt('MySQL is running.')."\n");              print_and_log(&mt('MySQL is running.')."\n");
             return 1;              return 1;
         } else {          } else {
             system("/etc/init.d/$mysqldaemon start >/dev/null 2>&1 ");               if ($use_systemctl) {
                   system("/bin/systemctl start $mysqldaemon.service >/dev/null 2>&1 ");
               } else {
                   system("/etc/init.d/$mysqldaemon start >/dev/null 2>&1 ");
               }
             print_and_log(&mt('Waiting for MySQL to start.')."\n");              print_and_log(&mt('Waiting for MySQL to start.')."\n");
             sleep 5;              sleep 5;
             if (open(PIPE,"ps -ef |grep $process |grep -v grep 2>&1 |")) {              if (open(PIPE,"ps -ef |grep $process |grep -v grep 2>&1 |")) {
Line 460  sub check_mysql_running { Line 567  sub check_mysql_running {
   
 sub chkconfig {  sub chkconfig {
     my ($distro,$instdir) = @_;      my ($distro,$instdir) = @_;
     my (%needfix,%tostop);      my (%needfix,%tostop,%uses_systemctl);
     my $checker_bin = '/sbin/chkconfig';      my $checker_bin = '/sbin/chkconfig';
       my $sysctl_bin = '/bin/systemctl';
     my %daemon = (      my %daemon = (
                   mysql     => 'mysqld',                    mysql     => 'mysqld',
                   apache    => 'httpd',                    apache    => 'httpd',
Line 480  sub chkconfig { Line 588  sub chkconfig {
         if ($distro =~ /^(suse|sles)9/) {          if ($distro =~ /^(suse|sles)9/) {
             $daemon{'apache'} = 'apache';              $daemon{'apache'} = 'apache';
         }          }
           if ($distro =~ /^(suse|sles)([\d\.]+)/) {
               my $name = $1;
               my $num = $2;
               if ($num > 11) {
                   $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;
                       if (($name eq 'sles') && ($num >= 15)) {
                           $daemon{'ntp'} = 'chronyd';
                           $daemon{'mysql'} = 'mariadb';
                       } else {
                           $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';
         if (($distro =~ /^ubuntu/) && ($version <= 8)) {          if (($distro =~ /^ubuntu/) && ($version <= 8)) {
             $daemon{'cups'} = 'cupsys';              $daemon{'cups'} = 'cupsys';
         }          }
       } elsif ($distro =~ /^fedora(\d+)/) {
           my $version = $1;
           if ($version >= 15) {
               $uses_systemctl{'ntp'} = 1;
           }
           if ($version >= 16) {
               $uses_systemctl{'mysql'} = 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+)/) {
           my $version = $1;
           if ($version >= 7) {
               $uses_systemctl{'ntp'} = 1;
               $uses_systemctl{'mysql'} = 1;
               $uses_systemctl{'apache'} = 1;
               $uses_systemctl{'memcached'} = 1;
               $uses_systemctl{'cups'} = 1;
               $daemon{'mysql'} = 'mariadb';
           }
     }      }
       my $nocheck;
     if (! -x $checker_bin) {      if (! -x $checker_bin) {
           if ($uses_systemctl{'mysql'} && $uses_systemctl{'apache'}) {
               if (! -x $sysctl_bin) {
                   $nocheck = 1;       
               }
           } else {
               $nocheck = 1;
           }
       }
       if ($nocheck) {
         print &mt('Could not check runlevel status for MySQL or Apache')."\n";          print &mt('Could not check runlevel status for MySQL or Apache')."\n";
         return;          return;
     }      }
     my $rlstr = join('',@runlevels);      my $rlstr = join('',@runlevels);
     my $nrlstr = join('',@norunlevels);      my $nrlstr = join('',@norunlevels);
   
     foreach my $type ('apache','mysql','ntp','cups','memcached') {      foreach my $type ('apache','mysql','ntp','cups','memcached') {
         my $service = $daemon{$type};          my $service = $daemon{$type};
         my $command = $checker_bin.' --list '.$service.' 2>/dev/null';          if ($uses_systemctl{$type}) {
         if ($type eq 'cups') {               if (($type eq 'memcached') || ($type eq 'cups')) {
             if ($distro =~ /^(?:debian|ubuntu)(\d+)/) {                  if (-l "/etc/systemd/system/multi-user.target.wants/$service.service") {
                 my $version = $1;                      $tostop{$type} = 1;
                 if (($distro =~ /^ubuntu/) && ($version <= 8)) {  
                     $command = $checker_bin.' --list cupsys 2>/dev/null';  
                 }                  }
             }              } else {
         }                  if (!-l "/etc/systemd/system/multi-user.target.wants/$service.service") {
         my $results = `$command`;                      $needfix{$type} = "systemctl enable $service.service";
         my $tofix;  
         if ($results eq '') {  
             if (($type eq 'apache') || ($type eq 'mysql') || ($type eq 'ntp')) {  
                 if ($distro  =~ /^(debian|ubuntu)/) {  
                     $tofix = "update-rc.d $type defaults";  
                 } else {  
                     $tofix = "$checker_bin --add $service\n";  
                 }                  }
             }              }
         } else {          } else {
             my %curr_runlevels;              my $command = $checker_bin.' --list '.$service.' 2>/dev/null';
             for (my $rl=0; $rl<=6; $rl++) {              if ($type eq 'cups') {
                 if ($results =~ /$rl:on/) { $curr_runlevels{$rl}++; }                  if ($distro =~ /^(?:debian|ubuntu)(\d+)/) {
                       my $version = $1;
                       if (($distro =~ /^ubuntu/) && ($version <= 8)) {
                           $command = $checker_bin.' --list cupsys 2>/dev/null';
                       }
                   }
             }              }
             if (($type eq 'apache') || ($type eq 'mysql') || ($type eq 'ntp')) {              my $results = `$command`;
                 my $warning;              my $tofix;
                 foreach my $rl (@runlevels) {              if ($results eq '') {
                     if (!exists($curr_runlevels{$rl})) {                  if (($type eq 'apache') || ($type eq 'mysql') || ($type eq 'ntp')) {
                         $warning = 1;                      if ($distro  =~ /^(debian|ubuntu)/) {
                           $tofix = "update-rc.d $type defaults";
                       } else {
                           $tofix = "$checker_bin --add $service\n";
                     }                      }
                 }                  }
                 if ($warning) {              } else {
                     $tofix = "$checker_bin --level $rlstr $service on\n";                  my %curr_runlevels;
                   for (my $rl=0; $rl<=6; $rl++) {
                       if ($results =~ /$rl:on/) { $curr_runlevels{$rl}++; }
                   }
                   if (($type eq 'apache') || ($type eq 'mysql') || ($type eq 'ntp')) {
                       my $warning;
                       foreach my $rl (@runlevels) {
                           if (!exists($curr_runlevels{$rl})) {
                               $warning = 1;
                           }
                       }
                       if ($warning) {
                           $tofix = "$checker_bin --level $rlstr $service on\n";
                       }
                   } elsif (keys(%curr_runlevels) > 0) {
                       $tostop{$type} = 1;
                 }                  }
             } elsif (keys(%curr_runlevels) > 0) {  
                 $tostop{$type} = 1;  
             }              }
         }              if ($tofix) {
         if ($tofix) {                  $needfix{$type} = $tofix;
             $needfix{$type} = $tofix;              }
         }          }
     }      }
     if ($distro =~ /^(suse|sles)([\d\.]+)$/) {      if ($distro =~ /^(suse|sles)([\d\.]+)$/) {
Line 551  sub chkconfig { Line 733  sub chkconfig {
         } else {          } else {
             $major = $version;              $major = $version;
         }          }
         if ($major > 10) {          if (($major > 10) && ($major <= 13)) {
             if (&check_SuSEfirewall2_setup($instdir)) {              if (&check_SuSEfirewall2_setup($instdir)) {
                 $needfix{'insserv'} = 1;                  $needfix{'insserv'} = 1;
             }              }
         }          }
     }      }
     return (\%needfix,\%tostop);      return (\%needfix,\%tostop,\%uses_systemctl);
   }
   
   sub uses_firewalld {
       my ($distro) = @_;
       my ($inuse, $checkfirewalld);
       if ($distro =~ /^(suse|sles)([\d\.]+)$/) {
           if (($1 eq 'sles') && ($2 >= 15)) {
               $checkfirewalld = 1;
           }
       } elsif ($distro =~ /^fedora(\d+)$/) {
           if ($1 >= 18) {
               $checkfirewalld = 1;
           }
       } elsif ($distro =~ /^(?:centos|rhes|scientific)(\d+)/) {
           if ($1 >= 7) {
               $checkfirewalld = 1;
           }
       }
       if ($checkfirewalld) {
           my ($loaded,$active);
           if (open(PIPE,"systemctl status firewalld |")) {
               while (<PIPE>) {
                   chomp();
                   if (/^\s*Loaded:\s+(\w+)/) {
                       $loaded = $1;
                   }
                   if (/^\s*Active\s+(\w+)/) {
                       $active = $1;
                   }
               }
               close(PIPE);
           }
           if (($loaded eq 'loaded') || ($active eq 'active')) {
               $inuse = 1;
           }
       }
       return $inuse;
 }  }
   
 sub chkfirewall {  sub chkfirewall {
Line 569  sub chkfirewall { Line 788  sub chkfirewall {
                 );                  );
     my %activefw;      my %activefw;
     if (&firewall_is_active()) {      if (&firewall_is_active()) {
         my $iptables = &get_pathto_iptables();          if (&uses_firewalld($distro)) {
         if ($iptables eq '') {              my %current;
             print &mt('Firewall not checked as path to iptables not determined.')."\n";              if (open(PIPE,'firewall-cmd --permanent --zone=public --list-services |')) {
                   my $svc = <PIPE>;
                   close(PIPE);
                   chomp($svc);
                   map { $current{$_} = 1; } (split(/\s+/,$svc));
               }
               if ($current{'http'} && $current{'https'}) {
                   $configfirewall = 0;
               }
         } else {          } else {
             my @fwchains = &get_fw_chains($iptables,$distro);              my $iptables = &get_pathto_iptables();
             if (@fwchains) {              if ($iptables eq '') {
                 foreach my $service ('http','https') {                  print &mt('Firewall not checked as path to iptables not determined.')."\n";
                     foreach my $fwchain (@fwchains) {              } else {
                         if (&firewall_is_port_open($iptables,$fwchain,$ports{$service})) {                  my @fwchains = &get_fw_chains($iptables,$distro);
                             $activefw{$service} = 1;                  if (@fwchains) {
                             last;                      foreach my $service ('http','https') {
                           foreach my $fwchain (@fwchains) {
                               if (&firewall_is_port_open($iptables,$fwchain,$ports{$service})) {
                                   $activefw{$service} = 1;
                                   last;
                               }
                         }                          }
                     }                      }
                       if ($activefw{'http'}) {
                           $configfirewall = 0;
                       }
                   } else {
                       print &mt('Firewall not checked as iptables Chains not identified.')."\n";
                 }                  }
                 if ($activefw{'http'}) {  
                     $configfirewall = 0;  
                 }  
             } else {  
                 print &mt('Firewall not checked as iptables Chains not identified.')."\n";  
             }              }
         }          }
     } else {      } else {
Line 599  sub chkfirewall { Line 831  sub chkfirewall {
 sub chkapache {  sub chkapache {
     my ($distro,$instdir) = @_;      my ($distro,$instdir) = @_;
     my $fixapache = 1;      my $fixapache = 1;
     if ($distro =~ /^(debian|ubuntu)/) {      if ($distro =~ /^(debian|ubuntu)(\d+)$/) {
         if (!-e "$instdir/debian-ubuntu/loncapa") {          my $distname = $1;
           my $version = $2;
           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"; 
         } elsif ((-e "/etc/apache2/sites-available/loncapa") && (-e "$instdir/debian-ubuntu/loncapa")) {          } else {
             if (open(PIPE, "diff --brief $instdir/debian-ubuntu/loncapa /etc/apache2/sites-available/loncapa |")) {              my ($configfile,$sitefile);
                 my $diffres = <PIPE>;              if (($distname eq 'ubuntu') && ($version > 12)) {
                 close(PIPE);                  $sitefile = '/etc/apache2/sites-available/loncapa';
                 chomp($diffres);                  $configfile = "/etc/apache2/conf-available/loncapa";
                 unless ($diffres) {              } else {
                     $fixapache = 0;                  $configfile = "/etc/apache2/sites-available/loncapa";
               }
               if (($configfile ne '') && (-e $configfile) && (-e $stdconf))  {
                   if (open(PIPE, "diff --brief $stdconf $configfile |")) {
                       my $diffres = <PIPE>;
                       close(PIPE);
                       chomp($diffres);
                       unless ($diffres) {
                           $fixapache = 0;
                       }
                   }
               }
               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;
                           }
                       }
                 }                  }
             }              }
         }          }
Line 620  sub chkapache { Line 882  sub chkapache {
                 }                  }
             }              }
         }          }
     } elsif ($distro =~ /^(?:suse|sles)([\d\.]+)$/) {      } elsif ($distro =~ /^(suse|sles)([\d\.]+)$/) {
           my ($name,$version) = ($1,$2);
         my $apache = 'apache';          my $apache = 'apache';
         if ($1 >= 10) {          my $conf_file = "$instdir/sles-suse/default-server.conf";
           if ($version >= 10) {
             $apache = 'apache2';              $apache = 'apache2';
         }          }
         if (!-e "$instdir/sles-suse/default-server.conf") {          if (($name eq 'sles') && ($version >= 12)) {
               $conf_file = "$instdir/sles-suse/apache2.4/default-server.conf";
           }
           if (!-e $conf_file) {
             $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";
         } elsif ((-e "/etc/$apache/default-server.conf") && (-e "$instdir/sles-suse/default-server.conf")) {          } elsif (-e "/etc/$apache/default-server.conf") {
             if (open(PIPE, "diff --brief $instdir/sles-suse/default-server.conf /etc/$apache/default-server.conf |")) {              if (open(PIPE, "diff --brief $conf_file /etc/$apache/default-server.conf |")) {
                 my $diffres = <PIPE>;                  my $diffres = <PIPE>;
                 close(PIPE);                  close(PIPE);
                 chomp($diffres);                  chomp($diffres);
Line 655  sub chkapache { Line 922  sub chkapache {
     } else {      } else {
         my $configfile = 'httpd.conf';          my $configfile = 'httpd.conf';
         if ($distro =~ /^(?:centos|rhes|scientific)(\d+)$/) {          if ($distro =~ /^(?:centos|rhes|scientific)(\d+)$/) {
             if ($1 > 5) {              if ($1 >= 7) {
                   $configfile = 'apache2.4/httpd.conf';
               } elsif ($1 > 5) {
                 $configfile = 'new/httpd.conf';                  $configfile = 'new/httpd.conf';
             }              }
         } elsif ($distro =~ /^fedora(\d+)$/) {          } elsif ($distro =~ /^fedora(\d+)$/) {
             if ($1 > 10) {              if ($1 > 17) {
                   $configfile = 'apache2.4/httpd.conf'; 
               } elsif ($1 > 10) {
                 $configfile = 'new/httpd.conf';                  $configfile = 'new/httpd.conf';
             }              }
         }          }
Line 805  sub need_download { Line 1076  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 838  sub check_mysql_setup { Line 1132  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 887  sub get_pathto_iptables { Line 1181  sub get_pathto_iptables {
   
 sub firewall_is_active {  sub firewall_is_active {
     if (-e '/proc/net/ip_tables_names') {      if (-e '/proc/net/ip_tables_names') {
         return 1;          if (open(PIPE,'cat /proc/net/ip_tables_names |grep filter |')) {
     } else {              my $status = <PIPE>;
         return 0;              close(PIPE);
               chomp($status);
               if ($status eq 'filter') {
                   return 1;
               }
           }
     }      }
       return 0;
 }  }
   
 sub get_fw_chains {  sub get_fw_chains {
Line 906  sub get_fw_chains { Line 1206  sub get_fw_chains {
             @posschains = ('ufw-user-input','INPUT');              @posschains = ('ufw-user-input','INPUT');
         } elsif ($distro =~ /^debian5/) {          } elsif ($distro =~ /^debian5/) {
             @posschains = ('INPUT');              @posschains = ('INPUT');
           } elsif ($distro =~ /^(suse|sles)(\d+)/) {
               @posschains = ('IN_public');
         } else {          } else {
             @posschains = ('RH-Firewall-1-INPUT','INPUT');              @posschains = ('RH-Firewall-1-INPUT','INPUT');
             if (!-e '/etc/sysconfig/iptables') {              if (!-e '/etc/sysconfig/iptables') {
Line 1098  my %prompts = &texthash( Line 1400  my %prompts = &texthash(
 print "\n".&mt('Checking system status ...')."\n";  print "\n".&mt('Checking system status ...')."\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) = &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 1109  if ($distro eq '') { Line 1411  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 1136  if (!$gotprereqs) { Line 1445  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 1211  if ($callsub{'download'}) { Line 1520  if ($callsub{'download'}) {
         print &mt('The most recent LON-CAPA release is version: [_1].',$production)."\n".          print &mt('The most recent LON-CAPA release is version: [_1].',$production)."\n".
               &mt('Download the production release? ~[Y/n~]');                &mt('Download the production release? ~[Y/n~]');
         if (&get_user_selection(1)) {          if (&get_user_selection(1)) {
             $sourcetarball = $production.'tar.gz';              $sourcetarball = 'loncapa-'.$production.'.tar.gz';
         }          }
     }      }
 } elsif ($filetouse ne '') {  } elsif ($filetouse ne '') {
Line 1261  if ($dbh) { Line 1570  if ($dbh) {
   
 if ($callsub{'apache'}) {  if ($callsub{'apache'}) {
     if ($distro =~ /^(suse|sles)/) {      if ($distro =~ /^(suse|sles)/) {
         &copy_apache2_suseconf($instdir);          &copy_apache2_suseconf($instdir,$distro);
     } elsif ($distro =~ /^(debian|ubuntu)/) {      } elsif ($distro =~ /^(debian|ubuntu)/) {
         &copy_apache2_debconf($instdir);          &copy_apache2_debconf($instdir,$distro);
     } else {      } else {
         &copy_httpd_conf($instdir,$distro);          &copy_httpd_conf($instdir,$distro);
     }      }
Line 1289  if ($callsub{'runlevels'}) { Line 1598  if ($callsub{'runlevels'}) {
             }                }  
         }          }
     }      }
     if ($distro =~ /^(suse|sles)/) {      if ($distro =~ /^(suse|sles)(\d+)/) {
         &update_SuSEfirewall2_setup($instdir);          unless(($1 eq 'sles') && ($2 >= 15)) {
               &update_SuSEfirewall2_setup($instdir);
           }
     }      }
 } else {  } else {
     &print_and_log(&mt('Skipping setting override for start-up order of services.')."\n");      &print_and_log(&mt('Skipping setting override for start-up order of services.')."\n");
 }  }
   
 if ($callsub{'firewall'}) {  if ($callsub{'firewall'}) {
     if ($distro =~ /^(suse|sles)/) {      if (&uses_firewalld($distro)) {
           my (%current,%added);
           if (open(PIPE,'firewall-cmd --permanent --zone=public --list-services |')) {
               my $svc = <PIPE>;
               close(PIPE);
               chomp($svc);
               map { $current{$_} = 1; } (split(/\s+/,$svc));
           }
           foreach my $service ('http','https') {
               unless ($current{$service}) {
                   if (open(PIPE,"firewall-cmd --permanent --zone=public --add-service=$service |")) {
                       my $result = <PIPE>;
                       if ($result =~ /^success/) {
                           $added{$service} = 1;
                       }
                   }
               }
           }
           if (keys(%added) > 0) {
               print &mt('Firewall configured to allow access for: [_1].',
                         join(', ',sort(keys(%added))))."\n";
           }
           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=public --add-service=ssh')."\n";
           }
       } elsif ($distro =~ /^(suse|sles)/) {
         print &mt('Use [_1] to configure the firewall to allow access for [_2].',          print &mt('Use [_1] to configure the firewall to allow access for [_2].',
                   'yast -- Security and Users -> Firewall -> Interfaces',                    'yast -- Security and Users -> Firewall -> Interfaces',
                    'ssh, http, https')."\n";                    'ssh, http, https')."\n";
     } elsif ($distro =~ /^(debian|ubuntu)(\d+)/) {      } elsif ($distro =~ /^(debian|ubuntu)(\d+)/) {
         if (($1 eq 'ubuntu') || ($2 > 5)) {          if (($1 eq 'ubuntu') || ($2 > 5)) {
             print &mt('Use [_1] to configure the firewall to allow access for [_2].',              print &mt('Use [_1] to configure the firewall to allow access for [_2].',
Line 1331  if ($callsub{'firewall'}) { Line 1672  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 1518  END Line 1859  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 1549  sub kill_extra_services { Line 1890  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 1590  CREATE TABLE IF NOT EXISTS metadata (tit Line 1952  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 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 1641  INSERT db (Host,Db,User,Select_priv,Inse Line 2024  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 1650  INSERT db (Host,Db,User,Select_priv,Inse Line 2033  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 1672  INSERT db (Host,Db,User,Select_priv,Inse Line 2054  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 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 1702  sub copy_httpd_conf { Line 2089  sub copy_httpd_conf {
     my ($instdir,$distro) = @_;      my ($instdir,$distro) = @_;
     my $configfile = 'httpd.conf';      my $configfile = 'httpd.conf';
     if ($distro =~ /^(?:centos|rhes|scientific)(\d+)$/) {      if ($distro =~ /^(?:centos|rhes|scientific)(\d+)$/) {
         if ($1 > 5) {          if ($1 >= 7) {
               $configfile = 'apache2.4/httpd.conf';
           } elsif ($1 > 5) {
             $configfile = 'new/httpd.conf';              $configfile = 'new/httpd.conf';
         }          }
     } elsif ($distro =~ /^fedora(\d+)$/) {      } elsif ($distro =~ /^fedora(\d+)$/) {
         if ($1 > 10) {          if ($1 > 17) {
               $configfile = 'apache2.4/httpd.conf';
           } elsif ($1 > 10) {
             $configfile = 'new/httpd.conf';              $configfile = 'new/httpd.conf';
         }          }
     }      }
Line 1726  sub copy_httpd_conf { Line 2117  sub copy_httpd_conf {
 #########################################################  #########################################################
   
 sub copy_apache2_debconf {  sub copy_apache2_debconf {
     my ($instdir) = @_;      my ($instdir,$distro) = @_;
     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");  
     my $apache2_sites_enabled_dir = '/etc/apache2/sites-enabled';  
     my $apache2_sites_available_dir = '/etc/apache2/sites-available';  
     if (-l "$apache2_sites_enabled_dir/000-default") {  
         unlink("$apache2_sites_enabled_dir/000-default");  
     }  
     if (-e "$apache2_sites_available_dir/loncapa") {  
         copy("$apache2_sites_available_dir/loncapa","$apache2_sites_available_dir/loncapa.original");  
     }  
     copy("$instdir/debian-ubuntu/loncapa","$apache2_sites_available_dir/loncapa");  
     chmod(0444,"$apache2_sites_available_dir/loncapa");  
     symlink("$apache2_sites_available_dir/loncapa","$apache2_sites_enabled_dir/000-default");  
     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 1747  sub copy_apache2_debconf { Line 2126  sub copy_apache2_debconf {
             print_and_log(&mt('Enabling "[_1]" Apache module.',$module)."\n");              print_and_log(&mt('Enabling "[_1]" Apache module.',$module)."\n");
         }          }
     }      }
       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 ($distname,$version);
       if ($distro =~ /^(debian|ubuntu)(\d+)$/) {
           $distname = $1;
           $version = $2;
       }
       if (($distname eq 'ubuntu') && ($version > 12)) {
           $defaultconfig = "$apache2_sites_enabled_dir/000-default.conf";
       }
       if (-l $defaultconfig) {
           unlink($defaultconfig);
       }
       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.conf symlink'")."\n");
           my $apache2_conf_enabled_dir = '/etc/apache2/conf-enabled';
           my $apache2_conf_available_dir = '/etc/apache2/conf-available';
           if (-e "$apache2_conf_available_dir/loncapa") {
               copy("$apache2_conf_available_dir/loncapa","$apache2_conf_available_dir/loncapa.original");
           }
           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");
           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 {
           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") {
               copy("$apache2_sites_available_dir/loncapa","$apache2_sites_available_dir/loncapa.original");
           }
           copy("$instdir/debian-ubuntu/loncapa","$apache2_sites_available_dir/loncapa");
           chmod(0444,"$apache2_sites_available_dir/loncapa");
           symlink("$apache2_sites_available_dir/loncapa","$apache2_sites_enabled_dir/000-default");
       }
     print_and_log("\n");      print_and_log("\n");
 }  }
   
Line 1759  sub copy_apache2_debconf { Line 2179  sub copy_apache2_debconf {
 ###########################################################  ###########################################################
   
 sub copy_apache2_suseconf {  sub copy_apache2_suseconf {
     my ($instdir) = @_;      my ($instdir,$distro) = @_;
       my ($name,$version) = ($distro =~ /^(suse|sles)([\d\.]+)$/);
       my $conf_file = "$instdir/sles-suse/default-server.conf";
       if (($name eq 'sles') && ($version >= 12)) {
           $conf_file = "$instdir/sles-suse/apache2.4/default-server.conf";
       }
     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");
     if (!-e "/etc/apache2/default-server.conf.original") {      if (!-e "/etc/apache2/default-server.conf.original") {
         copy "/etc/apache2/default-server.conf","/etc/apache2/default-server.conf.original";          copy "/etc/apache2/default-server.conf","/etc/apache2/default-server.conf.original";
     }      }
     copy "$instdir/sles-suse/default-server.conf","/etc/apache2/default-server.conf";      copy $conf_file,"/etc/apache2/default-server.conf";
     chmod(0444,"/etc/apache2/default-server.conf");      chmod(0444,"/etc/apache2/default-server.conf");
     # Make symlink for conf directory (included in loncapa_apache.conf)      # Make symlink for conf directory (included in loncapa_apache.conf)
     my $can_symlink = (eval { symlink('/etc/apache2','/srv/www/conf'); }, $@ eq '');      my $can_symlink = (eval { symlink('/etc/apache2','/srv/www/conf'); }, $@ eq '');
Line 1777  sub copy_apache2_suseconf { Line 2202  sub copy_apache2_suseconf {
         &print_and_log(&mt('Symlink creation failed for [_1] to [_2]. You will need to perform this action from the command line.',"'/srv/www/conf'","'/etc/apache2'")."\n");          &print_and_log(&mt('Symlink creation failed for [_1] to [_2]. You will need to perform this action from the command line.',"'/srv/www/conf'","'/etc/apache2'")."\n");
     }      }
     &copy_apache2_conf_files($instdir);      &copy_apache2_conf_files($instdir);
     &copy_sysconfig_apache2_file($instdir);       &copy_sysconfig_apache2_file($instdir,$name,$version); 
     print_and_log("\n");      print_and_log("\n");
 }  }
   
Line 1803  sub copy_apache2_conf_files { Line 2228  sub copy_apache2_conf_files {
 ##  ##
 ###############################################  ###############################################
 sub copy_sysconfig_apache2_file {  sub copy_sysconfig_apache2_file {
     my ($instdir) = @_;      my ($instdir,$name,$version) = @_;
     print_and_log(&mt('Copying the LON-CAPA [_1] to [_2].',"'sysconfig/apache2'","'/etc/sysconfig/apache2'")."\n");      print_and_log(&mt('Copying the LON-CAPA [_1] to [_2].',"'sysconfig/apache2'","'/etc/sysconfig/apache2'")."\n");
     if (!-e "/etc/sysconfig/apache2.original") {      if (!-e "/etc/sysconfig/apache2.original") {
         copy "/etc/sysconfig/apache2","/etc/sysconfig/apache2.original";          copy "/etc/sysconfig/apache2","/etc/sysconfig/apache2.original";
     }      }
     copy "$instdir/sles-suse/sysconfig_apache2","/etc/sysconfig/apache2";      my $sysconf_file = "$instdir/sles-suse/sysconfig_apache2";
       if (($name eq 'sles') && ($version >= 12)) {
          $sysconf_file = "$instdir/sles-suse/apache2.4/sysconfig_apache2";
       }
       copy $sysconf_file,"/etc/sysconfig/apache2";
     chmod(0444,"/etc/sysconfig/apache2");      chmod(0444,"/etc/sysconfig/apache2");
 }  }
   

Removed from v.1.18  
changed lines
  Added in v.1.45.2.1


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>