Lines 1-5
Link Here
|
1 |
#!/usr/bin/perl |
1 |
#!/usr/bin/perl |
2 |
|
2 |
|
|
|
3 |
# This file is part of Koha. |
4 |
# |
5 |
# Copyright (C) 2017 Catalyst IT |
6 |
# |
7 |
# Koha is free software; you can redistribute it and/or modify it |
8 |
# under the terms of the GNU General Public License as published by |
9 |
# the Free Software Foundation; either version 3 of the License, or |
10 |
# (at your option) any later version. |
11 |
# |
12 |
# Koha is distributed in the hope that it will be useful, but |
13 |
# WITHOUT ANY WARRANTY; without even the implied warranty of |
14 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 |
# GNU General Public License for more details. |
16 |
# |
17 |
# You should have received a copy of the GNU General Public License |
18 |
# along with Koha; if not, see <http://www.gnu.org/licenses>. |
19 |
|
3 |
use strict; |
20 |
use strict; |
4 |
use warnings; |
21 |
use warnings; |
5 |
use diagnostics; |
22 |
use diagnostics; |
Lines 40-49
if ( defined($language) ) {
Link Here
|
40 |
my $installer = C4::Installer->new(); |
57 |
my $installer = C4::Installer->new(); |
41 |
my %info; |
58 |
my %info; |
42 |
$info{'dbname'} = C4::Context->config("database"); |
59 |
$info{'dbname'} = C4::Context->config("database"); |
43 |
$info{'dbms'} = |
60 |
$info{'dbms'} = ( |
44 |
( C4::Context->config("db_scheme") |
61 |
C4::Context->config("db_scheme") |
45 |
? C4::Context->config("db_scheme") |
62 |
? C4::Context->config("db_scheme") |
46 |
: "mysql" ); |
63 |
: "mysql" |
|
|
64 |
); |
47 |
$info{'hostname'} = C4::Context->config("hostname"); |
65 |
$info{'hostname'} = C4::Context->config("hostname"); |
48 |
$info{'port'} = C4::Context->config("port"); |
66 |
$info{'port'} = C4::Context->config("port"); |
49 |
$info{'user'} = C4::Context->config("user"); |
67 |
$info{'user'} = C4::Context->config("user"); |
Lines 65-76
my $dbh = DBI->connect(
Link Here
|
65 |
); |
83 |
); |
66 |
|
84 |
|
67 |
if ( $step && $step == 1 ) { |
85 |
if ( $step && $step == 1 ) { |
|
|
86 |
|
68 |
#First Step (for both fresh installations and upgrades) |
87 |
#First Step (for both fresh installations and upgrades) |
69 |
#Checking ALL perl Modules and services needed are installed. |
88 |
#Checking ALL perl Modules and services needed are installed. |
70 |
#Whenever there is an error, adding a report to the page |
89 |
#Whenever there is an error, adding a report to the page |
71 |
my $op = $query->param('op') || 'noop'; |
90 |
my $op = $query->param('op') || 'noop'; |
72 |
$template->param( language => 1 ); |
91 |
$template->param( language => 1 ); |
73 |
$template->param( 'checkmodule' => 1 ); # we start with the assumption that there are no problems and set this to 0 if there are |
92 |
$template->param( 'checkmodule' => 1 ) |
|
|
93 |
; # we start with the assumption that there are no problems and set this to 0 if there are |
74 |
|
94 |
|
75 |
unless ( $] >= 5.010000 ) { # Bug 7375 |
95 |
unless ( $] >= 5.010000 ) { # Bug 7375 |
76 |
$template->param( problems => 1, perlversion => 1, checkmodule => 0 ); |
96 |
$template->param( problems => 1, perlversion => 1, checkmodule => 0 ); |
Lines 80-90
if ( $step && $step == 1 ) {
Link Here
|
80 |
$perl_modules->versions_info; |
100 |
$perl_modules->versions_info; |
81 |
|
101 |
|
82 |
my $modules = $perl_modules->get_attr('missing_pm'); |
102 |
my $modules = $perl_modules->get_attr('missing_pm'); |
83 |
if (scalar(@$modules)) { |
103 |
if ( scalar(@$modules) ) { |
84 |
my @components = (); |
104 |
my @components = (); |
85 |
my $checkmodule = 1; |
105 |
my $checkmodule = 1; |
86 |
foreach (@$modules) { |
106 |
foreach (@$modules) { |
87 |
my ($module, $stats) = each %$_; |
107 |
my ( $module, $stats ) = each %$_; |
88 |
$checkmodule = 0 if $stats->{'required'}; |
108 |
$checkmodule = 0 if $stats->{'required'}; |
89 |
push( |
109 |
push( |
90 |
@components, |
110 |
@components, |
Lines 96-109
if ( $step && $step == 1 ) {
Link Here
|
96 |
} |
116 |
} |
97 |
); |
117 |
); |
98 |
} |
118 |
} |
99 |
@components = sort {$a->{'name'} cmp $b->{'name'}} @components; |
119 |
@components = sort { $a->{'name'} cmp $b->{'name'} } @components; |
100 |
$template->param( missing_modules => \@components, checkmodule => $checkmodule, op => $op ); |
120 |
$template->param( |
|
|
121 |
missing_modules => \@components, |
122 |
checkmodule => $checkmodule, |
123 |
op => $op |
124 |
); |
101 |
} |
125 |
} |
102 |
} |
126 |
} |
103 |
elsif ( $step && $step == 2 ) { |
127 |
elsif ( $step && $step == 2 ) { |
104 |
# |
128 |
|
105 |
#STEP 2 Check Database connection and access |
129 |
#STEP 2 Check Database connection and access |
106 |
# |
130 |
|
107 |
$template->param(%info); |
131 |
$template->param(%info); |
108 |
my $checkdb = $query->param("checkdb"); |
132 |
my $checkdb = $query->param("checkdb"); |
109 |
$template->param( 'dbconnection' => $checkdb ); |
133 |
$template->param( 'dbconnection' => $checkdb ); |
Lines 128-134
elsif ( $step && $step == 2 ) {
Link Here
|
128 |
my $grantaccess; |
152 |
my $grantaccess; |
129 |
while ( my ($line) = $rq->fetchrow ) { |
153 |
while ( my ($line) = $rq->fetchrow ) { |
130 |
my $dbname = $info{dbname}; |
154 |
my $dbname = $info{dbname}; |
131 |
if ( $line =~ m/^GRANT (.*?) ON `$dbname`\.\*/ || index( $line, '*.*' ) > 0 ) { |
155 |
if ( $line =~ m/^GRANT (.*?) ON `$dbname`\.\*/ |
|
|
156 |
|| index( $line, '*.*' ) > 0 ) |
157 |
{ |
132 |
$grantaccess = 1 |
158 |
$grantaccess = 1 |
133 |
if ( |
159 |
if ( |
134 |
index( $line, 'ALL PRIVILEGES' ) > 0 |
160 |
index( $line, 'ALL PRIVILEGES' ) > 0 |
Lines 163-185
elsif ( $step && $step == 2 ) {
Link Here
|
163 |
} |
189 |
} |
164 |
} |
190 |
} |
165 |
$template->param( "checkgrantaccess" => $grantaccess ); |
191 |
$template->param( "checkgrantaccess" => $grantaccess ); |
166 |
} # End mysql connect check... |
192 |
} # End mysql connect check... |
167 |
|
193 |
|
168 |
elsif ( $info{dbms} eq "Pg" ) { |
194 |
elsif ( $info{dbms} eq "Pg" ) { |
169 |
# Check if database has been created... |
195 |
|
170 |
my $rv = $dbh->do( "SELECT * FROM pg_catalog.pg_database WHERE datname = \'$info{dbname}\';" ); |
196 |
# Check if database has been created... |
171 |
if ( $rv == 1 ) { |
197 |
my $rv = $dbh->do( |
172 |
$template->param( 'checkdatabasecreated' => 1 ); |
198 |
"SELECT * FROM pg_catalog.pg_database WHERE datname = \'$info{dbname}\';" |
173 |
} |
199 |
); |
174 |
|
200 |
if ( $rv == 1 ) { |
175 |
# Check if user has all necessary grants on this database... |
201 |
$template->param( 'checkdatabasecreated' => 1 ); |
176 |
my $rq = $dbh->do( "SELECT u.usesuper |
202 |
} |
177 |
FROM pg_catalog.pg_user as u |
203 |
|
178 |
WHERE u.usename = \'$info{user}\';" ); |
204 |
# Check if user has all necessary grants on this database... |
179 |
if ( $rq == 1 ) { |
205 |
my $rq = $dbh->do( |
180 |
$template->param( "checkgrantaccess" => 1 ); |
206 |
"SELECT u.usesuper |
181 |
} |
207 |
FROM pg_catalog.pg_user as u |
182 |
} # End Pg connect check... |
208 |
WHERE u.usename = \'$info{user}\';" |
|
|
209 |
); |
210 |
if ( $rq == 1 ) { |
211 |
$template->param( "checkgrantaccess" => 1 ); |
212 |
} |
213 |
} # End Pg connect check... |
183 |
} |
214 |
} |
184 |
else { |
215 |
else { |
185 |
$template->param( "error" => DBI::err, "message" => DBI::errstr ); |
216 |
$template->param( "error" => DBI::err, "message" => DBI::errstr ); |
Lines 187-197
elsif ( $step && $step == 2 ) {
Link Here
|
187 |
} |
218 |
} |
188 |
} |
219 |
} |
189 |
elsif ( $step && $step == 3 ) { |
220 |
elsif ( $step && $step == 3 ) { |
190 |
# |
221 |
|
191 |
# |
222 |
# STEP 3 : database setup |
192 |
# STEP 3 : database setup |
223 |
|
193 |
# |
|
|
194 |
# |
195 |
my $op = $query->param('op'); |
224 |
my $op = $query->param('op'); |
196 |
if ( $op && $op eq 'finished' ) { |
225 |
if ( $op && $op eq 'finished' ) { |
197 |
# |
226 |
# |
Lines 203-220
elsif ( $step && $step == 3 ) {
Link Here
|
203 |
elsif ( $op && $op eq 'finish' ) { |
232 |
elsif ( $op && $op eq 'finish' ) { |
204 |
$installer->set_version_syspref(); |
233 |
$installer->set_version_syspref(); |
205 |
|
234 |
|
206 |
# Installation is finished. |
235 |
# Installation is finished. |
207 |
# We just deny anybody access to install |
236 |
# We just deny anybody access to install |
208 |
# And we redirect people to mainpage. |
237 |
# And we redirect people to mainpage. |
209 |
# The installer will have to relogin since we do not pass cookie to redirection. |
238 |
# The installer will have to relogin since we do not pass cookie to redirection. |
210 |
$template->param( "$op" => 1 ); |
239 |
$template->param( "$op" => 1 ); |
211 |
} |
240 |
} |
|
|
241 |
|
212 |
elsif ( $op && $op eq 'addframeworks' ) { |
242 |
elsif ( $op && $op eq 'addframeworks' ) { |
213 |
# |
|
|
214 |
# 1ST install, 3rd sub-step : insert the SQL files the user has selected |
215 |
# |
216 |
|
243 |
|
217 |
my ($fwk_language, $list) = $installer->load_sql_in_order($all_languages, $query->param('framework')); |
244 |
# 1ST install, 3rd sub-step : insert the SQL files the user has selected |
|
|
245 |
|
246 |
my ( $fwk_language, $list ) = |
247 |
$installer->load_sql_in_order( $all_languages, |
248 |
$query->param('framework') ); |
218 |
$template->param( |
249 |
$template->param( |
219 |
"fwklanguage" => $fwk_language, |
250 |
"fwklanguage" => $fwk_language, |
220 |
"list" => $list |
251 |
"list" => $list |
Lines 224-265
elsif ( $step && $step == 3 ) {
Link Here
|
224 |
$template->param( "$op" => 1 ); |
255 |
$template->param( "$op" => 1 ); |
225 |
} |
256 |
} |
226 |
elsif ( $op && $op eq 'selectframeworks' ) { |
257 |
elsif ( $op && $op eq 'selectframeworks' ) { |
227 |
# |
258 |
# |
228 |
# |
259 |
# |
229 |
# 1ST install, 2nd sub-step : show the user the sql datas he can insert in the database. |
260 |
# 1ST install, 2nd sub-step : show the user the sql datas he can insert in the database. |
230 |
# |
261 |
# |
231 |
# |
262 |
# |
232 |
# (note that the term "selectframeworks is not correct. The user can select various files, not only frameworks) |
263 |
# (note that the term "selectframeworks is not correct. The user can select various files, not only frameworks) |
233 |
|
264 |
|
234 |
#Framework Selection |
265 |
#Framework Selection |
235 |
#sql data for import are supposed to be located in installer/data/<language>/<level> |
266 |
#sql data for import are supposed to be located in installer/data/<language>/<level> |
236 |
# Where <language> is en|fr or any international abbreviation (provided language hash is updated... This will be a problem with internationlisation.) |
267 |
# Where <language> is en|fr or any international abbreviation (provided language hash is updated... This will be a problem with internationlisation.) |
237 |
# Where <level> is a category of requirement : required, recommended optional |
268 |
# Where <level> is a category of requirement : required, recommended optional |
238 |
# level should contain : |
269 |
# level should contain : |
239 |
# SQL File for import With a readable name. |
270 |
# SQL File for import With a readable name. |
240 |
# txt File that explains what this SQL File is meant for. |
271 |
# txt File that explains what this SQL File is meant for. |
241 |
# Could be VERY useful to have A Big file for a kind of library. |
272 |
# Could be VERY useful to have A Big file for a kind of library. |
242 |
# But could also be useful to have some Authorised values data set prepared here. |
273 |
# But could also be useful to have some Authorised values data set prepared here. |
243 |
# Framework Selection is achieved through checking boxes. |
274 |
# Framework Selection is achieved through checking boxes. |
244 |
my $langchoice = $query->param('fwklanguage'); |
275 |
my $langchoice = $query->param('fwklanguage'); |
245 |
$langchoice = $query->cookie('KohaOpacLanguage') unless ($langchoice); |
276 |
$langchoice = $query->cookie('KohaOpacLanguage') unless ($langchoice); |
246 |
$langchoice =~ s/[^a-zA-Z_-]*//g; |
277 |
$langchoice =~ s/[^a-zA-Z_-]*//g; |
247 |
my $marcflavour = $query->param('marcflavour'); |
278 |
my $marcflavour = $query->param('marcflavour'); |
248 |
if ($marcflavour){ |
279 |
if ($marcflavour) { |
249 |
$installer->set_marcflavour_syspref($marcflavour); |
280 |
$installer->set_marcflavour_syspref($marcflavour); |
250 |
}; |
281 |
} |
251 |
$marcflavour = C4::Context->preference('marcflavour') unless ($marcflavour); |
282 |
$marcflavour = C4::Context->preference('marcflavour') |
|
|
283 |
unless ($marcflavour); |
284 |
|
252 |
#Insert into database the selected marcflavour |
285 |
#Insert into database the selected marcflavour |
253 |
undef $/; |
286 |
undef $/; |
254 |
my ($marc_defaulted_to_en, $fwklist) = $installer->marc_framework_sql_list($langchoice, $marcflavour); |
287 |
my ( $marc_defaulted_to_en, $fwklist ) = |
255 |
$template->param('en_marc_frameworks' => $marc_defaulted_to_en); |
288 |
$installer->marc_framework_sql_list( $langchoice, $marcflavour ); |
256 |
$template->param( "frameworksloop" => $fwklist ); |
289 |
$template->param( 'en_marc_frameworks' => $marc_defaulted_to_en ); |
257 |
$template->param( "marcflavour" => ucfirst($marcflavour)); |
290 |
$template->param( "frameworksloop" => $fwklist ); |
258 |
|
291 |
$template->param( "marcflavour" => ucfirst($marcflavour) ); |
259 |
my ($sample_defaulted_to_en, $levellist) = $installer->sample_data_sql_list($langchoice); |
292 |
|
260 |
$template->param( "en_sample_data" => $sample_defaulted_to_en); |
293 |
my ( $sample_defaulted_to_en, $levellist ) = |
261 |
$template->param( "levelloop" => $levellist ); |
294 |
$installer->sample_data_sql_list($langchoice); |
262 |
$template->param( "$op" => 1 ); |
295 |
$template->param( "en_sample_data" => $sample_defaulted_to_en ); |
|
|
296 |
$template->param( "levelloop" => $levellist ); |
297 |
$template->param( "$op" => 1 ); |
298 |
|
299 |
my $setup = $query->param('setup'); |
300 |
$template->param( "setup" => $setup ); |
301 |
|
263 |
} |
302 |
} |
264 |
elsif ( $op && $op eq 'choosemarc' ) { |
303 |
elsif ( $op && $op eq 'choosemarc' ) { |
265 |
# |
304 |
# |
Lines 268-313
elsif ( $step && $step == 3 ) {
Link Here
|
268 |
# |
307 |
# |
269 |
# |
308 |
# |
270 |
|
309 |
|
271 |
#Choose Marc Flavour |
310 |
#Choose Marc Flavour |
272 |
#sql data are supposed to be located in installer/data/<dbms>/<language>/marcflavour/marcflavourname |
311 |
#sql data are supposed to be located in installer/data/<dbms>/<language>/marcflavour/marcflavourname |
273 |
# Where <dbms> is database type according to DBD syntax |
312 |
# Where <dbms> is database type according to DBD syntax |
274 |
# Where <language> is en|fr or any international abbreviation (provided language hash is updated... This will be a problem with internationlisation.) |
313 |
# Where <language> is en|fr or any international abbreviation (provided language hash is updated... This will be a problem with internationlisation.) |
275 |
# Where <level> is a category of requirement : required, recommended optional |
314 |
# Where <level> is a category of requirement : required, recommended optional |
276 |
# level should contain : |
315 |
# level should contain : |
277 |
# SQL File for import With a readable name. |
316 |
# SQL File for import With a readable name. |
278 |
# txt File taht explains what this SQL File is meant for. |
317 |
# txt File taht explains what this SQL File is meant for. |
279 |
# Could be VERY useful to have A Big file for a kind of library. |
318 |
# Could be VERY useful to have A Big file for a kind of library. |
280 |
# But could also be useful to have some Authorised values data set prepared here. |
319 |
# But could also be useful to have some Authorised values data set prepared here. |
281 |
# Marcflavour Selection is achieved through radiobuttons. |
320 |
# Marcflavour Selection is achieved through radiobuttons. |
282 |
my $langchoice = $query->param('fwklanguage'); |
321 |
my $langchoice = $query->param('fwklanguage'); |
|
|
322 |
|
283 |
$langchoice = $query->cookie('KohaOpacLanguage') unless ($langchoice); |
323 |
$langchoice = $query->cookie('KohaOpacLanguage') unless ($langchoice); |
284 |
$langchoice =~ s/[^a-zA-Z_-]*//g; |
324 |
$langchoice =~ s/[^a-zA-Z_-]*//g; |
285 |
my $dir = |
325 |
my $dir = |
286 |
C4::Context->config('intranetdir') . "/installer/data/$info{dbms}/$langchoice/marcflavour"; |
326 |
C4::Context->config('intranetdir') |
287 |
unless (opendir( MYDIR, $dir )) { |
327 |
. "/installer/data/$info{dbms}/$langchoice/marcflavour"; |
288 |
if ($langchoice eq 'en') { |
328 |
unless ( opendir( MYDIR, $dir ) ) { |
|
|
329 |
if ( $langchoice eq 'en' ) { |
289 |
warn "cannot open MARC frameworks directory $dir"; |
330 |
warn "cannot open MARC frameworks directory $dir"; |
290 |
} else { |
331 |
} |
|
|
332 |
else { |
291 |
# if no translated MARC framework is available, |
333 |
# if no translated MARC framework is available, |
292 |
# default to English |
334 |
# default to English |
293 |
$dir = C4::Context->config('intranetdir') . "/installer/data/$info{dbms}/en/marcflavour"; |
335 |
$dir = C4::Context->config('intranetdir') |
294 |
opendir(MYDIR, $dir) or warn "cannot open English MARC frameworks directory $dir"; |
336 |
. "/installer/data/$info{dbms}/en/marcflavour"; |
|
|
337 |
opendir( MYDIR, $dir ) |
338 |
or warn "cannot open English MARC frameworks directory $dir"; |
295 |
} |
339 |
} |
296 |
} |
340 |
} |
297 |
my @listdir = grep { !/^\./ && -d "$dir/$_" } readdir(MYDIR); |
341 |
my @listdir = grep { !/^\./ && -d "$dir/$_" } readdir(MYDIR); |
298 |
closedir MYDIR; |
342 |
closedir MYDIR; |
299 |
my $marcflavour=C4::Context->preference("marcflavour"); |
343 |
my $marcflavour = C4::Context->preference("marcflavour"); |
300 |
my @flavourlist; |
344 |
my @flavourlist; |
301 |
foreach my $marc (@listdir) { |
345 |
foreach my $marc (@listdir) { |
302 |
my %cell=( |
346 |
my %cell = ( |
303 |
"label"=> ucfirst($marc), |
347 |
"label" => ucfirst($marc), |
304 |
"code"=>uc($marc), |
348 |
"code" => uc($marc), |
305 |
"checked"=> defined($marcflavour) ? uc($marc) eq $marcflavour : 0); |
349 |
"checked" => defined($marcflavour) |
|
|
350 |
? uc($marc) eq $marcflavour |
351 |
: 0 |
352 |
); |
353 |
|
306 |
# $cell{"description"}= do { local $/ = undef; open INPUT "<$dir/$marc.txt"||"";<INPUT> }; |
354 |
# $cell{"description"}= do { local $/ = undef; open INPUT "<$dir/$marc.txt"||"";<INPUT> }; |
307 |
push @flavourlist, \%cell; |
355 |
push @flavourlist, \%cell; |
308 |
} |
356 |
} |
309 |
$template->param( "flavourloop" => \@flavourlist ); |
357 |
$template->param( "flavourloop" => \@flavourlist ); |
310 |
$template->param( "$op" => 1 ); |
358 |
$template->param( "$op" => 1 ); |
311 |
} |
359 |
} |
312 |
elsif ( $op && $op eq 'importdatastructure' ) { |
360 |
elsif ( $op && $op eq 'importdatastructure' ) { |
313 |
# |
361 |
# |
Lines 327-333
elsif ( $step && $step == 3 ) {
Link Here
|
327 |
# |
375 |
# |
328 |
#Do updatedatabase And report |
376 |
#Do updatedatabase And report |
329 |
|
377 |
|
330 |
if ( ! defined $ENV{PERL5LIB} ) { |
378 |
if ( !defined $ENV{PERL5LIB} ) { |
331 |
my $find = "C4/Context.pm"; |
379 |
my $find = "C4/Context.pm"; |
332 |
my $path = $INC{$find}; |
380 |
my $path = $INC{$find}; |
333 |
$path =~ s/\Q$find\E//; |
381 |
$path =~ s/\Q$find\E//; |
Lines 335-394
elsif ( $step && $step == 3 ) {
Link Here
|
335 |
warn "# plack? inserted PERL5LIB $ENV{PERL5LIB}\n"; |
383 |
warn "# plack? inserted PERL5LIB $ENV{PERL5LIB}\n"; |
336 |
} |
384 |
} |
337 |
|
385 |
|
338 |
my $now = POSIX::strftime( "%Y-%m-%dT%H:%M:%S", localtime() ); |
386 |
my $now = POSIX::strftime( "%Y-%m-%dT%H:%M:%S", localtime() ); |
339 |
my $logdir = C4::Context->config('logdir'); |
387 |
my $logdir = C4::Context->config('logdir'); |
340 |
my $dbversion = C4::Context->preference('Version'); |
388 |
my $dbversion = C4::Context->preference('Version'); |
341 |
my $kohaversion = Koha::version; |
389 |
my $kohaversion = Koha::version; |
342 |
$kohaversion =~ s/(.*\..*)\.(.*)\.(.*)/$1$2$3/; |
390 |
$kohaversion =~ s/(.*\..*)\.(.*)\.(.*)/$1$2$3/; |
343 |
|
391 |
|
344 |
my $filename_suffix = join '_', $now, $dbversion, $kohaversion; |
392 |
my $filename_suffix = join '_', $now, $dbversion, $kohaversion; |
345 |
my ( $logfilepath, $logfilepath_errors ) = ( chk_log($logdir, "updatedatabase_$filename_suffix"), chk_log($logdir, "updatedatabase-error_$filename_suffix") ); |
393 |
my ( $logfilepath, $logfilepath_errors ) = ( |
|
|
394 |
chk_log( $logdir, "updatedatabase_$filename_suffix" ), |
395 |
chk_log( $logdir, "updatedatabase-error_$filename_suffix" ) |
396 |
); |
346 |
|
397 |
|
347 |
my $cmd = C4::Context->config("intranetdir") . "/installer/data/$info{dbms}/updatedatabase.pl >> $logfilepath 2>> $logfilepath_errors"; |
398 |
my $cmd = C4::Context->config("intranetdir") |
|
|
399 |
. "/installer/data/$info{dbms}/updatedatabase.pl >> $logfilepath 2>> $logfilepath_errors"; |
348 |
|
400 |
|
349 |
system($cmd ); |
401 |
system($cmd ); |
350 |
|
402 |
|
351 |
my $fh; |
403 |
my $fh; |
352 |
open( $fh, "<", $logfilepath ) or die "Cannot open log file $logfilepath: $!"; |
404 |
open( $fh, "<", $logfilepath ) |
|
|
405 |
or die "Cannot open log file $logfilepath: $!"; |
353 |
my @report = <$fh>; |
406 |
my @report = <$fh>; |
354 |
close $fh; |
407 |
close $fh; |
355 |
if (@report) { |
408 |
if (@report) { |
356 |
$template->param( update_report => [ map { { line => $_ } } split( /\n/, join( '', @report ) ) ] ); |
409 |
$template->param( update_report => |
|
|
410 |
[ map { { line => $_ } } split( /\n/, join( '', @report ) ) ] |
411 |
); |
357 |
$template->param( has_update_succeeds => 1 ); |
412 |
$template->param( has_update_succeeds => 1 ); |
358 |
} else { |
|
|
359 |
eval{ `rm $logfilepath` }; |
360 |
} |
413 |
} |
361 |
open( $fh, "<", $logfilepath_errors ) or die "Cannot open log file $logfilepath_errors: $!"; |
414 |
else { |
|
|
415 |
eval { `rm $logfilepath` }; |
416 |
} |
417 |
open( $fh, "<", $logfilepath_errors ) |
418 |
or die "Cannot open log file $logfilepath_errors: $!"; |
362 |
@report = <$fh>; |
419 |
@report = <$fh>; |
363 |
close $fh; |
420 |
close $fh; |
364 |
if (@report) { |
421 |
if (@report) { |
365 |
$template->param( update_errors => [ map { { line => $_ } } split( /\n/, join( '', @report ) ) ] ); |
422 |
$template->param( update_errors => |
|
|
423 |
[ map { { line => $_ } } split( /\n/, join( '', @report ) ) ] |
424 |
); |
366 |
$template->param( has_update_errors => 1 ); |
425 |
$template->param( has_update_errors => 1 ); |
367 |
warn "The following errors were returned while attempting to run the updatedatabase.pl script:\n"; |
426 |
warn |
|
|
427 |
"The following errors were returned while attempting to run the updatedatabase.pl script:\n"; |
368 |
foreach my $line (@report) { warn "$line\n"; } |
428 |
foreach my $line (@report) { warn "$line\n"; } |
369 |
} else { |
429 |
} |
370 |
eval{ `rm $logfilepath_errors` }; |
430 |
else { |
|
|
431 |
eval { `rm $logfilepath_errors` }; |
371 |
} |
432 |
} |
372 |
$template->param( $op => 1 ); |
433 |
$template->param( $op => 1 ); |
373 |
} |
434 |
} |
374 |
else { |
435 |
else { |
375 |
# |
436 |
# |
376 |
# check whether it's a 1st install or an update |
437 |
# check whether it's a 1st install or an update |
377 |
# |
438 |
# |
378 |
#Check if there are enough tables. |
439 |
#Check if there are enough tables. |
379 |
# Paul has cleaned up tables so reduced the count |
440 |
# Paul has cleaned up tables so reduced the count |
380 |
#I put it there because it implied a data import if condition was not satisfied. |
441 |
#I put it there because it implied a data import if condition was not satisfied. |
381 |
my $dbh = DBI->connect( |
442 |
my $dbh = DBI->connect( |
382 |
"DBI:$info{dbms}:dbname=$info{dbname};host=$info{hostname}" |
443 |
"DBI:$info{dbms}:dbname=$info{dbname};host=$info{hostname}" |
383 |
. ( $info{port} ? ";port=$info{port}" : "" ) |
444 |
. ( $info{port} ? ";port=$info{port}" : "" ) |
384 |
. ( $info{tlsoptions} ? $info{tlsoptions} : "" ), |
445 |
. ( $info{tlsoptions} ? $info{tlsoptions} : "" ), |
385 |
$info{'user'}, $info{'password'} |
446 |
$info{'user'}, $info{'password'} |
386 |
); |
447 |
); |
387 |
my $rq; |
448 |
my $rq; |
388 |
if ( $info{dbms} eq 'mysql' ) { $rq = $dbh->prepare( "SHOW TABLES" ); } |
449 |
if ( $info{dbms} eq 'mysql' ) { $rq = $dbh->prepare("SHOW TABLES"); } |
389 |
elsif ( $info{dbms} eq 'Pg' ) { $rq = $dbh->prepare( "SELECT * |
450 |
elsif ( $info{dbms} eq 'Pg' ) { |
390 |
FROM information_schema.tables |
451 |
$rq = $dbh->prepare( |
391 |
WHERE table_schema='public' and table_type='BASE TABLE';" ); } |
452 |
"SELECT * |
|
|
453 |
FROM information_schema.tables |
454 |
WHERE table_schema='public' and table_type='BASE TABLE';" |
455 |
); |
456 |
} |
392 |
$rq->execute; |
457 |
$rq->execute; |
393 |
my $data = $rq->fetchall_arrayref( {} ); |
458 |
my $data = $rq->fetchall_arrayref( {} ); |
394 |
my $count = scalar(@$data); |
459 |
my $count = scalar(@$data); |
Lines 399-421
elsif ( $step && $step == 3 ) {
Link Here
|
399 |
$template->param( "count" => $count, "proposeimport" => 1 ); |
464 |
$template->param( "count" => $count, "proposeimport" => 1 ); |
400 |
} |
465 |
} |
401 |
else { |
466 |
else { |
402 |
# |
467 |
# |
403 |
# we have tables, propose to select files to upload or updatedatabase |
468 |
# we have tables, propose to select files to upload or updatedatabase |
404 |
# |
469 |
# |
405 |
$template->param( "count" => $count, "default" => 1 ); |
470 |
$template->param( "count" => $count, "default" => 1 ); |
406 |
# |
471 |
# |
407 |
# 1st part of step 3 : check if there is a databaseversion systempreference |
472 |
# 1st part of step 3 : check if there is a databaseversion systempreference |
408 |
# if there is, then we just need to upgrade |
473 |
# if there is, then we just need to upgrade |
409 |
# if there is none, then we need to install the database |
474 |
# if there is none, then we need to install the database |
410 |
# |
475 |
# |
411 |
if (C4::Context->preference('Version')) { |
476 |
if ( C4::Context->preference('Version') ) { |
412 |
my $dbversion = C4::Context->preference('Version'); |
477 |
my $dbversion = C4::Context->preference('Version'); |
413 |
$dbversion =~ /(.*)\.(..)(..)(...)/; |
478 |
$dbversion =~ /(.*)\.(..)(..)(...)/; |
414 |
$dbversion = "$1.$2.$3.$4"; |
479 |
$dbversion = "$1.$2.$3.$4"; |
415 |
$template->param("upgrading" => 1, |
480 |
$template->param( |
416 |
"dbversion" => $dbversion, |
481 |
"upgrading" => 1, |
417 |
"kohaversion" => Koha::version(), |
482 |
"dbversion" => $dbversion, |
418 |
); |
483 |
"kohaversion" => Koha::version(), |
|
|
484 |
); |
419 |
} |
485 |
} |
420 |
} |
486 |
} |
421 |
} |
487 |
} |
Lines 433-439
else {
Link Here
|
433 |
if ( $rq->execute ) { |
499 |
if ( $rq->execute ) { |
434 |
my ($version) = $rq->fetchrow; |
500 |
my ($version) = $rq->fetchrow; |
435 |
if ($version) { |
501 |
if ($version) { |
436 |
print $query->redirect("/cgi-bin/koha/installer/install.pl?step=3"); |
502 |
print $query->redirect( |
|
|
503 |
"/cgi-bin/koha/installer/install.pl?step=3"); |
437 |
exit; |
504 |
exit; |
438 |
} |
505 |
} |
439 |
} |
506 |
} |
Lines 441-453
else {
Link Here
|
441 |
} |
508 |
} |
442 |
output_html_with_http_headers $query, $cookie, $template->output; |
509 |
output_html_with_http_headers $query, $cookie, $template->output; |
443 |
|
510 |
|
444 |
sub chk_log { #returns a logfile in $dir or - if that failed - in temp dir |
511 |
sub chk_log { #returns a logfile in $dir or - if that failed - in temp dir |
445 |
my ($dir, $name) = @_; |
512 |
my ( $dir, $name ) = @_; |
446 |
my $fn=$dir.'/'.$name.'.log'; |
513 |
my $fn = $dir . '/' . $name . '.log'; |
447 |
if( ! open my $fh, '>', $fn ) { |
514 |
if ( !open my $fh, '>', $fn ) { |
448 |
$name.= '_XXXX'; |
515 |
$name .= '_XXXX'; |
449 |
require File::Temp; |
516 |
require File::Temp; |
450 |
($fh, $fn)= File::Temp::tempfile( $name, TMPDIR => 1, SUFFIX => '.log'); |
517 |
( $fh, $fn ) = |
|
|
518 |
File::Temp::tempfile( $name, TMPDIR => 1, SUFFIX => '.log' ); |
519 |
|
451 |
#if this should not work, let croak take over |
520 |
#if this should not work, let croak take over |
452 |
} |
521 |
} |
453 |
return $fn; |
522 |
return $fn; |