Bug 7298: (follow-up) fix uninitialized variable warning
[koha.git] / installer / install.pl
index 80df97f..58388cb 100755 (executable)
@@ -4,16 +4,16 @@ use strict;
 use warnings;
 use diagnostics;
 
-# use Install;
 use InstallAuth;
+use CGI;
+use IPC::Cmd;
+
 use C4::Context;
 use C4::Output;
+use C4::Templates;
 use C4::Languages qw(getAllLanguages getTranslatedLanguages);
 use C4::Installer;
 
-use CGI;
-use IPC::Cmd;
-
 my $query = new CGI;
 my $step  = $query->param('step');
 
@@ -23,7 +23,7 @@ my ( $template, $loggedinuser, $cookie );
 my $all_languages = getAllLanguages();
 
 if ( defined($language) ) {
-    setlanguagecookie( $query, $language, "install.pl?step=1" );
+    C4::Templates::setlanguagecookie( $query, $language, "install.pl?step=1" );
 }
 ( $template, $loggedinuser, $cookie ) = get_template_and_user(
     {
@@ -57,126 +57,35 @@ if ( $step && $step == 1 ) {
     #Checking ALL perl Modules and services needed are installed.
     #Whenever there is an error, adding a report to the page
     $template->param( language => 1 );
-    my $problem;
+    $template->param( 'checkmodule' => 1 ); # we start with the assumption that there are no problems and set this to 0 if there are
 
-    unless ( $] >= 5.006001 ) {    # Bug 179
-        $template->param( "problems" => 1, "perlversion" => 1 );
-        $problem = 1;
-    }
-
-    # We could here use a special find
-    my @missing = ();
-    unless ( eval { require ZOOM } ) {
-        push @missing, { name => "ZOOM" };
-    }
-    unless ( eval { require YAML::Syck } ) {
-        push @missing, { name => "YAML::Syck" };
-    }
-    unless ( eval { require LWP::Simple } ) {
-        push @missing, { name => "LWP::Simple" };
-    }
-    unless ( eval { require XML::Simple } ) {
-        push @missing, { name => "XML::Simple" };
-    }
-    unless ( eval { require MARC::File::XML } ) {
-        push @missing, { name => "MARC::File::XML" };
-    }
-    unless ( eval { require MARC::File::USMARC } ) {
-        push @missing, { name => "MARC::File::USMARC" };
-    }
-    unless ( eval { require DBI } ) {
-        push @missing, { name => "DBI" };
-    }
-    unless ( eval { require Date::Manip } ) {
-        push @missing, { name => "Date::Manip" };
-    }
-    unless ( eval { require DBD::mysql } ) {
-        push @missing, { name => "DBD::mysql" };
-    }
-    unless ( eval { require HTML::Template::Pro } ) {
-        push @missing, { name => "HTML::Template::Pro" };
-    }
-    unless ( eval { require Date::Calc } ) {
-        push @missing, { name => "Date::Calc" };
-    }
-    unless ( eval { require Digest::MD5 } ) {
-        push @missing, { name => "Digest::MD5" };
-    }
-    unless ( eval { require MARC::Record } ) {
-        push @missing, { name => "MARC::Record" };
-    }
-    unless ( eval { require Mail::Sendmail } ) {
-        push @missing, { name => "Mail::Sendmail", usagemail => 1 };
-    }
-    unless ( eval { require List::MoreUtils } ) {
-        push @missing, { name => "List::MoreUtils" };
-    }
-    unless ( eval { require XML::RSS } ) {
-        push @missing, { name => "XML::RSS" };
-    }
-    unless ( eval { require CGI::Carp } ) {
-        push @missing, { name => "CGI::Carp" };
+    unless ( $] >= 5.010000 ) {    # Bug 7375
+        $template->param( problems => 1, perlversion => 1, checkmodule => 0 );
     }
 
+    my $perl_modules = C4::Installer::PerlModules->new;
+    $perl_modules->version_info;
 
-# The following modules are not mandatory, depends on how the library want to use Koha
-    unless ( eval { require PDF::API2 } ) {
-        if ( $#missing >= 0 ) {   # only when $#missing >= 0 so this isn't fatal
-            push @missing, { name => "PDF::API2", usagebarcode => 1 };
-        }
-    }
-    unless ( eval { require GD::Barcorde } ) {
-        if ( $#missing >= 0 ) {   # only when $#missing >= 0 so this isn't fatal
-            push @missing,
-              { name => "GD::Barcode", usagebarcode => 1, usagespine => 1 };
-        }
-    }
-    unless ( eval { require GD } ) {
-        if ( $#missing >= 0 ) {   # only when $#missing >= 0 so this isn't fatal
-            push @missing,
-              { name => "GD", usagepatronimages => 1 };
-        }
-    }
-    unless ( eval { require Graphics::Magick } ) {
-        if ( $#missing >= 0 ) {   # only when $#missing >= 0 so this isn't fatal
-            push @missing,
-              { name => "Graphics::Magick", usagepatroncards => 1 };
-        }
-    }
-    unless ( eval { require Data::Random } ) {
-        if ( $#missing >= 0 ) {   # only when $#missing >= 0 so this isn't fatal
-            push @missing, { name => "Data::Random", usagebarcode => 1 };
-        }
-    }
-    unless ( eval { require PDF::Reuse::Barcode } ) {
-        if ( $#missing >= 0 ) {   # only when $#missing >= 0 so this isn't fatal
-            push @missing, { name => "PDF::Reuse::Barcode", usagebarcode => 1 };
-        }
-    }
-    unless ( eval { require PDF::Report } ) {
-        if ( $#missing >= 0 ) {   # only when $#missing >= 0 so this isn't fatal
-            push @missing, { name => "PDF::Report", usagebarcode => 1 };
-        }
-    }
-    unless ( eval { require Algorithm::CheckDigits } ) {
-        if ( $#missing >= 0 ) {   # only when $#missing >= 0 so this isn't fatal
-            push @missing, { name => "Algorithm::CheckDigits", usagebarcode => 1 };
-        }
-    }
-    unless ( eval { require GD::Barcode::UPCE } ) {
-        if ( $#missing >= 0 ) {   # only when $#missing >= 0 so this isn't fatal
-            push @missing, { name => "GD::Barcode::UPCE", usagepine => 1 };
-        }
-    }
-    unless ( eval { require Net::LDAP } ) {
-        if ( $#missing >= 0 ) {   # only when $#missing >= 0 so this isn't fatal
-            push @missing, { name => "Net::LDAP", usageLDAP => 1 };
+    my $modules = $perl_modules->get_attr('missing_pm');
+    if (scalar(@$modules)) {
+        my @components = ();
+        my $checkmodule = 1;
+        foreach (@$modules) {
+            my ($module, $stats) = each %$_;
+            $checkmodule = 0 if $stats->{'required'};
+            push(
+                @components,
+                {
+                    name    => $module,
+                    version => $stats->{'min_ver'},
+                    require => $stats->{'required'},
+                    usage   => $stats->{'usage'},
+                }
+            );
         }
+        @components = sort {$a->{'name'} cmp $b->{'name'}} @components;
+        $template->param( missing_modules => \@components, checkmodule => $checkmodule );
     }
-    $template->param( missings => \@missing ) if ( scalar(@missing) > 0 );
-    $template->param( 'checkmodule' => 1 )
-      unless ( scalar(@missing) && $problem );
-
 }
 elsif ( $step && $step == 2 ) {
 #
@@ -276,7 +185,7 @@ elsif ( $step && $step == 3 ) {
         # we have finished, just redirect to mainpage.
         #
         print $query->redirect("/cgi-bin/koha/mainpage.pl");
-        exit 1;
+        exit;
     }
     elsif ( $op && $op eq 'finish' ) {
         $installer->set_version_syspref();
@@ -287,10 +196,6 @@ elsif ( $step && $step == 3 ) {
         # The installer will have to relogin since we do not pass cookie to redirection.
         $template->param( "$op" => 1 );
     }
-    elsif ( $op && $op eq 'SetIndexingEngine' ) {
-        $installer->set_indexing_engine($query->param('NoZebra'));
-        $template->param( "$op" => 1 );
-    }
     elsif ( $op && $op eq 'addframeworks' ) {
     #
     # 1ST install, 3rd sub-step : insert the SQL files the user has selected
@@ -323,6 +228,7 @@ elsif ( $step && $step == 3 ) {
         # Framework Selection is achieved through checking boxes.
         my $langchoice = $query->param('fwklanguage');
         $langchoice = $query->cookie('KohaOpacLanguage') unless ($langchoice);
+       $langchoice =~ s/[^a-zA-Z_-]*//g;
         my $marcflavour = $query->param('marcflavour');
         if ($marcflavour){
             $installer->set_marcflavour_syspref($marcflavour);
@@ -360,6 +266,7 @@ elsif ( $step && $step == 3 ) {
         # Marcflavour Selection is achieved through radiobuttons.
         my $langchoice = $query->param('fwklanguage');
         $langchoice = $query->cookie('KohaOpacLanguage') unless ($langchoice);
+       $langchoice =~ s/[^a-zA-Z_-]*//g;
         my $dir =
           C4::Context->config('intranetdir') . "/installer/data/$info{dbms}/$langchoice/marcflavour";
         unless (opendir( MYDIR, $dir )) {
@@ -404,6 +311,15 @@ elsif ( $step && $step == 3 ) {
         # Not 1st install, the only sub-step : update database
         #
         #Do updatedatabase And report
+
+    if ( ! defined $ENV{PERL5LIB} ) {
+        my $find = "C4/Context.pm";
+        my $path = $INC{$find};
+        $path =~ s/\Q$find\E//;
+        $ENV{PERL5LIB} = "$path:$path/installer";
+        warn "# plack? inserted PERL5LIB $ENV{PERL5LIB}\n";
+    }
+
         my $cmd = C4::Context->config("intranetdir") . "/installer/data/$info{dbms}/updatedatabase.pl";
         my ($success, $error_code, $full_buf, $stdout_buf, $stderr_buf) = IPC::Cmd::run(command => $cmd, verbose => 0);
 
@@ -422,7 +338,7 @@ elsif ( $step && $step == 3 ) {
     }
     else {
         #
-        # check wether it's a 1st install or an update
+        # check whether it's a 1st install or an update
         #
         #Check if there are enough tables.
         # Paul has cleaned up tables so reduced the count