Diff for /doc/install/linux/install.pl between versions 1.45.2.7 and 1.46

version 1.45.2.7, 2020/05/03 00:48:28 version 1.46, 2018/07/11 01:58:41
Line 26 Line 26
 use strict;  use strict;
 use File::Copy;  use File::Copy;
 use Term::ReadKey;  use Term::ReadKey;
   use Sys::Hostname::FQDN();
 use DBI;  use DBI;
 use Cwd();  use Cwd();
 use File::Basename();  use File::Basename();
Line 162  sub get_user_selection { Line 163  sub get_user_selection {
 }  }
   
 sub get_distro {  sub get_distro {
     my ($distro,$gotprereqs,$updatecmd,$packagecmd,$installnow,$unknown);      my ($distro,$gotprereqs,$updatecmd,$packagecmd,$installnow);
     $packagecmd = '/bin/rpm -q LONCAPA-prerequisites ';      $packagecmd = '/bin/rpm -q LONCAPA-prerequisites ';
     if (-e '/etc/oracle-release') {      if (-e '/etc/redhat-release') {
         open(IN,'</etc/oracle-release');  
         my $versionstring=<IN>;  
         chomp($versionstring);  
         close(IN);  
         if ($versionstring =~ /^Oracle Linux Server release (\d+)/) {  
             my $version = $1;  
             $distro = 'oracle'.$1;  
             $updatecmd = 'yum install LONCAPA-prerequisites';  
             $installnow = 'yum -y install LONCAPA-prerequisites';  
         }  
     } elsif (-e '/etc/redhat-release') {  
         open(IN,'</etc/redhat-release');          open(IN,'</etc/redhat-release');
         my $versionstring=<IN>;          my $versionstring=<IN>;
         chomp($versionstring);          chomp($versionstring);
Line 205  sub get_distro { Line 195  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 =~ /Red Hat Enterprise Linux release (\d+)/) {  
             $distro = 'rhes'.$1;  
             $updatecmd = 'dnf install LONCAPA-prerequisites';  
             $installnow = 'dnf -y install LONCAPA-prerequisites';  
         } elsif ($versionstring =~ /CentOS(?:| Linux) release (\d+)/) {          } elsif ($versionstring =~ /CentOS(?:| Linux) release (\d+)/) {
             $distro = 'centos'.$1;              $distro = 'centos'.$1;
             $updatecmd = 'yum install LONCAPA-prerequisites';              $updatecmd = 'yum install LONCAPA-prerequisites';
Line 222  sub get_distro { Line 208  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 249  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 269  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 {
         if ($distro ne '') {              print &mt('Unable to interpret [_1] to determine system type.',
             $packagecmd = '/usr/bin/dpkg -l loncapa-prerequisites ';                        '/etc/issue')."\n";
         }          }
     } elsif (-e '/etc/debian_version') {      } elsif (-e '/etc/debian_version') {
         open(IN,'</etc/debian_version');          open(IN,'</etc/debian_version');
Line 291  sub get_distro { Line 274  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, scientific linux, or oracle 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);
 }  }
   
   sub get_hostname {
       my $hostname;
       print &mt('Enter the hostname of this server, e.g., loncapa.somewhere.edu'."\n");
       my $choice = <STDIN>;
       chomp($choice);
       $choice =~ s/(^\s+|\s+$)//g;
       if ($choice eq '') {
           print &mt("Hostname you entered was either blank or contanied only white space.\n");
       } elsif ($choice =~ /^[\w\.\-]+$/) {
           $hostname = $choice;
       } else {
           print &mt("Hostname you entered was invalid --  a hostname may only contain letters, numbers, - and .\n");
       }
       while ($hostname eq '') {
           $hostname = &get_hostname();
       }
       print "\n";
       return $hostname;
   }
   
 sub check_prerequisites {  sub check_prerequisites {
     my ($packagecmd,$distro) = @_;      my ($packagecmd,$distro) = @_;
     my $gotprereqs;      my $gotprereqs;
Line 357  sub check_prerequisites { Line 331  sub check_prerequisites {
   
 sub check_locale {  sub check_locale {
     my ($distro) = @_;      my ($distro) = @_;
     my ($fh,$langvar,$command,$earlyout);      my ($fh,$langvar,$command);
     $langvar = 'LANG';      $langvar = 'LANG';
     if ($distro =~ /^(ubuntu|debian)/) {      if ($distro =~ /^(ubuntu|debian)/) {
         if (!open($fh,"</etc/default/locale")) {          if (!open($fh,"</etc/default/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');
             $earlyout = 1;  
         }          }
     } elsif ($distro =~ /^(suse|sles)(\d+)/) {      } elsif ($distro =~ /^(suse|sles)/) {
         if (($1 eq 'sles') && ($2 >= 15)) {          if (!open($fh,"</etc/sysconfig/language")) {
             if (!open($fh,"</etc/locale.conf")) {              print &mt('Failed to open: [_1], default locale not checked.',
                 print &mt('Failed to open: [_1], default locale not checked.',                        '/etc/sysconfig/language');
                           '/etc/locale.conf');  
                 $earlyout = 1;  
             }  
         } else {  
             if (!open($fh,"</etc/sysconfig/language")) {  
                 print &mt('Failed to open: [_1], default locale not checked.',  
                           '/etc/sysconfig/language');  
                 $earlyout = 1;  
             }  
             $langvar = 'RC_LANG';  
         }          }
           $langvar = 'RC_LANG';
     } elsif ($distro =~ /^fedora(\d+)/) {      } elsif ($distro =~ /^fedora(\d+)/) {
         if ($1 >= 18) {          if ($1 >= 18) {
             if (!open($fh,"</etc/locale.conf")) {              if (!open($fh,"</etc/locale.conf")) {
                 print &mt('Failed to open: [_1], default locale not checked.',                  print &mt('Failed to open: [_1], default locale not checked.',
                           '/etc/locale.conf');                            '/etc/locale.conf');
                 $earlyout = 1;  
             }              }
         } elsif (!open($fh,"</etc/sysconfig/i18n")) {          } 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/i18n');                        '/etc/sysconfig/i18n');
             $earlyout = 1;  
         }          }
     } elsif ($distro =~ /^(?:rhes|centos|scientific|oracle)(\d+)/) {      } elsif ($distro =~ /^(?:rhes|centos|scientific)(\d+)/) {
         if ($1 >= 7) {          if ($1 >= 7) {
             if (!open($fh,"</etc/locale.conf")) {              if (!open($fh,"</etc/locale.conf")) {
                 print &mt('Failed to open: [_1], default locale not checked.',                  print &mt('Failed to open: [_1], default locale not checked.',
                           '/etc/locale.conf');                            '/etc/locale.conf');
                 $earlyout = 1;  
             }              }
         } elsif (!open($fh,"</etc/sysconfig/i18n")) {          } 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/i18n');                        '/etc/sysconfig/i18n');
             $earlyout = 1;  
         }          }
     } 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.',
                       '/etc/sysconfig/i18n');                        '/etc/sysconfig/i18n');
             $earlyout = 1;  
         }          }
     }      }
     return if ($earlyout);  
     my @data = <$fh>;      my @data = <$fh>;
     chomp(@data);      chomp(@data);
     foreach my $item (@data) {      foreach my $item (@data) {
Line 425  sub check_locale { Line 383  sub check_locale {
                     $command = 'sudo locale-gen en_US.UTF-8'."\n".                      $command = 'sudo locale-gen en_US.UTF-8'."\n".
                                'sudo update-locale LANG=en_US.UTF-8';                                 'sudo update-locale LANG=en_US.UTF-8';
                 } elsif ($distro =~ /^(suse|sles)/) {                  } elsif ($distro =~ /^(suse|sles)/) {
                     $command = 'yast language';                      $command = 'yast language'; 
                 } elsif (-e '/usr/bin/system-config-language') {  
                     $command = 'system-config-language';  
                 } elsif (-e '/usr/bin/localectl') {  
                     $command = '/usr/bin/localectl set-locale LANG=en_US.UTF-8';  
                 } else {                  } else {
                     $command = 'No standard command found';                      $command = 'system-config-language';
                 }                  }
             }              }
             last;              last;
Line 456  sub check_required { Line 410  sub check_required {
         return ($distro,$gotprereqs,$localecmd);          return ($distro,$gotprereqs,$localecmd);
     }      }
     my ($mysqlon,$mysqlsetup,$mysqlrestart,$dbh,$has_pass,$has_lcdb,%recommended,      my ($mysqlon,$mysqlsetup,$mysqlrestart,$dbh,$has_pass,$has_lcdb,%recommended,
         $downloadstatus,$filetouse,$production,$testing,$apachefw,$tostop,$uses_systemctl);          $downloadstatus,$filetouse,$production,$testing,$apachefw,$tostop,
           $uses_systemctl,$hostname);
     my $wwwuid = &uid_of_www();      my $wwwuid = &uid_of_www();
     my $wwwgid = getgrnam('www');      my $wwwgid = getgrnam('www');
     if (($wwwuid eq '') || ($wwwgid eq '')) {      if (($wwwuid eq '') || ($wwwgid eq '')) {
Line 465  sub check_required { Line 420  sub check_required {
     unless( -e "/usr/local/sbin/pwauth") {      unless( -e "/usr/local/sbin/pwauth") {
         $recommended{'pwauth'} = 1;          $recommended{'pwauth'} = 1;
     }      }
       my $hostname = Sys::Hostname::FQDN::fqdn();
       if ($hostname eq '') {
           $hostname =&get_hostname();
       } else {
           print &mt("Hostname detected: $hostname. Is that correct? ~[Y/n~]");
           if (!&get_user_selection(1)) {
               $hostname =&get_hostname();
           }
       }
       print_and_log(&mt('Hostname is [_1]',$hostname)."\n");
     $mysqlon = &check_mysql_running($distro);      $mysqlon = &check_mysql_running($distro);
     if ($mysqlon) {      if ($mysqlon) {
         my $mysql_has_wwwuser = &check_mysql_wwwuser();          my $mysql_has_wwwuser = &check_mysql_wwwuser();
Line 496  sub check_required { Line 461  sub check_required {
     ($recommended{'firewall'},$apachefw) = &chkfirewall($distro);      ($recommended{'firewall'},$apachefw) = &chkfirewall($distro);
     ($recommended{'runlevels'},$tostop,$uses_systemctl) = &chkconfig($distro,$instdir);      ($recommended{'runlevels'},$tostop,$uses_systemctl) = &chkconfig($distro,$instdir);
     $recommended{'apache'} = &chkapache($distro,$instdir);      $recommended{'apache'} = &chkapache($distro,$instdir);
       $recommended{'apachessl'} = &chkapachessl($distro,$instdir,$hostname);
     $recommended{'stopsrvcs'} = &chksrvcs($distro,$tostop);      $recommended{'stopsrvcs'} = &chksrvcs($distro,$tostop);
     ($recommended{'download'},$downloadstatus,$filetouse,$production,$testing)       ($recommended{'download'},$downloadstatus,$filetouse,$production,$testing) 
         = &need_download();          = &need_download();
     return ($distro,$gotprereqs,$localecmd,$packagecmd,$updatecmd,$installnow,      return ($distro,$gotprereqs,$localecmd,$packagecmd,$updatecmd,$installnow,
             $mysqlrestart,\%recommended,$dbh,$has_pass,$has_lcdb,$downloadstatus,              $mysqlrestart,\%recommended,$dbh,$has_pass,$has_lcdb,$downloadstatus,
             $filetouse,$production,$testing,$apachefw,$uses_systemctl);              $filetouse,$production,$testing,$apachefw,$uses_systemctl,$hostname);
 }  }
   
 sub check_mysql_running {  sub check_mysql_running {
Line 527  sub check_mysql_running { Line 493  sub check_mysql_running {
         if ($1 >= 19) {          if ($1 >= 19) {
             $mysqldaemon ='mariadb';              $mysqldaemon ='mariadb';
         }          }
     } elsif ($distro =~ /^(?:centos|rhes|scientific|oracle)(\d+)/) {      } elsif ($distro =~ /^(?:centos|rhes|scientific)(\d+)/) {
         if ($1 >= 7) {          if ($1 >= 7) {
             $mysqldaemon ='mariadb';              $mysqldaemon ='mariadb';
             $process = 'mysqld';              $process = 'mysqld';
Line 540  sub check_mysql_running { Line 506  sub check_mysql_running {
             $proc_owner = 'mysql';              $proc_owner = 'mysql';
             $process = 'mysqld';              $process = 'mysqld';
         }          }
         if ($1 >= 15) {  
             $mysqldaemon ='mariadb';  
         }  
     } elsif ($distro =~ /^suse(\d+)/) {      } elsif ($distro =~ /^suse(\d+)/) {
         if ($1 >= 13) {          if ($1 >= 13) {
             $use_systemctl = 1;              $use_systemctl = 1;
Line 626  sub chkconfig { Line 589  sub chkconfig {
                     $uses_systemctl{'ntp'} = 1;                      $uses_systemctl{'ntp'} = 1;
                     $uses_systemctl{'cups'} = 1;                      $uses_systemctl{'cups'} = 1;
                     $uses_systemctl{'memcached'} = 1;                      $uses_systemctl{'memcached'} = 1;
                     if (($name eq 'sles') && ($num >= 15)) {                      $daemon{'ntp'} = 'ntpd';
                         $daemon{'ntp'} = 'chronyd';  
                         $daemon{'mysql'} = 'mariadb';  
                     } else {  
                         $daemon{'ntp'} = 'ntpd';  
                     }  
                 }                  }
             }              }
         }          }
Line 654  sub chkconfig { Line 612  sub chkconfig {
         if (($distro =~ /^ubuntu/) && ($version <= 8)) {          if (($distro =~ /^ubuntu/) && ($version <= 8)) {
             $daemon{'cups'} = 'cupsys';              $daemon{'cups'} = 'cupsys';
         }          }
         if (($distro =~ /^ubuntu/) && ($version >= 18)) {  
             $daemon{'ntp'}    = 'chrony';  
         }  
     } elsif ($distro =~ /^fedora(\d+)/) {      } elsif ($distro =~ /^fedora(\d+)/) {
         my $version = $1;          my $version = $1;
         if ($version >= 15) {          if ($version >= 15) {
Line 671  sub chkconfig { Line 626  sub chkconfig {
         if ($version >= 19) {          if ($version >= 19) {
             $daemon{'mysql'} = 'mariadb';              $daemon{'mysql'} = 'mariadb';
         }          }
         if ($version >= 26) {      } elsif ($distro =~ /^(?:centos|rhes|scientific)(\d+)/) {
             $daemon{'ntp'} = 'chronyd';  
         }  
     } elsif ($distro =~ /^(?:centos|rhes|scientific|oracle)(\d+)/) {  
         my $version = $1;          my $version = $1;
         if ($version >= 7) {          if ($version >= 7) {
             $uses_systemctl{'ntp'} = 1;              $uses_systemctl{'ntp'} = 1;
Line 684  sub chkconfig { Line 636  sub chkconfig {
             $uses_systemctl{'cups'} = 1;              $uses_systemctl{'cups'} = 1;
             $daemon{'mysql'} = 'mariadb';              $daemon{'mysql'} = 'mariadb';
         }          }
         if (($version >= 8) || ($distro eq 'oracle7')) {  
             $daemon{'ntp'} = 'chronyd';  
         }  
     }      }
     my $nocheck;      my $nocheck;
     if (! -x $checker_bin) {      if (! -x $checker_bin) {
Line 770  sub chkconfig { Line 719  sub chkconfig {
         } else {          } else {
             $major = $version;              $major = $version;
         }          }
         if (($major > 10) && ($major <= 13)) {          if ($major > 10) {
             if (&check_SuSEfirewall2_setup($instdir)) {              if (&check_SuSEfirewall2_setup($instdir)) {
                 $needfix{'insserv'} = 1;                  $needfix{'insserv'} = 1;
             }              }
Line 779  sub chkconfig { Line 728  sub chkconfig {
     return (\%needfix,\%tostop,\%uses_systemctl);      return (\%needfix,\%tostop,\%uses_systemctl);
 }  }
   
 sub uses_firewalld {  
     my ($distro) = @_;  
     my ($inuse,$checkfirewalld,$zone);  
     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|oracle)(\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;  
             my $cmd = 'firewall-cmd --get-default-zone';  
             if (open(PIPE,"$cmd |")) {  
                 my $result = <PIPE>;  
                 chomp($result);  
                 close(PIPE);  
                 if ($result =~ /^\w+$/) {  
                     $zone = $result;  
                 }  
             }  
         }  
     }  
     return ($inuse,$zone);  
 }  
   
 sub chkfirewall {  sub chkfirewall {
     my ($distro) = @_;      my ($distro) = @_;
     my $configfirewall = 1;      my $configfirewall = 1;
Line 833  sub chkfirewall { Line 736  sub chkfirewall {
                     https => 443,                      https => 443,
                 );                  );
     my %activefw;      my %activefw;
     my ($firewalld,$zone) = &uses_firewalld($distro);      if (&firewall_is_active()) {
     if ($firewalld) {          my $iptables = &get_pathto_iptables();
         my %current;          if ($iptables eq '') {
         if (open(PIPE,'firewall-cmd --permanent --zone='.$zone.' --list-services |')) {              print &mt('Firewall not checked as path to iptables not determined.')."\n";
             my $svc = <PIPE>;          } else {
             close(PIPE);              my @fwchains = &get_fw_chains($iptables,$distro);
             chomp($svc);              if (@fwchains) {
             map { $current{$_} = 1; } (split(/\s+/,$svc));                  foreach my $service ('http','https') {
         }                      foreach my $fwchain (@fwchains) {
         if ($current{'http'} && $current{'https'}) {                          if (&firewall_is_port_open($iptables,$fwchain,$ports{$service})) {
             $configfirewall = 0;                              $activefw{$service} = 1;
         }                              last;
     } else {  
         if (&firewall_is_active()) {  
             my $iptables = &get_pathto_iptables();  
             if ($iptables eq '') {  
                 print &mt('Firewall not checked as path to iptables not determined.')."\n";  
             } else {  
                 my @fwchains = &get_fw_chains($iptables,$distro);  
                 if (@fwchains) {  
                     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 {  
             print &mt('Firewall not enabled.')."\n";  
         }          }
       } else {
           print &mt('Firewall not enabled.')."\n";
     }      }
     return ($configfirewall,\%activefw);      return ($configfirewall,\%activefw);
 }  }
Line 929  sub chkapache { Line 818  sub chkapache {
                 }                  }
             }              }
         }          }
         if ((!$fixapache) && ($distname eq 'ubuntu')) {      } elsif ($distro =~ /^(?:suse|sles)([\d\.]+)$/) {
             my $sitestatus = "/etc/apache2/mods-available/status.conf";  
             my $stdstatus = "$instdir/debian-ubuntu/status.conf";  
             if ((-e $stdstatus) && (-e $sitestatus)) {  
                 if (open(PIPE, "diff --brief $stdstatus $sitestatus |")) {  
                     my $diffres = <PIPE>;  
                     close(PIPE);  
                     chomp($diffres);  
                     if ($diffres) {  
                         $fixapache = 1;  
                     }  
                 }  
             }  
         }  
     } elsif ($distro =~ /^(suse|sles)([\d\.]+)$/) {  
         my ($name,$version) = ($1,$2);  
         my $apache = 'apache';          my $apache = 'apache';
         my $conf_file = "$instdir/sles-suse/default-server.conf";          if ($1 >= 10) {
         if ($version >= 10) {  
             $apache = 'apache2';              $apache = 'apache2';
         }          }
         if (($name eq 'sles') && ($version >= 12)) {          if (!-e "$instdir/sles-suse/default-server.conf") {
             $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") {          } elsif ((-e "/etc/$apache/default-server.conf") && (-e "$instdir/sles-suse/default-server.conf")) {
             if (open(PIPE, "diff --brief $conf_file /etc/$apache/default-server.conf |")) {              if (open(PIPE, "diff --brief $instdir/sles-suse/default-server.conf /etc/$apache/default-server.conf |")) {
                 my $diffres = <PIPE>;                  my $diffres = <PIPE>;
                 close(PIPE);                  close(PIPE);
                 chomp($diffres);                  chomp($diffres);
Line 982  sub chkapache { Line 852  sub chkapache {
         }          }
     } else {      } else {
         my $configfile = 'httpd.conf';          my $configfile = 'httpd.conf';
         my $mpmfile = 'mpm.conf';          if ($distro =~ /^(?:centos|rhes|scientific)(\d+)$/) {
         if ($distro =~ /^(?:centos|rhes|scientific|oracle)(\d+)$/) {  
             if ($1 >= 7) {              if ($1 >= 7) {
                 $configfile = 'apache2.4/httpd.conf';                  $configfile = 'apache2.4/httpd.conf';
             } elsif ($1 > 5) {              } elsif ($1 > 5) {
Line 991  sub chkapache { Line 860  sub chkapache {
             }              }
         } elsif ($distro =~ /^fedora(\d+)$/) {          } elsif ($distro =~ /^fedora(\d+)$/) {
             if ($1 > 17) {              if ($1 > 17) {
                 $configfile = 'apache2.4/httpd.conf';                  $configfile = 'apache2.4/httpd.conf'; 
             } elsif ($1 > 10) {              } elsif ($1 > 10) {
                 $configfile = 'new/httpd.conf';                  $configfile = 'new/httpd.conf';
             }              }
Line 1009  sub chkapache { Line 878  sub chkapache {
                 }                  }
             }              }
         }          }
         if (-e "/etc/httpd/conf.modules.d/00-mpm.conf") {      }
             if (!-e "$instdir/centos-rhes-fedora-sl/$mpmfile") {      return $fixapache;
                 print &mt('Warning: No LON-CAPA Apache MPM configuration file found for installation check.')."\n";  }
             } elsif ((-e "/etc/httpd/conf.modules.d/00-mpm.conf") && (-e "$instdir/centos-rhes-fedora-sl/$mpmfile")) {  
                 if (open(PIPE, "diff --brief $instdir/centos-rhes-fedora-sl/$mpmfile /etc/httpd/conf.modules.d/00-mpm.conf |")) {  sub chkapachessl {
                     my $diffres = <PIPE>;      my ($distro,$instdir,$hostname) = @_;
                     close(PIPE);      my $fixapachessl = 1;
                     chomp($diffres);      my $stdconf = "$instdir/loncapassl.conf";
                     if ($diffres) {      if (!-e $stdconf) {
                         $fixapache = 1;          $fixapachessl = 0;
                     }          print &mt('Warning: No LON-CAPA SSL Apache configuration file found for installation check.')."\n";
       } else {
           my $sslfile; 
           if ($distro =~ /^(debian|ubuntu)(\d+)$/) {
               $sslfile = '/etc/apache2/sites-available/loncapassl.conf';
           } elsif ($distro =~ /(suse|sles)/) {
               $sslfile = '/etc/apache2/vhosts.d/loncapassl.conf';
           } else {
               $sslfile = '/etc/httpd/conf.d/loncapassl.conf';
           }
           if ((-e $sslfile) && (-e $stdconf))  {
               if (open(PIPE, "diff -y -bi --suppress-common-lines $stdconf $sslfile |")) {
                   my $diffres = <PIPE>;
                   close(PIPE);
                   chomp($diffres);
                   if ($diffres =~ /^\QServerName internal-{[[[[Hostname]]]]}\E\s+\|\s+\QServerName internal-\E$hostname$/) {
                       $fixapachessl = 0;
                   }
               }
           }
           unless ($fixapachessl) {
               if ($distro =~ /^(debian|ubuntu)(\d+)$/) {
                   unless ((-l '/etc/apache2/sites-enabled/loncapassl.conf') &&
                           (readlink('/etc/apache2/sites-enabled/loncapassl.conf') eq '/etc/apache2/sites-available/loncapassl.conf')) {
                       print_and_log(&mt("Warning, use: 'sudo a2ensite loncapassl.conf' to activate LON-CAPA SSL Apache config\n"));
                 }                  }
             }              }
         }          }
     }      }
     return $fixapache;      return $fixapachessl;
 }  }
   
 sub chksrvcs {  sub chksrvcs {
Line 1257  sub get_pathto_iptables { Line 1150  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') {
         if (open(PIPE,'cat /proc/net/ip_tables_names |grep filter |')) {          return 1;
             my $status = <PIPE>;      } else {
             close(PIPE);          return 0;
             chomp($status);  
             if ($status eq 'filter') {  
                 return 1;  
             }  
         }  
     }      }
     return 0;  
 }  }
   
 sub get_fw_chains {  sub get_fw_chains {
Line 1282  sub get_fw_chains { Line 1169  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 1426  print " Line 1311  print "
 ".&mt('3.')." ".&mt('Set-up the MySQL database.')."  ".&mt('3.')." ".&mt('Set-up the MySQL database.')."
 ".&mt('4.')." ".&mt('Set-up MySQL permissions.')."  ".&mt('4.')." ".&mt('Set-up MySQL permissions.')."
 ".&mt('5.')." ".&mt('Configure Apache web server.')."  ".&mt('5.')." ".&mt('Configure Apache web server.')."
 ".&mt('6.')." ".&mt('Configure start-up of services.')."  ".&mt('6.')." ".&mt('Configure SSL for Apache web server.')."
 ".&mt('7.')." ".&mt('Check firewall settings.')."  ".&mt('7.')." ".&mt('Configure start-up of services.')."
 ".&mt('8.')." ".&mt('Stop services not used by LON-CAPA,')."  ".&mt('8.')." ".&mt('Check firewall settings.')."
   ".&mt('9.')." ".&mt('Stop services not used by LON-CAPA,')."
    ".&mt('i.e., services for a print server: [_1] daemon.',"'cups'")."     ".&mt('i.e., services for a print server: [_1] daemon.',"'cups'")."
 ".&mt('9.')." ".&mt('Download LON-CAPA source code in readiness for installation.')."  ".&mt('10.')." ".&mt('Download LON-CAPA source code in readiness for installation.')."
   
 ".&mt('Typically, you will run this script only once, when you first install LON-CAPA.')."   ".&mt('Typically, you will run this script only once, when you first install LON-CAPA.')." 
   
Line 1460  chomp($instdir); Line 1346  chomp($instdir);
   
 my %callsub;  my %callsub;
 my @actions = ('wwwuser','pwauth','mysql','mysqlperms','apache',  my @actions = ('wwwuser','pwauth','mysql','mysqlperms','apache',
                'runlevels','firewall','stopsrvcs','download');                 'apachessl','runlevels','firewall','stopsrvcs','download');
 my %prompts = &texthash(   my %prompts = &texthash( 
     wwwuser    => "Create the 'www' user?",      wwwuser    => "Create the 'www' user?",
     pwauth     => 'Install the package LON-CAPA uses to authenticate users?',      pwauth     => 'Install the package LON-CAPA uses to authenticate users?',
     mysql      => 'Set-up the MySQL database?',      mysql      => 'Set-up the MySQL database?',
     mysqlperms => 'Set-up MySQL permissions?',      mysqlperms => 'Set-up MySQL permissions?',
     apache     => 'Configure Apache web server?',      apache     => 'Configure Apache web server?',
       apachessl  => 'Configure SSL for Apache web server?', 
     runlevels  => 'Set overrides for start-up order of services?',      runlevels  => 'Set overrides for start-up order of services?',
     firewall   => 'Configure firewall settings for Apache',      firewall   => 'Configure firewall settings for Apache',
     stopsrvcs  => 'Stop extra services not required on a LON-CAPA server?',      stopsrvcs  => 'Stop extra services not required on a LON-CAPA server?',
     download   => 'Download LON-CAPA source code in readiness for installation?',      download   => 'Download LON-CAPA source code in readiness for installation?',
 );  );
   
 print "\n".&mt('Checking system status ...')."\n";  print "\n".&mt('Checking system status ...')."\n\n";
   
 my $dsn = "DBI:mysql:database=mysql";  my $dsn = "DBI:mysql:database=mysql";
 my ($distro,$gotprereqs,$localecmd,$packagecmd,$updatecmd,$installnow,$mysqlrestart,  my ($distro,$gotprereqs,$localecmd,$packagecmd,$updatecmd,$installnow,$mysqlrestart,
     $recommended,$dbh,$has_pass,$has_lcdb,$downloadstatus,$filetouse,$production,      $recommended,$dbh,$has_pass,$has_lcdb,$downloadstatus,$filetouse,$production,
     $testing,$apachefw,$uses_systemctl) = &check_required($instdir,$dsn);      $testing,$apachefw,$uses_systemctl,$hostname) = &check_required($instdir,$dsn);
 if ($distro eq '') {  if ($distro eq '') {
     print "\n".&mt('Linux distribution could not be verified as a supported distribution.')."\n".      print "\n".&mt('Linux distribution could not be verified as a supported distribution.')."\n".
           &mt('The following are supported: [_1].',            &mt('The following are supported: [_1].',
               'CentOS, RedHat Enterprise, Fedora, Scientific Linux, '.                'CentOS, RedHat Enterprise, Fedora, Scientific Linux, '.
               'Oracle Linux, openSuSE, SLES, Ubuntu LTS, Debian')."\n\n".                'openSuSE, SLES, Ubuntu LTS, Debian')."\n\n".
           &mt('Stopping execution.')."\n";            &mt('Stopping execution.')."\n";
     exit;      exit;
 }  }
Line 1506  if (!$gotprereqs) { Line 1393  if (!$gotprereqs) {
           &mt('The following command can be used to install the package (and dependencies):')."\n\n".            &mt('The following command can be used to install the package (and dependencies):')."\n\n".
           $updatecmd."\n\n";            $updatecmd."\n\n";
     if ($installnow eq '') {      if ($installnow eq '') {
         print &mt('Stopping execution.')."\n";  
         exit;          exit;
     } else {      } else {
         print &mt('Run command? ~[Y/n~]');          print &mt('Run command? ~[Y/n~]');
Line 1646  if ($dbh) { Line 1532  if ($dbh) {
   
 if ($callsub{'apache'}) {  if ($callsub{'apache'}) {
     if ($distro =~ /^(suse|sles)/) {      if ($distro =~ /^(suse|sles)/) {
         &copy_apache2_suseconf($instdir,$distro);          &copy_apache2_suseconf($instdir,$hostname);
     } elsif ($distro =~ /^(debian|ubuntu)/) {      } elsif ($distro =~ /^(debian|ubuntu)/) {
         &copy_apache2_debconf($instdir,$distro);          &copy_apache2_debconf($instdir,$distro,$hostname);
     } else {      } else {
         &copy_httpd_conf($instdir,$distro);          &copy_httpd_conf($instdir,$distro,$hostname);
         &copy_mpm_conf($instdir,$distro);  
     }      }
 } else {  } else {
     print_and_log(&mt('Skipping configuration of Apache web server.')."\n");      print_and_log(&mt('Skipping configuration of Apache web server.')."\n");
 }  }
   
   if ($callsub{'apachessl'}) {
       if ($distro =~ /^(suse|sles)/) {
           &copy_apache_sslconf_file($instdir,'/etc/apache2/vhosts.d',$hostname);
       } elsif ($distro =~ /^(debian|ubuntu)/) {
           my $apache2_sites_available_dir = '/etc/apache2/sites-available';
           if (&copy_apache_sslconf_file($instdir,$apache2_sites_available_dir,$hostname)) {
               my $apache2_sites_enabled_dir = '/etc/apache2/sites-enabled';
               my $made_symlink =  eval { symlink("$apache2_sites_available_dir/loncapassl.conf","$apache2_sites_enabled_dir/loncapassl.conf"); 1 };
               if ($made_symlink) {
                   print_and_log(&mt('Enabling "[_1]" Apache SSL configuration.','loncapassl.conf')."\n");  
               }
           }
       } else {
           &copy_apache_sslconf_file($instdir,'/etc/httpd/conf.d',$hostname);
       }
       print_and_log("\n");
   } else {
       print_and_log(&mt('Skipping configuration of SSL for Apache web server.')."\n");
   }
   
 if ($callsub{'runlevels'}) {  if ($callsub{'runlevels'}) {
     my $count = 0;      my $count = 0;
     if (ref($recommended) eq 'HASH') {      if (ref($recommended) eq 'HASH') {
Line 1675  if ($callsub{'runlevels'}) { Line 1580  if ($callsub{'runlevels'}) {
             }                }  
         }          }
     }      }
     if ($distro =~ /^(suse|sles)(\d+)/) {      if ($distro =~ /^(suse|sles)/) {
         unless(($1 eq 'sles') && ($2 >= 15)) {          &update_SuSEfirewall2_setup($instdir);
             &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'}) {
     my ($firewalld,$zone) = &uses_firewalld($distro);      if ($distro =~ /^(suse|sles)/) {
     if ($firewalld) {  
         my (%current,%added);  
         if (open(PIPE,"firewall-cmd --permanent --zone=$zone --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=$zone --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=$zone --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 1736  if ($callsub{'firewall'}) { Line 1608  if ($callsub{'firewall'}) {
                 }                  }
             }              }
         }          }
     } elsif ($distro =~ /^(scientific|oracle)/) {      } elsif ($distro =~ /^scientific/) {
         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].',
                   'system-config-firewall-tui -- Customize',                    'system-config-firewall-tui -- Customize',
                   'ssh, http')."\n";                    'ssh, http')."\n";
     } else {      } else {
         my $version;          print &mt('Use [_1] to configure the firewall to allow access for [_2].',
         if ($distro =~ /^(redhat|centos)(\d+)$/) {                    'setup -- Firewall configuration -> Customize',
             $version = $1;                    'ssh, http, https')."\n";
         }  
         if ($version > 5) {  
             print &mt('Use [_1] to configure the firewall to allow access for [_2].',  
                   'system-config-firewall-tui -- Customize',  
                   'ssh, http')."\n";  
         } else {  
             print &mt('Use [_1] to configure the firewall to allow access for [_2].',  
                       'setup -- Firewall configuration -> Customize',  
                       'ssh, http, https')."\n";  
         }  
     }      }
 } else {  } else {
     &print_and_log(&mt('Skipping Firewall configuration.')."\n");      &print_and_log(&mt('Skipping Firewall configuration.')."\n");
Line 2041  CREATE TABLE IF NOT EXISTS metadata (tit Line 1903  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,$mysqlsubver,$mysqlname) = &get_mysql_version();      my ($mysqlversion,$mysqlsubver,$mysqlname) = &get_mysql_version();
     my ($usesauth,$is_mariadb,$hasauthcol,@mysql_commands);      my ($usesauth,$hasauthcol,@mysql_commands);
     if ($mysqlname =~ /^MariaDB/i) {      if ($mysqlname =~ /^MariaDB/i) {
         $is_mariadb = 1;  
         if ($mysqlversion >= 10.2) {          if ($mysqlversion >= 10.2) {
             $usesauth = 1;              $usesauth = 1;
         } elsif ($mysqlversion >= 5.5) {          } elsif ($mysqlversion >= 5.5) {
Line 2057  sub setup_mysql_permissions { Line 1918  sub setup_mysql_permissions {
         }          }
     }      }
     if ($usesauth) {      if ($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','','','','')",
         if ($is_mariadb) {                           "ALTER USER 'www'\@'localhost' IDENTIFIED WITH mysql_native_password BY 'localhostkey'");
             push(@mysql_commands,"ALTER USER 'www'\@'localhost' IDENTIFIED BY 'localhostkey'");  
         } else {  
             push(@mysql_commands,"ALTER USER 'www'\@'localhost' IDENTIFIED WITH mysql_native_password BY 'localhostkey'");  
         }  
     } elsif ($hasauthcol) {      } elsif ($hasauthcol) {
         @mysql_commands = ("INSERT user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject, authentication_string) VALUES('localhost','www',password('localhostkey'),'','','','');");          @mysql_commands = ("INSERT user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject, authentication_string) VALUES('localhost','www',password('localhostkey'),'','','','');");
     } else {      } else {
Line 2117  INSERT db (Host,Db,User,Select_priv,Inse Line 1974  INSERT db (Host,Db,User,Select_priv,Inse
             }              }
         }          }
         if ($got_passwd) {          if ($got_passwd) {
             my (@newpass_cmds) = &new_mysql_rootpasswd($newmysqlpass,$usesauth,$is_mariadb);              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 2147  INSERT db (Host,Db,User,Select_priv,Inse Line 2004  INSERT db (Host,Db,User,Select_priv,Inse
 }  }
   
 sub new_mysql_rootpasswd {  sub new_mysql_rootpasswd {
     my ($currmysqlpass,$usesauth,$is_mariadb) = @_;      my ($currmysqlpass,$usesauth) = @_;
     if ($usesauth) {      if ($usesauth) {
         if ($is_mariadb) {          return ("ALTER USER 'root'\@'localhost' IDENTIFIED WITH mysql_native_password BY '$currmysqlpass'",
             return ("ALTER USER 'root'\@'localhost' IDENTIFIED BY '$currmysqlpass'",                  "FLUSH PRIVILEGES;");
                     "FLUSH PRIVILEGES;");  
         } else {  
             return ("ALTER USER 'root'\@'localhost' IDENTIFIED WITH mysql_native_password BY '$currmysqlpass'",  
                     "FLUSH PRIVILEGES;");  
         }  
     } else {      } else {
         return ("SET PASSWORD FOR 'root'\@'localhost'=PASSWORD('$currmysqlpass')",          return ("SET PASSWORD FOR 'root'\@'localhost'=PASSWORD('$currmysqlpass')",
                 "FLUSH PRIVILEGES;");                  "FLUSH PRIVILEGES;");
Line 2168  sub get_mysql_version { Line 2020  sub get_mysql_version {
         my $info = <PIPE>;          my $info = <PIPE>;
         chomp($info);          chomp($info);
         close(PIPE);          close(PIPE);
         ($version,$subversion,$name) = ($info =~ /(\d+\.\d+)\.(\d+)(?:\-?(\w*),|)/);          ($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";
Line 2184  sub get_mysql_version { Line 2036  sub get_mysql_version {
 ###########################################################  ###########################################################
   
 sub copy_httpd_conf {  sub copy_httpd_conf {
     my ($instdir,$distro) = @_;      my ($instdir,$distro,$hostname) = @_;
     my $configfile = 'httpd.conf';      my $configfile = 'httpd.conf';
     if ($distro =~ /^(?:centos|rhes|scientific|oracle)(\d+)$/) {      if ($distro =~ /^(?:centos|rhes|scientific)(\d+)$/) {
         if ($1 >= 7) {          if ($1 >= 7) {
             $configfile = 'apache2.4/httpd.conf';              $configfile = 'apache2.4/httpd.conf';
         } elsif ($1 > 5) {          } elsif ($1 > 5) {
Line 2207  sub copy_httpd_conf { Line 2059  sub copy_httpd_conf {
     print_and_log("\n");      print_and_log("\n");
 }  }
   
 ###########################################################  ###############################################
 ##  
 ## RHEL/CentOS/Fedora/Scientific Linux  
 ## Copy LON-CAPA mpm.conf to /etc/httpd/conf.modules.d/00-mpm.conf  
 ##  ##
 ## The LON-CAPA mpm.conf enables the prefork MPM module in  ## Copy/Modify loncapassl.conf
 ## Apache. This is also the default for RHEL/CentOS/Oracle  
 ## Linux 7 and earlier, and Fedora 26 and earlier. For more  
 ## recent versions of those distros, the event MPM is enabled  
 ## by default. After &copy_mpm_conf() is run, the prefork MPM  
 ## module will be enabled instead of the event MPM module.  
 ##  ##
 ###########################################################  ###############################################
   
 sub copy_mpm_conf {  sub copy_apache_sslconf_file {
     my ($instdir,$distro) = @_;      my ($instdir,$targetdir,$hostname) = @_;
     my $mpmfile = 'mpm.conf';      my ($success,$error);
     if ((-e "/etc/httpd/conf.modules.d/00-mpm.conf") &&      if (-e "$instdir/loncapassl.conf") {
         (-e "$instdir/centos-rhes-fedora-sl/$mpmfile")) {          if (open(my $fh,'<',"$instdir/loncapassl.conf")) {
         print_and_log(&mt('Copying the LON-CAPA [_1] to [_2].',"'mpm.conf'",              if (open(my $out,'>',"$targetdir/loncapassl.conf")) {
                       "'/etc/httpd/conf.modules.d/00-mpm.conf'")."\n");                  while (<$fh>) {
         copy "$instdir/centos-rhes-fedora-sl/$mpmfile","/etc/httpd/conf.modules.d/00-mpm.conf";                      if (/^\QServerName internal-\E/) {
         chmod(0644,"/etc/httpd/conf.modules.d/00-mpm.conf");                          chomp();
         print_and_log("\n");                          s/^(\QServerName internal-\E)(.*)$/$1$hostname\n/;
     } else {                      }
         my $logfail;                      print $out $_;
         if ($distro =~ /^(?:centos|rhes|scientific|oracle)(\d+)$/) {                  }
             if ($1 > 7) {                  $success = 1;
                 $logfail = 1;              } else {
             }                  $error = "Could not write to $targetdir/loncapassl.conf";
         } elsif ($distro =~ /^fedora(\d+)$/) {  
             if ($1 > 26) {  
                 $logfail = 1;  
             }              }
           } else {
               $error = "Could not read from $instdir/loncapassl.conf";
         }          }
         if ($logfail) {      } else {
             print_and_log(&mt('Warning: copying the LON-CAPA [_1] failed because [_2] and/or [_3] are missing.',          $error = "File to copy from: $instdir/loncapassl.conf does not exist";
                               $mpmfile,"'$instdir/centos-rhes-fedora-sl/$mpmfile'",      }
                               "'/etc/httpd/conf.modules.d/00-mpm.conf'"));      if ($success) {
             print_and_log("\n");          print_and_log(&mt('Successfully copied [_1] to [_2].',"'loncapassl.conf'","'$targetdir/loncapassl.conf'")."\n");
           chmod(0444,"$targetdir/loncapassl.conf");
       } else {
           print_and_log(&mt('Failed to copy [_1] to [_2].',"'loncapassl.conf'","'$targetdir/loncapassl.conf'")."\n");
           if ($error) {
               print_and_log("$error\n");
         }          }
     }      }
       return $success;
 }  }
   
 #########################################################  #########################################################
Line 2259  sub copy_mpm_conf { Line 2108  sub copy_mpm_conf {
 #########################################################  #########################################################
   
 sub copy_apache2_debconf {  sub copy_apache2_debconf {
     my ($instdir,$distro) = @_;      my ($instdir,$distro,$hostname) = @_;
     my $apache2_mods_enabled_dir = '/etc/apache2/mods-enabled';      my $apache2_mods_enabled_dir = '/etc/apache2/mods-enabled';
     my $apache2_mods_available_dir = '/etc/apache2/mods-available';      my $apache2_mods_available_dir = '/etc/apache2/mods-available';
     foreach my $module ('headers.load','expires.load') {      foreach my $module ('headers.load','expires.load') {
Line 2279  sub copy_apache2_debconf { Line 2128  sub copy_apache2_debconf {
     if (($distname eq 'ubuntu') && ($version > 12)) {      if (($distname eq 'ubuntu') && ($version > 12)) {
         $defaultconfig = "$apache2_sites_enabled_dir/000-default.conf";          $defaultconfig = "$apache2_sites_enabled_dir/000-default.conf";
     }      }
     my ($skipconf,$skipsite,$skipstatus);      if (-l $defaultconfig) {
           unlink($defaultconfig);
       }
     if (($distname eq 'ubuntu') && ($version > 12)) {      if (($distname eq 'ubuntu') && ($version > 12)) {
           print_and_log(&mt('Copying loncapa [_1] config file to [_2] and pointing [_3] to it from conf-enabled.',"'apache2'","'/etc/apache2/conf-available'","'loncapa.conf symlink'")."\n");
         my $apache2_conf_enabled_dir = '/etc/apache2/conf-enabled';          my $apache2_conf_enabled_dir = '/etc/apache2/conf-enabled';
         my $apache2_conf_available_dir = '/etc/apache2/conf-available';          my $apache2_conf_available_dir = '/etc/apache2/conf-available';
         my $defaultconf = $apache2_conf_enabled_dir.'/loncapa.conf';          if (-e "$apache2_conf_available_dir/loncapa") {
         if ((-e "$apache2_conf_available_dir/loncapa") && (-e "$instdir/debian-ubuntu/ubuntu14/loncapa_conf")) {              copy("$apache2_conf_available_dir/loncapa","$apache2_conf_available_dir/loncapa.original");
             if (open(PIPE, "diff --brief $apache2_conf_available_dir/loncapa $instdir/debian-ubuntu/ubuntu14/loncapa_conf" |")) {  
                 my $diffres = <PIPE>;  
                 close(PIPE);  
                 chomp($diffres);  
                 if ($diffres) {  
                     copy("$apache2_conf_available_dir/loncapa","$apache2_conf_available_dir/loncapa.original");  
                 }  
                 if (-l $defaultconf) {  
                     my $linkfname = readlink($defaultconf);  
                     if ($linkfname eq "$apache2_conf_available_dir/loncapa") {  
                         unless ($diffres) {  
                             $skipconf = 1;  
                         }  
                     }  
                 }  
             }  
         }  
         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");  
             if (-l $defaultconf) {  
                 unlink($defaultconf);  
             }  
             symlink("$apache2_conf_available_dir/loncapa","$defaultconf");  
         }  
         my $stdsite = "$instdir/debian-ubuntu/ubuntu14/loncapa_site";  
         if ((-e $stdsite) && (-e "$apache2_sites_available_dir/loncapa")) {  
             if (open(PIPE, "diff --brief $stdsite $apache2_sites_available_dir/loncapa |")) {  
                 my $diffres = <PIPE>;  
                 close(PIPE);  
                 chomp($diffres);  
                 if ($diffres) {  
                     copy("$apache2_sites_available_dir/loncapa","$apache2_sites_available_dir/loncapa.original");  
                 }  
                 if (-l $defaultconfig) {  
                     my $linkfname = readlink($defaultconfig);  
                     if ($linkfname eq "$apache2_sites_available_dir/loncapa") {  
                         unless ($diffres) {  
                             $skipsite = 1;  
                         }  
                     }  
                 }  
             }  
         }  
         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");  
         }  
     } else {  
         if ((-e "$instdir/debian-ubuntu/loncapa") && (-e "$apache2_sites_available_dir/loncapa")) {  
             if (open(PIPE, "diff --brief $instdir/debian-ubuntu/loncapa $apache2_sites_available_dir/loncapa |")) {  
                 my $diffres = <PIPE>;  
                 close(PIPE);  
                 chomp($diffres);  
                 if ($diffres) {  
                     copy("$apache2_sites_available_dir/loncapa","$apache2_sites_available_dir/loncapa.original");  
                 }  
                 if (-l $defaultconfig) {  
                     my $linkfname = readlink($defaultconfig);  
                     if ($linkfname eq "$apache2_sites_available_dir/loncapa") {  
                         unless ($diffres) {  
                             $skipsite = 1;  
                         }  
                     }  
                 }  
             }  
         }  
         unless ($skipsite) {  
             if (-l $defaultconfig) {  
                 unlink($defaultconfig);  
             }  
             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 "$instdir/debian-ubuntu/loncapa") {  
                 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");  
             }  
         }  
     }  
     if ($distname eq 'ubuntu') {  
         my $sitestatus = "$apache2_mods_available_dir/status.conf";  
         my $stdstatus = "$instdir/debian-ubuntu/status.conf";  
         if ((-e $sitestatus) && (-e $stdstatus)) {  
             if (open(PIPE, "diff --brief $stdstatus $sitestatus |")) {  
                 my $diffres = <PIPE>;  
                 close(PIPE);  
                 chomp($diffres);  
                 if ($diffres) {  
                     copy("$apache2_mods_available_dir/status.conf","$apache2_mods_available_dir/status.conf.original");  
                 } else {  
                     $skipstatus = 1;  
                 }  
             }  
         }  
         unless ($skipstatus) {  
             if (-e $stdstatus) {  
                 print_and_log(&mt('Copying loncapa [_1] file to [_2],',"'status.conf'","'/etc/apache2/mods-available/status.conf'")."\n");  
                 copy($stdstatus,$sitestatus);  
                 chmod(0644,$sitestatus);  
             }  
         }          }
           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 2402  sub copy_apache2_debconf { Line 2170  sub copy_apache2_debconf {
 ###########################################################  ###########################################################
   
 sub copy_apache2_suseconf {  sub copy_apache2_suseconf {
     my ($instdir,$distro) = @_;      my ($instdir,$hostname) = @_;
     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 $conf_file,"/etc/apache2/default-server.conf";      copy "$instdir/sles-suse/default-server.conf","/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 2425  sub copy_apache2_suseconf { Line 2188  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,$name,$version);       &copy_sysconfig_apache2_file($instdir); 
     print_and_log("\n");      print_and_log("\n");
 }  }
   
Line 2451  sub copy_apache2_conf_files { Line 2214  sub copy_apache2_conf_files {
 ##  ##
 ###############################################  ###############################################
 sub copy_sysconfig_apache2_file {  sub copy_sysconfig_apache2_file {
     my ($instdir,$name,$version) = @_;      my ($instdir) = @_;
     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";
     }      }
     my $sysconf_file = "$instdir/sles-suse/sysconfig_apache2";      copy "$instdir/sles-suse/sysconfig_apache2","/etc/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");
 }  }
   
Line 2588  wget http://install.loncapa.org/versions Line 2347  wget http://install.loncapa.org/versions
         print &mt('LON-CAPA source files extracted.')."\n".          print &mt('LON-CAPA source files extracted.')."\n".
               &mt('It remains for you to execute the following commands:')."                &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')  cd /root/loncapa-N.N     (N.N should correspond to a version number like '0.4')
 ./UPDATE  ./UPDATE
   
 ".&mt('If you have any trouble, please see [_1] and [_2]',  ".&mt('If you have any trouble, please see [_1] and [_2]',

Removed from v.1.45.2.7  
changed lines
  Added in v.1.46


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