Adding a parameter to allow acces to people with management flag
[koha.git] / misc / Install.pm
1 package Install; #assumes Install.pm
2
3
4 # Copyright 2000-2002 Katipo Communications
5 # Contains parts Copyright 2003-4 MJ Ray
6 #
7 # This file is part of Koha.
8 #
9 # Koha is free software; you can redistribute it and/or modify it under the
10 # terms of the GNU General Public License as published by the Free Software
11 # Foundation; either version 2 of the License, or (at your option) any later
12 # version.
13 #
14 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
15 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
16 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License along with
19 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
20 # Suite 330, Boston, MA  02111-1307 USA
21 #
22 # Recent Authors
23 # MJR: my.cnf, etcdir, prefix, new display, apache conf, copying fixups
24
25 use strict;
26 use POSIX;
27 #MJR: everyone will have these modules, right?
28 # They look like part of perl core to me
29 #use Term::Cap;
30 use Term::ANSIColor qw(:constants);
31 use Text::Wrap;
32 use File::Temp qw/ :mktemp /;
33 require Exporter;
34
35 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
36
37 =head1 NAME
38
39 Install.pm - Perl module containing the bulk of the installation logic
40
41 =head1 DESCRIPTION
42
43 The Install.pm module contains the bulk
44 of the code to do installation;
45 this code is used by installer.pl
46 to perform an actual installation.
47
48 =head2 Internal functions (not meant to be used outside of Install.pm)
49
50 =over 4
51
52 =cut
53
54 # set the version for version checking
55 $VERSION = 0.01;
56
57 @ISA = qw(Exporter);
58 @EXPORT = qw(
59                 &read_autoinstall_file
60                 &checkperlmodules
61                 &checkabortedinstall
62                 &getmessage
63                 &showmessage
64                 &completeupgrade
65                 &releasecandidatewarning
66                 &getinstallationdirectories
67                 &getdatabaseinfo
68                 &getapacheinfo
69                 &getapachevhostinfo
70                 &updateapacheconf
71                 &basicauthentication
72                 &installfiles
73                 &databasesetup
74                 &updatedatabase
75                 &populatedatabase
76                 &restartapache
77                 &backupkoha
78                 &finalizeconfigfile
79                 &loadconfigfile
80                 &backupmycnf
81                 &restoremycnf
82                 );
83
84 use vars qw( $kohaversion $newversion );                        # set in loadconfigfile and installer.pl
85 use vars qw( $language );                       # set in installer.pl
86 use vars qw( $domainname );                     # set in installer.pl
87
88 use vars qw( $etcdir );                         # set in installer.pl, usu. /etc
89 use vars qw( $intranetdir $opacdir $kohalogdir );
90 use vars qw( $realhttpdconf $httpduser $httpdgroup );
91 use vars qw( $servername $svr_admin $opacport $intranetport );
92 use vars qw( $mysqldir );
93 use vars qw( $database $mysqluser );
94 use vars qw( $mysqlpass );                      # normally should not be used
95 use vars qw( $hostname $user $pass );   # virtual hosting
96
97 =item heading
98
99     $messages->{'WelcomeToKohaInstaller'
100         = heading('Welcome to the Koha Installer') . qq|...|;
101
102 The heading function takes one string, the text to be displayed as
103 the heading, and returns a formatted heading (currently formatted
104 with ANSI colours).
105
106 This reduces the likelihood of pod2man(1) etc. misinterpreting
107 a line of equal signs as illegal POD directives.
108
109 =cut
110
111 #my $termios = POSIX::Termios->new();
112 #$termios->getattr();
113 #my $terminal = Term::Cap->Tgetent({OSPEED=>$termios->getospeed()});
114 my $clear_string = "\n\n"; #MJR: was $terminal->Tputs('cl');
115
116 sub heading ($) {
117   my $title = shift;
118   my $bal = 5;
119   return($clear_string.ON_BLUE.WHITE.BOLD." "x$bal.uc($title)." "x$bal.RESET."\n\n");
120 }
121
122 my $mycnf = $ENV{HOME}."/.my.cnf";
123 my $mytmpcnf = mktemp("my.cnf.koha.XXXXXX");
124 chomp($mytmpcnf);
125
126 my $messages;
127 $messages->{'continuing'}->{en}="Great!  Continuing...\n\n";
128 $messages->{'WelcomeToKohaInstaller'}->{en} =
129    heading('Welcome to the Koha Installer') . qq|
130 This program will ask some questions and try to install koha for you.
131 You need to know: where most koha files should be stored (you can set
132 the prefix environment variable for this); the username and password of
133 a mysql superuser; and details of your library setup.  You may also need
134 to know details of your Apache setup.
135
136 If you want to install the Koha configuration files somewhere other than
137 /etc (for installing not as root, or to have many Kohas on one system, for example), you should
138 set the etcdir environment variable.  Please look at your manuals for
139 details of how to set that.
140
141 Recommended answers are given in brackets after each question.  To accept
142 the default value for any question (indicated by []), simply hit Enter
143 at the prompt.
144
145 Note that you also can define an auto_install_file, that will answer every question automatically.
146 To use this feature, run ./installer.pl -i /path/to/auto_install_file 
147
148 Are you ready to begin the installation? ([Y]/N): |;
149
150 $messages->{'WelcomeToUpgrader'}->{en} =
151    heading('Welcome to the Koha Upgrader') . qq|
152 You are attempting to upgrade from Koha %s to Koha %s.
153
154 We recommend that you do a complete backup of all your files before upgrading.
155 This upgrade script will make a backup copy of your files for you.
156
157 Would you like to proceed?  (Y/[N]):|;
158
159 $messages->{'AbortingInstall'}->{en} =
160    heading('ABORTING') . qq|
161 Aborting as requested.  Please rerun when you are ready.
162 |;
163
164 $messages->{'ReleaseCandidateWarning'}->{en} =
165    heading('RELEASE CANDIDATE') . qq|
166 WARNING: You are about to install Koha version %s.  This is a
167 release candidate, It is NOT bugfree.
168 However, it works, and has been declared stable enough to
169 be released.
170
171 Most people should answer Yes here.
172
173 Are you sure you want to install Koha %s? (Y/[N]): |;
174 $messages->{'WatchForReleaseAnnouncements'}->{en}=qq|
175
176 Watch for announcements of Koha releases on the Koha mailing list or the Koha
177 web site (http://www.koha.org/).
178
179 |;
180
181 $messages->{'NETZ3950Missing'}->{en}=qq|
182
183 The Net::Z3950 module is missing.  This module is necessary if you want to use
184 Koha's Z39.50 client to download bibliographic records from other libraries.
185
186 To install this module, you will need the yaz client installed from
187 http://www.indexdata.dk/yaz/ and then you can install the perl module with the
188 command:
189
190 perl -MCPAN -e 'install Net::Z3950'
191
192 ...or by installing packages for your distribution, if available.
193
194 IMPORTANT NOTE : If you use Perl 5.8.0, you might need to 
195 edit NET::Z3950's Makefile.PL and yazwrap/Makefile.PL to include:
196
197     'DEFINE' => '-D_GNU_SOURCE',
198
199 Also note that some installations of Perl on Red Hat will generate a lot of
200 "'my_perl' undeclared" errors when running make in Net-Z3950.  This is fixed by
201 inserting in yazwrap/ywpriv.h a line saying #include "XSUB.h"
202
203 Press the <ENTER> key to continue: |;   #'
204
205 $messages->{'CheckingPerlModules'}->{en} = heading('PERL MODULES') . qq|
206 Checking perl modules ...
207 |;
208
209 $messages->{'PerlVersionFailure'}->{en}="Sorry, you need at least Perl %s\n";
210
211 $messages->{'MissingPerlModules'}->{en} = heading('MISSING PERL MODULES') . qq|
212 You are missing some Perl modules required by Koha.
213 Please run this again after installing them.
214 They may be installed by finding packages from your operating system supplier, or running (as root) the following commands:
215
216 %s
217 |;
218
219 $messages->{'AllPerlModulesInstalled'}->{en} =
220    heading('PERL MODULES AVAILABLE') . qq|
221 All required perl modules are installed.
222
223 Press <ENTER> to continue: |;
224 $messages->{'KohaVersionInstalled'}->{en}="You currently have Koha %s on your system.";
225 $messages->{'KohaUnknownVersionInstalled'}->{en}="I am not able to determine what version of Koha is installed now.";
226 $messages->{'KohaAlreadyInstalled'}->{en} =
227    heading('Koha already installed') . qq|
228 It looks like Koha is already installed on your system (%s/koha.conf exists).
229 If you would like to upgrade your system to %s, please use
230 the koha.upgrade script in this directory.
231
232 %s
233
234 |;
235 $messages->{'GetOpacDir'}->{en} = heading('OPAC DIRECTORY') . qq|
236 Please supply the directory you want Koha to store its OPAC files in.  This
237 directory will be auto-created for you if it doesn't exist.
238
239 OPAC Directory [%s]: |; #'
240
241 $messages->{'GetIntranetDir'}->{en} =
242    heading('LIBRARIAN DIRECTORY') . qq|
243 Please supply the directory you want Koha to store its Librarian interface
244 files in.  This directory will be auto-created for you if it doesn't exist.
245
246 Intranet Directory [%s]: |;     #'
247
248 $messages->{'GetKohaLogDir'}->{en} = heading('LOG DIRECTORY') . qq|
249 Specify a directory where log files will be written.
250
251 Koha Log Directory [%s]: |;
252
253 $messages->{'AuthenticationWarning'}->{en} = heading('Authentication') . qq|
254 This release of Koha has a new authentication module.
255 You will be required to log in to
256 access some features.
257
258 IMPORTANT: You can log in using the userid and password from the %s/koha.conf configuration file at any time.
259 Use the "Members" screen to add passwords for other accounts and set their flags.
260
261 Press the <ENTER> key to continue: |;
262
263 $messages->{'Completed'}->{en} = heading('INSTALLATION COMPLETE') . qq|
264 Congratulations ... your Koha installation is complete!
265
266 You will be able to connect to your Librarian interface at:
267
268    http://%s\:%s/
269
270    use the koha admin mysql login and password to connect to this interface.
271 and the OPAC interface at:
272
273    http://%s\:%s/
274    
275 NOTE: You need to add lines to your main httpd.conf to include
276 /etc/koha-httpd.conf and to make sure it is listening on the right ports
277 (using the Listen directive). Then, restart Apache.
278
279 Please read the Hints file and visit http://www.koha.org (in english) or www.koha-fr.org (in french)
280 Press <ENTER> to exit the installer: |;
281
282 $messages->{'UpgradeCompleted'}->{en} = heading('UPGRADE COMPLETE') . qq|
283 Congratulations ... your Koha upgrade is finished!
284
285 Please report any problems you encounter through http://bugs.koha.org/
286
287 Press <ENTER> to exit the installer: |;
288
289 #'
290
291 =item completeupgrade
292
293    completeupgrade
294
295 Display a message describing what may need changing in httpd.conf
296 and any other instructions
297
298 =cut
299
300 sub completeupgrade {
301         showmessage(getmessage('UpgradeCompleted',[$intranetdir,$intranetdir,$intranetdir,$opacdir,$opacdir,$intranetdir]),'PressEnter');
302 }
303
304 sub releasecandidatewarning {
305     my $message=getmessage('ReleaseCandidateWarning', [$newversion, $newversion]);
306     my $answer=showmessage($message, 'yn', 'n');
307
308     if ($answer =~ /y/i) {
309         print getmessage('continuing');
310     } else {
311         my $message=getmessage('WatchForReleaseAnnouncements');
312         print $message."\n";
313         exit;
314     };
315 }
316
317 sub read_autoinstall_file
318 {
319         my $fname = shift;      # Config file to read
320         my $retval = {};        # Return value: ref-to-hash holding the
321                                 # configuration
322
323         open (CONF, $fname) or return undef;
324
325         while (<CONF>)
326         {
327                 my $var;                # Variable name
328                 my $value;              # Variable value
329
330                 chomp;
331                 s/#.*//;                # Strip comments
332                 next if /^\s*$/;        # Ignore blank lines
333
334                 # Look for a line of the form
335                 #       var = value
336                 if (!/^\s*(\w+)\s*=\s*(.*?)\s*$/)
337                 {
338                         next;
339                 }
340
341                 # Found a variable assignment
342                 # variable that was already set.
343                 $var = $1;
344                 $value = $2;
345                 $retval->{$var} = $value;
346         }
347         close CONF;
348         if ($retval->{MysqlRootPassword} eq "XXX") {
349                 print "ERROR : the root password is XXX. It is NOT valid. Edit your auto_install_file\n";
350         }
351         return $retval;
352 }
353
354 =back
355
356 =head2 Accessor functions (for installer.pl)
357
358 =over 4
359
360 =cut
361
362 =item setlanguage
363
364     setlanguage('en');
365
366 Sets the installation language, normally "en" (English).
367 In fact, only "en" is supported.
368
369 =cut
370
371 sub setlanguage ($) {
372     ($language) = @_;
373 }
374
375 =item setdomainname
376
377     setdomainname('example.org');
378
379 Sets the domain name of the host.
380
381 The domain name should not contain a leading dot;
382 otherwise, the results are undefined.
383
384 =cut
385
386 sub setdomainname ($) {
387     ($domainname) = @_;
388 }
389
390 =item setetcdir
391
392     setetcdir('/etc');
393
394 Sets the sysconfdir, normally /etc.
395 This should be an absolute path; a trailing / is not required.
396 Must be writeable, else we die.
397
398 =cut
399
400 sub setetcdir ($) {
401     ($etcdir) = @_;
402     if (! ((-d $etcdir) && (-w $etcdir))) { die("Cannot write to $etcdir! Please set the etcdir environment variable to a writeable directory.\nFailed"); }
403 }
404
405 =item getkohaversion
406
407     getkohaversion();
408
409 Gets the Koha version as known by the previous config file.
410
411 =cut
412
413 sub getkohaversion () {
414     return($kohaversion);
415 }
416
417 =item setkohaversion
418
419     setkohaversion('1.3.3RC26');
420
421 Sets the Koha version as known by the installer.
422
423 =cut
424
425 sub setkohaversion ($) {
426     ($newversion) = @_;
427 }
428
429 =item getservername
430
431     my $servername = getservername;
432
433 Gets the name of the Koha virtual server as specified by the user.
434
435 =cut
436
437 sub getservername () {
438     $servername;
439 }
440
441 =item getopacport
442
443     $port = getopacport;
444
445 Gets the port that will run the Koha OPAC virtual server,
446 as specified by the user.
447
448 =cut
449
450 sub getopacport () {
451     $opacport;
452 }
453
454 =item getintranetport
455
456     $port = getintranetport;
457
458 Gets the port that will run the Koha INTRANET virtual server,
459 as specified by the user.
460
461 =cut
462
463 sub getintranetport () {
464     $intranetport;
465 }
466
467 =back
468
469 =head2 Miscellaneous utility functions
470
471 =over 4
472
473 =cut
474
475 =item dirname
476
477     dirname $path;
478
479 Does the equivalent of dirname(1). Given a path $path, return the
480 parent directory of $path (best guess), except when $path seems to
481 be the same as /, in which case $path itself is returned unchanged.
482
483 =cut
484
485 sub dirname ($;$) {
486     my($path) = @_;
487     if ($path =~ /[^\/]/s) {
488         if ($path =~ /\//) {
489             $path =~ s/\/+[^\/]+\/*$//s;
490         } else {
491             $path = '.';
492         }
493     }
494     return $path;
495 }
496
497 =item mkdir_parents
498
499     mkdir_parents $path;
500     mkdir_parents $path, $mode;
501
502 Does the equivalent of mkdir -p, or mkdir --parents. Given a path $path,
503 create the directory $path, recursively creating any intermediate
504 directories. If $mode is given, the directory will be created with
505 mode $mode.
506
507 WARNING: If $path already exists, mkdir_parents will just return
508 successfully (just like mkdir -p), whether the mode of $path conforms
509 to $mode or not. (This is the behaviour of the mkdir -p command.)
510
511 =cut
512
513 sub mkdir_parents {
514     my($path, $mode) = @_;
515     my $ok = -d($path)? 1: defined $mode? mkdir($path, $mode): mkdir($path);
516
517     if (!$ok && $! == ENOENT) {
518         my $parent = dirname($path);
519         $ok = mkdir_parents($parent, $mode);
520
521         # retry and at the same time make sure that $! is set correctly
522         $ok = defined $mode? mkdir($path, $mode): mkdir($path);
523     }
524     return $ok;
525 }
526
527
528 =item getmessage
529
530     getmessage($msgid);
531     getmessage($msgid, $variables);
532
533 Gets a localized message (format string) with message id $msgid,
534 and, if an array reference of variables $variables is given,
535 substitutes variables in the format string with @$variables.
536 Returns the found message string, with variable substitutions
537 if specified.
538
539 $msgid must be the message identifier corresponding to a defined
540 message string (a valid key to the $messages hash in the Installer
541 package). getmessage throws an exception if the message cannot be
542 found.
543
544 =cut
545
546 sub getmessage {
547     my $messagename=shift;
548     my $variables=shift;
549     my $message=$messages->{$messagename}->{$language} || $messages->{$messagename}->{en} || RED.BOLD."Error: No message named $messagename in Install.pm\n";
550     if (defined($variables)) {
551         $message=sprintf $message, @$variables;
552     }
553     return $message;
554 }
555
556
557 =item showmessage
558
559     showmessage($message, 'none');
560     showmessage($message, 'none', undef, $noclear);
561
562     $result = showmessage($message, 'yn');
563     $result = showmessage($message, 'yn', $defaultresponse);
564     $result = showmessage($message, 'yn', $defaultresponse, $noclear);
565
566     $result = showmessage($message, 'restrictchar CHARS');
567     $result = showmessage($message, 'free');
568     $result = showmessage($message, 'silentfree');
569     $result = showmessage($message, 'numerical');
570     $result = showmessage($message, 'email');
571     $result = showmessage($message, 'PressEnter');
572
573 Shows a message and optionally gets a response from the user.
574
575 The first two arguments, the message and the response type,
576 are mandatory.  The message must be the actual string to
577 display; the caller is responsible for calling getmessage if
578 required.
579
580 The response type must be one of "none", "yn", "free", "silentfree"
581 "numerical", "email", "PressEnter", or a string consisting
582 of "restrictchar " followed by a list of allowed characters
583 (space can be specified). (Case is not significant, but case is
584 significant in the list of allowed characters.) If a response
585 type other than the above-listed is specified, the result is
586 undefined.
587
588 Note that the response type "yn" is equivalent to "restrictchar yn".
589 Because "restrictchar" is case-sensitive, the user is expected
590 to enter "y" or "n" in lowercase only.
591
592 Note that the response type of "email" does not actually
593 guarantee that the returned value is a well-formed RFC-822
594 email address, nor does it accept all well-formed RFC-822 email
595 addresses. What it does is to restrict the returned value to a
596 string that is looks reasonably likely to be an email address
597 in the "real world", given the premise that the user is trying
598 to enter a real email address.
599
600 If a response type other than "none" or "PressEnter" is
601 specified, a third argument, specifying the default value, can
602 be specified:  If this default response is not specified, the
603 default response is the first allowed character if the response
604 type is "restrictchar", otherwise the default response is the
605 empty string. This default response is used when the user does
606 not specify a value (i.e., presses Enter without typing in
607 anything), showmessage will assume that the default response is
608 the user's response.
609
610 Note that because the response type "yn" is equivalent to
611 "restrictchar yn", the default value for response type "yn",
612 if unspecified, is "y".
613
614 The screen is normally cleared before the message is displayed;
615 if a fourth argument is specified and is nonzero, this
616 screen-clearing is not done.
617
618 =cut
619 #'
620
621 sub showmessage {
622     #MJR: Maybe refactor to use anonymous functions that
623     # check the responses instead of RnP branching.
624     my $message=join('',fill('','',(shift)));
625     my $responsetype=shift;
626     my $defaultresponse=shift;
627     my $noclear=shift;
628     $noclear = 0 unless defined $noclear; # defaults to "clear"
629     ($noclear) || (print $clear_string);
630     if ($responsetype =~ /^yn$/) {
631         $responsetype='restrictchar ynYN';
632     }
633     print RESET.$message;
634     if ($responsetype =~/^restrictchar (.*)/i) {
635         my $response='\0';
636         my $options=$1;
637         until ($options=~/$response/) {
638             (defined($defaultresponse)) || ($defaultresponse=substr($options,0,1));
639             $response=<STDIN>;
640             chomp $response;
641             (length($response)) || ($response=$defaultresponse);
642             if ( $response=~/.*[\:\(\)\^\$\*\!\\].*/ ) {
643                 ($noclear) || (print $clear_string);
644                 print RED."Response contains invalid characters.  Choose from [$options].\n\n";
645                 print RESET.$message;
646                 $response='\0';
647             } else {
648                 unless ($options=~/$response/) {
649                     ($noclear) || (print $clear_string);
650                     print RED."Invalid Response.  Choose from [$options].\n\n";
651                     print RESET.$message;
652                 }
653             }
654         }
655         return $response;
656     } elsif ($responsetype =~/^(silent)?free$/i) {
657         (defined($defaultresponse)) || ($defaultresponse='');
658         if ($responsetype =~/^(silent)/i) { setecho(0) }; 
659         my $response=<STDIN>;
660         if ($responsetype =~/^(silent)/i) { setecho(1) }; 
661         chomp $response;
662         ($response) || ($response=$defaultresponse);
663         return $response;
664     } elsif ($responsetype =~/^numerical$/i) {
665         (defined($defaultresponse)) || ($defaultresponse='');
666         my $response='';
667         until ($response=~/^\d+$/) {
668             $response=<STDIN>;
669             chomp $response;
670             ($response) || ($response=$defaultresponse);
671             unless ($response=~/^\d+$/) {
672                 ($noclear) || (print $clear_string);
673                 print RED."Invalid Response ($response).  Response must be a number.\n\n";
674                 print RESET.$message;
675             }
676         }
677         return $response;
678     } elsif ($responsetype =~/^email$/i) {
679         (defined($defaultresponse)) || ($defaultresponse='');
680         my $response='';
681         until ($response=~/.*\@.*\..*/) {
682             $response=<STDIN>;
683             chomp $response;
684             ($response) || ($response=$defaultresponse);
685             if ($response!~/.*\@.*\..*/) {
686                         ($noclear) || (print $clear_string);
687                         print RED."Invalid Response ($response).  Response must be a valid email address.\n\n";
688                         print RESET.$message;
689             }
690         }
691         return $response;
692     } elsif ($responsetype =~/^PressEnter$/i) {
693         <STDIN>;
694         return;
695     } elsif ($responsetype =~/^none$/i) {
696         return;
697     } else {
698         # FIXME: There are a few places where we will get an undef as the
699         # response type. Should we thrown an exception here, or should we
700         # legitimize this usage and say "none" is the default if not specified?
701         #die "Illegal response type \"$responsetype\"";
702     }
703 }
704
705
706 =back
707
708 =item startsysout
709
710         startsysout;
711
712 Changes the display to show system output until the next showmessage call.
713 At the time of writing, this means using red text.
714
715 =cut
716
717 sub startsysout {
718         print RED."\n";
719 }
720
721
722 =back
723
724 =head2 Subtasks of doing an installation
725
726 =over 4
727
728 =cut
729
730 =item checkabortedinstall
731
732     checkabortedinstall;
733
734 Checks whether a previous installation process has been abnormally
735 aborted, by checking whether $etcidr/koha.conf is a symlink matching
736 a particular pattern.  If an aborted installation is detected, give
737 the user a chance to abort, before trying to recover the aborted
738 installation.
739
740 FIXME: The recovery is not complete; it only partially rolls back
741 some changes.
742
743 =cut
744
745 sub checkabortedinstall () {
746     if (-l("$etcdir/koha.conf")
747         && readlink("$etcdir/koha.conf") =~ /\.tmp$/
748     ) {
749         print qq|
750 I have detected that you tried to install Koha before, but the installation
751 was aborted.  I will try to continue, but there might be problems if the
752 database is already created.
753
754 |;
755         print "Please press <ENTER> to continue: ";
756         <STDIN>;
757
758         # Remove the symlink after the <STDIN>, so the user can back out
759         unlink "$etcdir/koha.conf"
760             || die "Failed to remove incomplete $etcdir/koha.conf: $!\n";
761     }
762 }
763
764 =item checkpaths
765
766         checkpaths;
767
768 Make sure that we loaded the right dirs from an old koha.conf
769
770 =cut
771
772 #FIXME: update to use Install.pm
773 sub checkpaths {
774 if ($opacdir && $intranetdir) {
775     print qq|
776
777 I believe that your old files are located in:
778
779   OPAC:      $opacdir
780   LIBRARIAN: $intranetdir
781
782
783 Does this look right?  ([Y]/N):
784 |;
785     my $answer = <STDIN>;
786     chomp $answer;
787
788     if ($answer =~/n/i) {
789         $intranetdir='';
790         $opacdir='';
791     } else {
792         print "Great! continuing upgrade... \n";
793     }
794 }
795
796 if (!$opacdir || !$intranetdir) {
797     $intranetdir='';
798     $opacdir='';
799     while (!$intranetdir) {
800         print "Please specify the location of your LIBRARIAN files: ";
801
802         my $answer = <STDIN>;
803         chomp $answer;
804
805         if ($answer) {
806             $intranetdir=$answer;
807         }
808         if (! -e "$intranetdir/htdocs") {
809             print "\nCouldn't find the htdocs directory here.  That doesn't look right.\nPlease enter another location.\n\n";
810             $intranetdir='';
811         }
812     }
813     while (!$opacdir) {
814         print "Please specify the location of your OPAC files: ";  
815
816         my $answer = <STDIN>;
817         chomp $answer;
818
819         if ($answer) {
820             $opacdir=$answer;
821         }
822         if (! -e "$opacdir/htdocs") {
823             print "\nCouldn't find the htdocs directory here.  That doesn't look right.\nPlease enter another location.\n\n";
824             $opacdir='';
825         }
826     }
827 }
828
829 }
830
831 =item checkperlmodules
832
833     checkperlmodules;
834
835 Test whether the version of Perl is new enough, whether Perl is
836 found at the expected location, and whether all required modules
837 have been installed.
838
839 =cut
840
841 sub checkperlmodules {
842 #
843 # Test for Perl and Modules
844 #
845         my ($auto_install) = @_;
846         my $message = getmessage('CheckingPerlModules');
847         showmessage($message, 'none');
848
849         unless ($] >= 5.006001) {                       # Bug 179
850                 die getmessage('PerlVersionFailure', ['5.6.1']);
851         }
852         startsysout();
853
854         my @missing = ();
855         unless (eval {require DBI})              { push @missing,"DBI" };
856         unless (eval {require Date::Manip})      { push @missing,"Date::Manip" };
857         unless (eval {require DBD::mysql})       { push @missing,"DBD::mysql" };
858         unless (eval {require HTML::Template})   { push @missing,"HTML::Template" };
859         unless (eval {require Digest::MD5})      { push @missing,"Digest::MD5" };
860         unless (eval {require MARC::Record})     { push @missing,"MARC::Record" };
861         unless (eval {require Mail::Sendmail})   { push @missing,"Mail::Sendmail" };
862         unless (eval {require PDF::API2})   { push @missing,"PDF::API2" };
863 # The following modules are not mandatory, depends on how the library want to use Koha
864         unless (eval {require Net::LDAP})       {
865                 if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
866                                 push @missing, "Net::LDAP";
867                         }
868     }
869         unless (eval {require Event})       {
870                 if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
871                                 push @missing, "Event";
872                         }
873     }
874     unless (eval {require Net::Z3950})       {
875                 showmessage(getmessage('NETZ3950Missing'), 'PressEnter', '', 1);
876                 if ($#missing>=0) { # see above note
877                         push @missing, "Net::Z3950";
878                 }
879     }
880
881 #
882 # Print out a list of any missing modules
883 #
884
885     if (@missing > 0) {
886         my $missing='';
887         if (POSIX::setlocale(LC_ALL) ne "C") {
888                 $missing.="   export LC_ALL=C\n";  
889         }
890         foreach my $module (@missing) {
891             $missing.="   perl -MCPAN -e 'install \"$module\"'\n";
892         }
893         my $message=getmessage('MissingPerlModules', [$missing]);
894         showmessage($message, 'none');
895         print "\n";
896         exit;
897     } else {
898         showmessage(getmessage('AllPerlModulesInstalled'), 'PressEnter', '', 1) unless $auto_install->{NoPressEnter};
899     }
900
901
902         startsysout();
903     unless (-x "/usr/bin/perl") {
904         my $realperl=`which perl`;
905         chomp $realperl;
906         $realperl = showmessage(getmessage('NoUsrBinPerl'), 'none');
907         until (-x $realperl) {
908             $realperl=showmessage(getmessage('AskLocationOfPerlExecutable', $realperl), 'free', $realperl, 1);
909         }
910         my $response=showmessage(getmessage('ConfirmPerlExecutableSymlink', $realperl), 'yn', 'y', 1);
911         unless ($response eq 'n') {
912                 startsysout();
913             system("ln -s $realperl /usr/bin/perl");
914         }
915     }
916
917
918 }
919
920 $messages->{'NoUsrBinPerl'}->{en} =
921    heading('No /usr/bin/perl') . qq|
922 Koha expects to find the perl executable in the /usr/bin
923 directory.  It is not there on your system.
924
925 |;
926
927 $messages->{'AskLocationOfPerlExecutable'}->{en}=qq|Location of Perl Executable [%s]: |;
928 $messages->{'ConfirmPerlExecutableSymlink'}->{en}=qq|
929 Some Koha scripts will _not_ work without a symlink from %s to /usr/bin/perl
930
931 Most users should answer Y here.
932
933 May I try to create this symlink? ([Y]/N):|;
934
935 $messages->{'DirFailed'}->{en} = RED.qq|
936 We could not create %s, but continuing anyway...
937
938 |;
939
940
941
942 =item getinstallationdirectories
943
944     getinstallationdirectories;
945
946 Get the various installation directories from the user, and then
947 create those directories (if they do not already exist).
948
949 These pieces of information are saved to global variables; the
950 function does not return any values.
951
952 =cut
953
954 sub getinstallationdirectories {
955         my ($auto_install) = @_;
956         if (!$ENV{prefix}) { $ENV{prefix} = "/usr/local"; }
957     $opacdir = $ENV{prefix}.'/koha/opac';
958     $intranetdir = $ENV{prefix}.'/koha/intranet';
959     my $getdirinfo=1;
960     while ($getdirinfo) {
961         # Loop until opac directory and koha directory are different
962         my $message;
963         if ($auto_install->{GetOpacDir}) {
964                 $opacdir=$auto_install->{GetOpacDir};
965                 print ON_YELLOW.BLACK."auto-setting OpacDir to : $opacdir".RESET."\n";
966         } else {
967                 $message=getmessage('GetOpacDir', [$opacdir]);
968                 $opacdir=showmessage($message, 'free', $opacdir);
969         }
970         if ($auto_install->{GetIntranetDir}) {
971                 $intranetdir=$auto_install->{GetIntranetDir};
972                 print ON_YELLOW.BLACK."auto-setting IntranetDir to : $intranetdir".RESET."\n";
973         } else {
974                 $message=getmessage('GetIntranetDir', [$intranetdir]);
975                 $intranetdir=showmessage($message, 'free', $intranetdir);
976         }
977         if ($intranetdir eq $opacdir) {
978             print qq|
979
980 You must specify different directories for the OPAC and INTRANET files!
981  :: $intranetdir :: $opacdir ::
982 |;
983 <STDIN>
984         } else {
985             $getdirinfo=0;
986         }
987     }
988     $kohalogdir=$ENV{prefix}.'/koha/log';
989         if ($auto_install->{GetOpacDir}) {
990                 $kohalogdir=$auto_install->{KohaLogDir};
991                 print ON_YELLOW.BLACK."auto-setting log dir to : $kohalogdir".RESET."\n";
992         } else {
993             my $message=getmessage('GetKohaLogDir', [$kohalogdir]);
994         $kohalogdir=showmessage($message, 'free', $kohalogdir);
995         }
996
997
998     # FIXME: Need better error handling for all mkdir calls here
999     unless ( -d $intranetdir ) {
1000        mkdir_parents (dirname($intranetdir), 0775) || print getmessage('DirFailed',['parents of '.$intranetdir]);
1001        mkdir ($intranetdir,                  0770) || print getmessage('DirFailed',[$intranetdir]);
1002        if ($>==0) { chown (oct(0), (getgrnam($httpduser))[2], "$intranetdir"); }
1003        chmod 0770, "$intranetdir";
1004     }
1005     mkdir_parents ("$intranetdir/htdocs",    0750);
1006     mkdir_parents ("$intranetdir/cgi-bin",   0750);
1007     mkdir_parents ("$intranetdir/modules",   0750);
1008     mkdir_parents ("$intranetdir/scripts",   0750);
1009     unless ( -d $opacdir ) {
1010        mkdir_parents (dirname($opacdir),     0775) || print getmessage('DirFailed',['parents of '.$opacdir]);
1011        mkdir ($opacdir,                      0770) || print getmessage('DirFailed',[$opacdir]);
1012        if ($>==0) { chown (oct(0), (getgrnam($httpduser))[2], "$opacdir"); }
1013        chmod (oct(770), "$opacdir");
1014     }
1015     mkdir_parents ("$opacdir/htdocs",        0750);
1016     mkdir_parents ("$opacdir/cgi-bin",       0750);
1017
1018
1019     unless ( -d $kohalogdir ) {
1020        mkdir_parents (dirname($kohalogdir),  0775) || print getmessage('DirFailed',['parents of '.$kohalogdir]);
1021        mkdir ($kohalogdir,                   0770) || print getmessage('DirFailed',[$kohalogdir]);
1022        if ($>==0) { chown (oct(0), (getgrnam($httpduser))[2,3], "$kohalogdir"); }
1023        chmod (oct(770), "$kohalogdir");
1024     }
1025 }
1026
1027 =item getmysqldir
1028
1029         getmysqldir;
1030
1031 Get the MySQL database server installation directory, automatically if possible.
1032
1033 =cut
1034
1035 $messages->{'WhereIsMySQL'}->{en} = heading('MYSQL LOCATION').qq|
1036 Koha can't find the MySQL command-line tools. If you installed a MySQL package, you may need to install an additional package containing mysqladmin.
1037 If you compiled mysql yourself,
1038 please give the value of --prefix when you ran configure.
1039 The file mysqladmin should be in bin/mysqladmin under the directory that you give here.
1040
1041 MySQL installation directory: |;
1042 #'
1043 sub getmysqldir {
1044     foreach my $mysql (qw(/usr/local/mysql
1045                           /opt/mysql
1046                           /usr/local
1047                           /usr
1048                           )) {
1049        if ( -d $mysql  && -f "$mysql/bin/mysqladmin") {
1050             $mysqldir=$mysql;
1051        }
1052     }
1053     if (!$mysqldir){
1054         for (;;) {
1055             $mysqldir = showmessage(getmessage('WhereIsMySQL'),'free');
1056             last if -f "$mysqldir/bin/mysqladmin";
1057         }
1058     }
1059     return($mysqldir);
1060 }
1061
1062 =item getdatabaseinfo
1063
1064     getdatabaseinfo;
1065
1066 Get various pieces of information related to the Koha database:
1067 the name of the database, the host on which the SQL server is
1068 running, and the database user name.
1069
1070 These pieces of information are saved to global variables; the
1071 function does not return any values.
1072
1073 =cut
1074
1075 $messages->{'DatabaseName'}->{en} = heading('Database Name') . qq|
1076 Please provide the name that you wish to give your koha database.
1077 It must not exist already on the database server.
1078
1079 Most users give a short single-word name for their library here.
1080
1081 Database name [%s]: |;
1082
1083 $messages->{'DatabaseHost'}->{en} = heading('Database Host') . qq|
1084 Please provide the mysql server name.  Unless the database is stored on
1085 another machine, this should be "localhost".
1086
1087 Database host [%s]: |;
1088
1089 $messages->{'DatabaseUser'}->{en} = heading('Database User') . qq|
1090 We are going to create a new mysql user for Koha. This user will have full administrative rights
1091 to the database called %s when they connect from %s.
1092 This is also the name of the Koha librarian superuser.
1093
1094 Most users give a single-word name here.
1095
1096 Database user [%s]: |;
1097
1098 $messages->{'DatabasePassword'}->{en} = heading('Database Password') . qq|
1099 Please provide a good password for the user %s.
1100
1101 IMPORTANT: You can log in using this user and password at any time.
1102
1103 Password for database user %s: |;
1104
1105 $messages->{'BlankPassword'}->{en} = heading('BLANK PASSWORD') . qq|
1106 You must not use a blank password for your MySQL user.
1107
1108 Press <ENTER> to try again: 
1109 |;
1110
1111 sub getdatabaseinfo {
1112         my ($auto_install) = @_;
1113     $database = 'Koha';
1114     $hostname = 'localhost';
1115     $user = 'kohaadmin';
1116     $pass = '';
1117
1118 #Get the database name
1119         my $message;
1120         
1121         if ($auto_install->{database}) {
1122                 $database=$auto_install->{database};
1123                 print ON_YELLOW.BLACK."auto-setting database to : $database".RESET."\n";
1124         } else {
1125                 $message=getmessage('DatabaseName', [$database]);
1126                 $database=showmessage($message, 'free', $database);
1127         }
1128 #Get the hostname for the database
1129     
1130         if ($auto_install->{DatabaseHost}) {
1131                 $hostname=$auto_install->{DatabaseHost};
1132                 print ON_YELLOW.BLACK."auto-setting database host to : $hostname".RESET."\n";
1133         } else {
1134                 $message=getmessage('DatabaseHost', [$hostname]);
1135                 $hostname=showmessage($message, 'free', $hostname);
1136         }
1137 #Get the username for the database
1138
1139         if ($auto_install->{DatabaseUser}) {
1140                 $user=$auto_install->{DatabaseUser};
1141                 print ON_YELLOW.BLACK."auto-setting DB user to : $user".RESET."\n";
1142         } else {
1143                 $message=getmessage('DatabaseUser', [$database, $hostname, $user]);
1144                 $user=showmessage($message, 'free', $user);
1145         }
1146 #Get the password for the database user
1147
1148     while ($pass eq '') {
1149                 my $message=getmessage('DatabasePassword', [$user, $user]);
1150                 if ($auto_install->{DatabasePassword}) {
1151                         $pass=$auto_install->{DatabasePassword};
1152                         print ON_YELLOW.BLACK."auto-setting database password to : $pass".RESET."\n";
1153                 } else {
1154                                 $pass=showmessage($message, 'free', $pass);
1155                 }
1156                 if ($pass eq '') {
1157                         my $message=getmessage('BlankPassword');
1158                         showmessage($message,'PressEnter');
1159                 }
1160     }
1161 }
1162
1163
1164
1165 =item getapacheinfo
1166
1167     getapacheinfo;
1168
1169 Get various pieces of information related to the Apache server:
1170 the location of the configuration file and, if needed, the Unix
1171 user that the Koha CGI will be run under.
1172
1173 These pieces of information are saved to global variables; the
1174 function does not return any values.
1175
1176 =cut
1177
1178 $messages->{'FoundMultipleApacheConfFiles'}->{en} = 
1179    heading('MULTIPLE APACHE CONFIG FILES FOUND') . qq|
1180 I found more than one possible Apache configuration file:
1181
1182 %s
1183
1184 Enter number of the file to read [1]: |;
1185
1186 $messages->{'NoApacheConfFiles'}->{en} =
1187    heading('NO APACHE CONFIG FILE FOUND') . qq|
1188 I was not able to find your Apache configuration file.
1189
1190 The file is usually called httpd.conf, apache.conf or similar.
1191
1192 Please enter the full name, starting with /: |;
1193
1194 $messages->{'NotAFile'}->{en} = heading('FILE DOES NOT EXIST') . qq|
1195 The file %s does not exist.
1196
1197 Please press <ENTER> to continue: |;
1198
1199 $messages->{'EnterApacheUser'}->{en} = heading('NEED APACHE USER') . qq\
1200 The installer could not find the User setting in the Apache configuration file.
1201 This is used to set up access permissions for
1202 %s/koha.conf.  This user should be set in one of the Apache configuration.
1203 Please try to find it and enter the user name below.  You might find
1204 that "ps u|grep apache" will tell you.  It probably is NOT "root".
1205
1206 Enter the Apache userid: \;
1207
1208 $messages->{'InvalidUserid'}->{en} = heading('INVALID USER') . qq|
1209 The userid %s is not a valid userid on this system.
1210
1211 Press <ENTER> to continue: |;
1212
1213 sub getapacheinfo {
1214         my ($auto_install) = @_;
1215     my @confpossibilities;
1216
1217     foreach my $httpdconf (qw(/usr/local/apache/conf/httpd.conf
1218                           /usr/local/etc/apache/httpd.conf
1219                           /usr/local/etc/apache/apache.conf
1220                           /var/www/conf/httpd.conf
1221                           /etc/apache2/httpd.conf
1222                           /etc/apache2/apache2.conf
1223                           /etc/apache/conf/httpd.conf
1224                           /etc/apache/conf/apache.conf
1225                           /etc/apache/httpd.conf
1226                           /etc/apache-ssl/conf/apache.conf
1227                           /etc/apache-ssl/httpd.conf
1228                           /etc/httpd/conf/httpd.conf
1229                           /etc/httpd/httpd.conf
1230                           /etc/httpd/2.0/conf/httpd2.conf
1231                           )) {
1232                 if ( -f $httpdconf ) {
1233                         push @confpossibilities, $httpdconf;
1234                 }
1235     }
1236
1237     if ($#confpossibilities==-1) {
1238                 my $message=getmessage('NoApacheConfFiles');
1239                 my $choice='';
1240                 $realhttpdconf='';
1241                 until (-f $realhttpdconf) {
1242                         $choice=showmessage($message, "free", 1);
1243                         if (-f $choice) {
1244                         $realhttpdconf=$choice;
1245                         } else {
1246                         showmessage(getmessage('NotAFile', [$choice]),'PressEnter', '', 1);
1247                         }
1248                 }
1249     } elsif ($#confpossibilities>0) {
1250                 my $conffiles='';
1251                 my $counter=1;
1252                 my $options='';
1253                 foreach (@confpossibilities) {
1254                         $conffiles.="   $counter: $_\n";
1255                         $options.="$counter";
1256                         $counter++;
1257                 }
1258                 my $message=getmessage('FoundMultipleApacheConfFiles', [$conffiles]);
1259                 my $choice=showmessage($message, "restrictchar $options", 1);
1260                 $realhttpdconf=$confpossibilities[$choice-1];
1261     } else {
1262                 $realhttpdconf=$confpossibilities[0];
1263     }
1264     unless (open (HTTPDCONF, "<$realhttpdconf")) {
1265         warn RED."Insufficient privileges to open $realhttpdconf for reading.\n";
1266         sleep 4;
1267     }
1268
1269     while (<HTTPDCONF>) {
1270                 if (/^\s*User\s+"?([-\w]+)"?\s*$/) {
1271                         $httpduser = $1;
1272                 }
1273     }
1274     close(HTTPDCONF);
1275
1276     unless (defined($httpduser)) {
1277                 my $message;
1278                 if ($auto_install->{EnterApacheUser}) {
1279                         $message = $auto_install->{EnterApacheUser};
1280                         print ON_YELLOW.BLACK."auto-setting Apache User to : $message".RESET."\n";
1281                 } else {
1282                         $message=getmessage('EnterApacheUser', [$etcdir]);
1283                 }
1284                 until (defined($httpduser) && length($httpduser) && getpwnam($httpduser)) {
1285                         if ($auto_install->{EnterApacheUser}) {
1286                                 $httpduser = $auto_install->{EnterApacheUser};
1287                         } else {
1288                                 $httpduser=showmessage($message, "free", '');
1289                         }
1290                         if (length($httpduser)>0) {
1291                                 unless (getpwnam($httpduser)) {
1292                                         my $message=getmessage('InvalidUserid', [$httpduser]);
1293                                         showmessage($message,'PressEnter');
1294                                 }
1295                         } else {
1296                         }
1297                 }
1298         }
1299 }
1300
1301
1302 =item getapachevhostinfo
1303
1304     getapachevhostinfo;
1305
1306 Gets various pieces of information related to virtual hosting:
1307 the webmaster email address, virtual hostname, and the ports
1308 that the OPAC and INTRANET modules run on.
1309
1310 These pieces of information are saved to global variables; the
1311 function does not return any values.
1312
1313 =cut
1314
1315 $messages->{'ApacheConfigIntroduction'}->{en} =
1316    heading('APACHE CONFIGURATION') . qq|
1317 Koha needs to write an Apache configuration file for the
1318 OPAC and Librarian sites.  By default this installer
1319 will do this by using one name and two different ports
1320 for the virtual hosts.  There are other ways to set this up,
1321 and the installer will leave comments in
1322 %s/koha-httpd.conf about them.
1323
1324 NOTE: You will need to add lines to your main httpd.conf to
1325 include %s/koha-httpd.conf
1326 (using the Include directive)
1327 and to make sure it is listening on the right ports
1328 and host names
1329 (using the Listen directive).
1330
1331 Press <ENTER> to continue: |;
1332
1333 $messages->{'GetVirtualHostEmail'}->{en} =
1334    heading('WEB E-MAIL CONTACT') . qq|
1335 Enter the e-mail address to be used as a contact for Koha.  This
1336 address is displayed if fatal errors are encountered.
1337
1338 E-mail contact [%s]: |;
1339
1340 $messages->{'GetServerName'}->{en} =
1341    heading('WEB HOST NAME OR IP ADDRESS') . qq|
1342 Please enter the host name or IP address that you wish to use for koha.
1343 Normally, this should be a name or IP that belongs to this machine.
1344
1345 Host name or IP Address [%s]: |;
1346
1347 $messages->{'GetOpacPort'}->{en} = heading('OPAC PORT') . qq|
1348 Please enter the port for your OPAC interface.  This defaults to port 80, but
1349 if you are already serving web content with this hostname, you should change it
1350 to a different port (8000 might be a good choice, but check any firewalls).
1351
1352 Enter the OPAC Port [%s]: |;
1353
1354 $messages->{'GetIntranetPort'}->{en} =
1355    heading('LIBRARIAN PORT') . qq|
1356 Please enter the port for your Librarian interface.  This must be different from
1357 the OPAC port (%s).
1358
1359 Enter the Intranet Port [%s]: |;
1360
1361
1362 sub getapachevhostinfo {
1363         my ($auto_install) = @_;
1364     $svr_admin = "webmaster\@$domainname";
1365     $servername=`hostname`;
1366     chomp $servername;
1367     $opacport=80;
1368     $intranetport=8080;
1369
1370         if ($auto_install->{GetVirtualHostEmail}) {
1371                 $svr_admin=$auto_install->{GetVirtualHostEmail};
1372                 print ON_YELLOW.BLACK."auto-setting VirtualHostEmail to : $svr_admin".RESET."\n";
1373         } else {
1374                 showmessage(getmessage('ApacheConfigIntroduction',[$etcdir,$etcdir]), 'PressEnter');
1375                 $svr_admin=showmessage(getmessage('GetVirtualHostEmail', [$svr_admin]), 'email', $svr_admin);
1376         }
1377         if ($auto_install->{servername}) {
1378                 $servername=$auto_install->{servername};
1379                 print ON_YELLOW.BLACK."auto-setting server name to : $servername".RESET."\n";
1380         } else {
1381         $servername=showmessage(getmessage('GetServerName', [$servername]), 'free', $servername);
1382         }
1383         if ($auto_install->{opacport}) {
1384                 $opacport=$auto_install->{opacport};
1385                 print ON_YELLOW.BLACK."auto-setting opac port to : $opacport".RESET."\n";
1386         } else {
1387             $opacport=showmessage(getmessage('GetOpacPort', [$opacport]), 'numerical', $opacport);
1388         }
1389         if ($auto_install->{intranetport}) {
1390                 $intranetport=$auto_install->{intranetport};
1391                 print ON_YELLOW.BLACK."auto-setting intranet port to : $intranetport".RESET."\n";
1392         } else {
1393             $intranetport=showmessage(getmessage('GetIntranetPort', [$opacport, $intranetport]), 'numerical', $intranetport);
1394         }
1395
1396 }
1397
1398
1399 =item updateapacheconf
1400
1401     updateapacheconf;
1402
1403 Updates the Apache config file according to parameters previously
1404 specified by the user.
1405
1406 It will append fully-commented directives at the end of the original
1407 Apache config file.  The old config file is renamed with an extension
1408 of .prekoha.
1409
1410 If you need to uninstall Koha for any reason, the lines between
1411
1412     # Ports to listen to for Koha
1413
1414 and the block of comments beginning with
1415
1416     # If you want to use name based Virtual Hosting:
1417
1418 must be removed.
1419
1420 =cut
1421
1422 $messages->{'StartUpdateApache'}->{en} =
1423    heading('UPDATING APACHE CONFIGURATION') . qq|
1424 Checking for modules that need to be loaded...
1425 |;
1426
1427 $messages->{'ApacheConfigMissingModules'}->{en} =
1428    heading('APACHE CONFIGURATION NEEDS UPDATE') . qq|
1429 Koha uses the mod_env and mod_include apache features, but the
1430 installer did not find them in your config.  Please
1431 make sure that they are enabled for your Koha site.
1432
1433 Press <ENTER> to continue: |;
1434
1435
1436 $messages->{'ApacheAlreadyConfigured'}->{en} =
1437    heading('APACHE ALREADY CONFIGURED') . qq|
1438 %s appears to already have an entry for Koha.  You may need to edit %s
1439 if anything has changed since it was last set up.  This
1440 script will not attempt to modify an existing Koha apache
1441 configuration.
1442
1443 Press <ENTER> to continue: |;
1444
1445 sub updateapacheconf {
1446         my ($auto_install)=@_;
1447     my $logfiledir=$kohalogdir;
1448     my $httpdconf = $etcdir."/koha-httpd.conf";
1449    
1450     showmessage(getmessage('StartUpdateApache'), 'none') unless $auto_install->{NoPressEnter};
1451         # to be polite about it: I don't think this should touch the main httpd.conf
1452
1453         # QUESTION: Should we warn for includes_module too?
1454     my $envmodule=0;
1455     my $includesmodule=0;
1456     open HC, "<$realhttpdconf";
1457     while (<HC>) {
1458         if (/^\s*#\s*LoadModule env_module /) {
1459             showmessage(getmessage('ApacheConfigMissingModules'));
1460             $envmodule=1;
1461         }
1462         if (/\s*LoadModule includes_module / ) {
1463             $includesmodule=1;
1464         }
1465     }
1466
1467         startsysout;
1468     if (`grep -q 'VirtualHost $servername' "$httpdconf" 2>/dev/null`) {
1469         showmessage(getmessage('ApacheAlreadyConfigured', [$httpdconf, $httpdconf]), 'PressEnter');
1470         return;
1471     } else {
1472         my $includesdirectives='';
1473         if ($includesmodule) {
1474             $includesdirectives.="Options +Includes\n";
1475             $includesdirectives.="   AddHandler server-parsed .html\n";
1476         }
1477         open(SITE,">$httpdconf") or warn "Insufficient priveleges to open $httpdconf for writing.\n";
1478         my $opaclisten = '';
1479         if ($opacport != 80) {
1480             $opaclisten="Listen $opacport";
1481         }
1482         my $intranetlisten = '';
1483         if ($intranetport != 80) {
1484             $intranetlisten="Listen $intranetport";
1485         }
1486         print SITE <<EOP
1487
1488 # Koha 2.2 Apache Virtual Host Config File
1489 #
1490 # Please include this file in your apache configuration.
1491 # The best way to do that depends on your site setup.
1492 # Some like an Include adding to /etc/apache/httpd.conf
1493 # and some prefer a symlink to this file from some dir.
1494 # Please refer to your system manuals.
1495
1496 # Ports to listen to for Koha
1497 # uncomment these if they aren't already in main httpd.conf
1498 #$opaclisten
1499 #$intranetlisten
1500
1501 # NameVirtualHost is used by one of the optional configurations detailed below
1502 # Please make sure this line is correct before uncommenting.
1503 # See http://httpd.apache.org/docs/vhosts/ for some guides.
1504
1505 #NameVirtualHost 11.22.33.44
1506
1507 # KOHA's OPAC Configuration
1508 <VirtualHost $servername\:$opacport>
1509    ServerAdmin $svr_admin
1510    DocumentRoot $opacdir/htdocs
1511    ServerName $servername
1512    ScriptAlias /cgi-bin/koha/ $opacdir/cgi-bin/
1513    Redirect permanent index.html http://$servername\:$opacport/cgi-bin/koha/opac-main.pl
1514    ErrorLog $logfiledir/opac-error_log
1515    TransferLog $logfiledir/opac-access_log
1516    SetEnv PERL5LIB "$intranetdir/modules"
1517    SetEnv KOHA_CONF "$etcdir/koha.conf"
1518    $includesdirectives
1519 </VirtualHost>
1520
1521 # KOHA's INTRANET Configuration
1522 <VirtualHost $servername\:$intranetport>
1523    ServerAdmin $svr_admin
1524    DocumentRoot $intranetdir/htdocs
1525    ServerName $servername
1526    ScriptAlias /cgi-bin/koha/ "$intranetdir/cgi-bin/"
1527    Redirect permanent index.html http://$servername\:$intranetport/cgi-bin/koha/mainpage.pl
1528    ErrorLog $logfiledir/koha-error_log
1529    TransferLog $logfiledir/koha-access_log
1530    SetEnv PERL5LIB "$intranetdir/modules"
1531    SetEnv KOHA_CONF "$etcdir/koha.conf"
1532    $includesdirectives
1533 </VirtualHost>
1534
1535 # If you want to use name based Virtual Hosting:
1536 #   1. remove the two Listen lines
1537 #   2. replace $servername\:$opacport wih your.opac.domain.name
1538 #   3. replace ServerName $servername wih ServerName your.opac.domain.name
1539 #   4. replace $servername\:$intranetport wih your intranet domain name
1540 #   5. replace ServerName $servername wih ServerName your.intranet.domain.name
1541 #
1542 # If you want to use NameVirtualHost'ing (using two names on one ip address):
1543 #   1.  Follow steps 1-5 above
1544 #   2.  Uncomment the NameVirtualHost line and set the correct ip address
1545
1546 EOP
1547
1548
1549     }
1550 }
1551
1552
1553 =item basicauthentication
1554
1555     basicauthentication;
1556
1557 Asks the user whether HTTP basic authentication is wanted, and,
1558 if so, the user name and password for the basic authentication.
1559
1560 These pieces of information are saved to global variables; the
1561 function does not return any values.
1562
1563 =cut
1564
1565 # $messages->{'IntranetAuthenticationQuestion'}->{en} =
1566 #    heading('LIBRARIAN AUTHENTICATION') . qq|
1567 # The Librarian site can be password protected using
1568 # Apache's Basic Authorization instead of Koha user details.
1569
1570 # This method going to be phased out very soon.  Most users should answer N here.
1571
1572 # Would you like to do this (Y/[N]): |; #'
1573
1574 # $messages->{'BasicAuthUsername'}->{en}="Please enter a username for librarian access [%s]: ";
1575 # $messages->{'BasicAuthPassword'}->{en}="Please enter a password for %s: ";
1576 # $messages->{'BasicAuthPasswordWasBlank'}->{en}="\nYou cannot use a blank password!\n\n";
1577
1578 # sub basicauthentication {
1579 #     my $message=getmessage('IntranetAuthenticationQuestion');
1580 #     my $answer=showmessage($message, 'yn', 'n');
1581 #     my $httpdconf = $etcdir."/koha-httpd.conf";
1582
1583 #     my $apacheauthusername='librarian';
1584 #     my $apacheauthpassword='';
1585 #     if ($answer=~/^y/i) {
1586 #       ($apacheauthusername) = showmessage(getmessage('BasicAuthUsername', [ $apacheauthusername]), 'free', $apacheauthusername, 1);
1587 #       $apacheauthusername=~s/[^a-zA-Z0-9]//g;
1588 #       while (! $apacheauthpassword) {
1589 #           ($apacheauthpassword) = showmessage(getmessage('BasicAuthPassword', [ $apacheauthusername]), 'free', 1);
1590 #           if (!$apacheauthpassword) {
1591 #               ($apacheauthpassword) = showmessage(getmessage('BasicAuthPasswordWasBlank'), 'none', '', 1);
1592 #           }
1593 #       }
1594 #       open AUTH, ">$etcdir/kohaintranet.pass";
1595 #       my $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
1596 #       my $salt=substr($chars, int(rand(length($chars))),1);
1597 #       $salt.=substr($chars, int(rand(length($chars))),1);
1598 #       print AUTH $apacheauthusername.":".crypt($apacheauthpassword, $salt)."\n";
1599 #       close AUTH;
1600 #       open(SITE,">>$httpdconf") or warn "Insufficient priveleges to open $realhttpdconf for writing.\n";
1601 #       print SITE <<EOP
1602
1603 # <Directory $intranetdir>
1604 #     AuthUserFile $etcdir/kohaintranet.pass
1605 #     AuthType Basic
1606 #     AuthName "Koha Intranet (for librarians only)"
1607 #     Require  valid-user
1608 # </Directory>
1609 # EOP
1610 #     }
1611 #     close(SITE);
1612 # }
1613
1614
1615 =item installfiles
1616
1617     installfiles
1618
1619 Install the Koha files to the specified OPAC and INTRANET
1620 directories (usually in /usr/local/koha).
1621
1622 The koha.conf file is created, but as koha.conf.tmp. The
1623 caller is responsible for calling finalizeconfigfile when
1624 installation is completed, to rename it back to koha.conf.
1625
1626 =cut
1627
1628 $messages->{'InstallFiles'}->{en} = heading('INSTALLING FILES') . qq|
1629 Copying files to installation directories:
1630
1631 |;
1632
1633 $messages->{'OldFiles'}->{en} = heading('OLD FILES') . qq|
1634 Any files from the previous edition of Koha have been
1635 copied to a dated backup directory alongside the new
1636 installation. You should move any custom files that you
1637 want to keep (such as your site templates) into the new
1638 directories and then move the backup off of the live
1639 server.
1640
1641 Press ENTER to continue:|;
1642
1643
1644 $messages->{'CopyingFiles'}->{en}="Copying %s to %s.\n";
1645
1646
1647
1648 sub installfiles {
1649
1650         my ($is_first_install,$auto_install) = @_;
1651         # $is_install is set if it's a fresh install and not an upgrade. If it's an upgrade, copy old files.
1652         
1653         sub neatcopy {
1654                 my $desc = shift;
1655                 my $src = shift;
1656                 my $tgt = shift;
1657                 my $auto_install = shift;
1658                 my $is_first_install = shift;
1659                 if (!$is_first_install && -e $tgt) {
1660                 print getmessage('CopyingFiles', ["old ".$desc,$tgt.strftime("%Y%m%d%H%M",localtime())]) unless ($auto_install->{NoPressEnter});
1661                         system("mv ".$tgt." ".$tgt.strftime("%Y%m%d%H%M",localtime()));
1662                         system("mkdir ".$tgt);   ##New line 
1663                 }
1664                 print getmessage('CopyingFiles', [$desc,$tgt]) unless ($auto_install->{NoPressEnter});
1665                 system("cp -R ".$src."/* ".$tgt);
1666         }
1667
1668 #       my ($auto_install) = @_;
1669         showmessage(getmessage('InstallFiles'),'none') unless ($auto_install->{NoPressEnter});
1670
1671         neatcopy("admin templates", 'intranet-html', "$intranetdir/htdocs",$auto_install,$is_first_install);
1672         neatcopy("admin interface", 'intranet-cgi', "$intranetdir/cgi-bin",$auto_install,$is_first_install);
1673         neatcopy("main scripts", 'scripts', "$intranetdir/scripts",$auto_install,$is_first_install);
1674         neatcopy("perl modules", 'modules', "$intranetdir/modules",$auto_install,$is_first_install);
1675         neatcopy("OPAC templates", 'opac-html', "$opacdir/htdocs",$auto_install,$is_first_install);
1676         neatcopy("OPAC interface", 'opac-cgi', "$opacdir/cgi-bin",$auto_install,$is_first_install);
1677         startsysout();
1678         system("touch $opacdir/cgi-bin/opac");
1679
1680         #MJR: is this necessary?
1681         if ($> == 0) {
1682                 my $httpdgrp = getgrnam($httpduser);
1683                 system("chown -R $httpduser:$httpdgrp $opacdir $intranetdir");
1684         }
1685         system("chmod -R a+rx $opacdir $intranetdir");
1686
1687         # Create /etc/koha.conf
1688
1689         my $old_umask = umask(027); # make sure koha.conf is never world-readable
1690         open(SITES,">$etcdir/koha.conf.tmp") or warn "Couldn't create file at $etcdir. Must have write capability.\n";
1691         print SITES qq|
1692 database=$database
1693 hostname=$hostname
1694 user=$user
1695 pass=$pass
1696 intranetdir=$intranetdir
1697 opacdir=$opacdir
1698 kohalogdir=$kohalogdir
1699 kohaversion=$newversion
1700 httpduser=$httpduser
1701 intrahtdocs=$intranetdir/htdocs/intranet-tmpl
1702 opachtdocs=$opacdir/htdocs/opac-tmpl
1703 |;
1704         close(SITES);
1705         umask($old_umask);
1706
1707         startsysout();
1708         #MJR: can't help but this be broken, can we?
1709         chmod 0440, "$etcdir/koha.conf.tmp";
1710         
1711         #MJR: does this contain any passwords?
1712         chmod 0755, "$intranetdir/scripts/z3950daemon/z3950-daemon-launch.sh", "$intranetdir/scripts/z3950daemon/z3950-daemon-shell.sh", "$intranetdir/scripts/z3950daemon/processz3950queue";
1713
1714         open(FILE,">$intranetdir/scripts/z3950daemon/z3950-daemon-options");
1715         print FILE "RunAsUser=$httpduser\nKohaZ3950Dir=$intranetdir/scripts/z3950daemon\nKohaModuleDir=$intranetdir/modules\nLogDir=$kohalogdir\nKohaConf=$etcdir/koha.conf";
1716         close(FILE);
1717
1718         if ($> == 0) {
1719             chown((getpwnam($httpduser)) [2,3], "$etcdir/koha.conf.tmp") or warn "can't chown koha.conf: $!";
1720                 chown(0, (getpwnam($httpduser)) [3], "$intranetdir/scripts/z3950daemon/z3950-daemon-shell.sh") or warn "can't chown $intranetdir/scripts/z3950daemon/z3950-daemon-shell.sh: $!";
1721                 chown(0, (getpwnam($httpduser)) [3], "$intranetdir/scripts/z3950daemon/processz3950queue") or warn "can't chown $intranetdir/scripts/z3950daemon/processz3950queue: $!";
1722         } #MJR: report that we haven't chown()d.
1723         else {
1724                 print "Please check permissions in $intranetdir/scripts/z3950daemon\n";
1725         }
1726         showmessage(getmessage('OldFiles'),'PressEnter') unless ($auto_install->{NoPressEnter} or $is_first_install);
1727 }
1728
1729
1730 =item databasesetup
1731
1732     databasesetup;
1733
1734 Finds out where the MySQL utitlities are located in the system,
1735 then create the Koha database structure and MySQL permissions.
1736
1737 =cut
1738
1739 $messages->{'MysqlRootPassword'}->{en} =
1740    heading('MYSQL ROOT USER PASSWORD') . qq|
1741 To create the koha database, please enter your
1742 mysql server's root user password:
1743
1744 Password: |;    #'
1745
1746 $messages->{'CreatingDatabase'}->{en} = heading('CREATING DATABASE') . qq|
1747 Creating the MySQL database for Koha...
1748
1749 |;
1750
1751 $messages->{'CreatingDatabaseError'}->{en} =
1752    heading('ERROR CREATING DATABASE') . qq|
1753 Couldn't connect to the MySQL server for the reason given above.
1754 This is a serious problem, the database will not get installed.
1755
1756 Press <ENTER> to continue: |;   #'
1757
1758 $messages->{'SampleData'}->{en} = heading('SAMPLE DATA') . qq|
1759 If you are installing Koha for evaluation purposes,
1760 you can install some sample data now.
1761
1762 If you are installing Koha to use your own
1763 data, you probably don't want this sample data installed.
1764
1765 Would you like to install the sample data? Y/[N]: |;    #'
1766
1767 $messages->{'SampleDataInstalled'}->{en} =
1768    heading('SAMPLE DATA INSTALLED') . qq|
1769 Sample data has been installed.  For some suggestions on testing Koha, please
1770 read the file doc/HOWTO-Testing.  If you find any bugs, please submit them at
1771 http://bugs.koha.org/.  If you need help with testing Koha, you can post a
1772 question through the koha-devel mailing list, or you can check for a developer
1773 online at irc.katipo.co.nz:6667 channel #koha.
1774
1775 You can find instructions for subscribing to the Koha mailing lists at:
1776
1777     http://www.koha.org
1778
1779
1780 Press <ENTER> to continue: |;
1781
1782 $messages->{'AddBranchPrinter'}->{en} = heading('Add Branch and Printer') . qq|
1783 Would you like to describe an initial branch and printer? [Y]/N: |;
1784
1785 $messages->{'BranchName'}->{en}="Branch Name [%s]: ";
1786 $messages->{'BranchCode'}->{en}="Branch Code (4 letters or numbers) [%s]: ";
1787 $messages->{'PrinterQueue'}->{en}="Printer Queue [%s]: ";
1788 $messages->{'PrinterName'}->{en}="Printer Name [%s]: ";
1789
1790 sub databasesetup {
1791         my ($auto_install) = @_;
1792     $mysqluser = 'root';
1793     $mysqlpass = '';
1794         my $mysqldir = getmysqldir();
1795
1796         if ($auto_install->{MysqlRootPassword}) {
1797                 $mysqlpass=$auto_install->{MysqlRootPassword};
1798         } else {
1799         # we must not put the mysql root password on the command line
1800                 $mysqlpass=     showmessage(getmessage('MysqlRootPassword'),'silentfree');
1801         }
1802         
1803         showmessage(getmessage('CreatingDatabase'),'none') unless ($auto_install->{NoPressEnter});
1804         # set the login up
1805         setmysqlclipass($mysqlpass);
1806         # Set up permissions
1807         startsysout();
1808         print system("$mysqldir/bin/mysql -u$mysqluser -e \"insert into user (Host,User,Password) values ('$hostname','$user',password('$pass'))\" mysql\;");
1809         system("$mysqldir/bin/mysql -u$mysqluser -e \"insert into db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv, index_priv, alter_priv) values ('%','$database','$user','Y','Y','Y','Y','Y','Y','Y','Y')\" mysql");
1810         system("$mysqldir/bin/mysqladmin -u$mysqluser reload");
1811         # Change to admin user login
1812         setmysqlclipass($pass);
1813         my $result=system("$mysqldir/bin/mysqladmin", "-u$user", "create", "$database");
1814         if ($result) {
1815                 showmessage(getmessage('CreatingDatabaseError'),'PressEnter', '', 1);
1816         } else {
1817                 # Create the database structure
1818                 startsysout();
1819                 system("$mysqldir/bin/mysql -u$user $database < koha.mysql");
1820         }
1821
1822 }
1823
1824
1825 =item updatedatabase
1826
1827     updatedatabase;
1828
1829 Updates the Koha database structure, including the addition of
1830 MARC tables.
1831
1832 The MARC tables are also populated in addition to being created.
1833
1834 Because updatedatabase calls scripts/updater/updatedatabase to
1835 do the actual update, and that script uses C4::Context,
1836 $etcdir/koha.conf must exist at this point. We use the KOHA_CONF
1837 environment variable to do this.
1838
1839 FIXME: (See checkabortedinstall as it depends on old symlink way.)
1840
1841 =cut
1842
1843 $messages->{'UpdateMarcTables'}->{en} =
1844    heading('MARC FIELD DEFINITIONS') . qq|
1845 You can import MARC settings for:
1846
1847   1 MARC21
1848   2 UNIMARC
1849   N none
1850
1851 NOTE: If you choose N,
1852 nothing will be added, and you must create them all yourself.
1853 Only choose N if you want to use a MARC format not listed here,
1854 such as DANMARC.  We would like to hear from you if you do.
1855
1856 *** UPGRADE ***
1857 If you UPGRADE your version from a previous 2.x.x, the right choice here is N (None) to preserve your local MARC setup.
1858
1859 Choose MARC definition [1]: |;
1860
1861 $messages->{'Language'}->{en} = heading('CHOOSE LANGUAGE') . qq|
1862 This version of koha supports a few languages.
1863
1864   en : default language, all pages available
1865   fr : complete translation
1866   es : partial librarian site translation
1867   zh_TW : partial translation
1868
1869 en is used when a screen is not available in your language
1870
1871 If you specify a language here, you can still
1872 change it from the system preferences screen in the librarian sit.
1873
1874 Which language do you choose? |;
1875
1876 sub updatedatabase {
1877         my ($auto_install) = @_;
1878     # At this point, $etcdir/koha.conf must exist, for C4::Context
1879     $ENV{"KOHA_CONF"}=$etcdir.'/koha.conf';
1880     if (! -e $ENV{"KOHA_CONF"}) { $ENV{"KOHA_CONF"}=$etcdir.'/koha.conf.tmp'; }
1881         startsysout();  
1882         setmysqlclipass($pass);
1883         my $result=system ("perl -I $intranetdir/modules scripts/updater/updatedatabase -s");
1884         if ($result) {
1885                 restoremycnf();
1886                 print "Problem updating database...\n";
1887                 exit;
1888         }
1889         my $response;
1890         if ($auto_install->{UpdateMarcTables}) {
1891                 $response=$auto_install->{UpdateMarcTables};
1892                 print ON_YELLOW.BLACK."auto-setting UpdateMarcTable to : $response".RESET."\n";
1893         } else {
1894                 $response=showmessage(getmessage('UpdateMarcTables'), 'restrictchar 12Nn', '1');
1895         }
1896         startsysout();
1897         if ($response eq '1') {
1898                 system("cat scripts/misc/marc_datas/marc21_en/structure_def.sql | $mysqldir/bin/mysql -u$user $database");
1899         }
1900         if ($response eq '2') {
1901                 system("cat scripts/misc/marc_datas/unimarc_fr/structure_def.sql | $mysqldir/bin/mysql -u$user $database");
1902         }
1903         delete($ENV{"KOHA_CONF"});
1904
1905         print RESET."\nFinished updating of database. Press <ENTER> to continue..." unless ($auto_install->{NoPressEnter});
1906         <STDIN> unless ($auto_install->{NoPressEnter});
1907 }
1908
1909
1910 =item populatedatabase
1911
1912     populatedatabase;
1913
1914 Populate the non-MARC tables. If the user wants to install the
1915 sample data, install them.
1916
1917 =cut
1918
1919 $messages->{'ConfirmFileUpload'}->{en} = qq|
1920 Confirm loading of this file into Koha  [Y]/N: |;
1921
1922 sub populatedatabase {
1923         my ($auto_install) = @_;
1924         my $input;
1925         my $response;
1926         my $branch='MAIN';
1927         if ($auto_install->{BranchName}) {
1928                 $branch=$auto_install->{BranchName};
1929                 print ON_YELLOW.BLACK."auto-setting a branch : $branch".RESET."\n";
1930         } else {
1931                 $response=showmessage(getmessage('AddBranchPrinter'), 'yn', 'y');
1932                 unless ($response =~/^n/i) {
1933                         $branch=showmessage(getmessage('BranchName', [$branch]), 'free', $branch, 1);
1934                         $branch=~s/[^A-Za-z0-9\s]//g;
1935                 }
1936         }
1937         if ($branch) {
1938                 my $branchcode=$branch;
1939                 $branchcode=~s/[^A-Za-z0-9]//g;
1940                 $branchcode=uc($branchcode);
1941                 $branchcode=substr($branchcode,0,4);
1942                 if ($auto_install->{BranchCode}) {
1943                         $branchcode=$auto_install->{BranchCode};
1944                         print ON_YELLOW.BLACK."auto-setting branch code : $branchcode".RESET."\n";
1945                 } else {
1946                         $branchcode=showmessage(getmessage('BranchCode', [$branchcode]), 'free', $branchcode, 1);
1947                 }
1948                 $branchcode=~s/[^A-Za-z0-9]//g;
1949                 $branchcode=uc($branchcode);
1950                 $branchcode=substr($branchcode,0,4);
1951                 $branchcode or $branchcode='DEF';
1952
1953                 startsysout();
1954                 system("$mysqldir/bin/mysql -u$user -e \"insert into branches (branchcode,branchname,issuing) values ('$branchcode', '$branch', 1)\" $database");
1955                 system("$mysqldir/bin/mysql -u$user -e \"insert into branchrelations (branchcode,categorycode) values ('MAIN', 'IS')\" $database");
1956                 system("$mysqldir/bin/mysql -u$user -e \"insert into branchrelations (branchcode,categorycode) values ('MAIN', 'CU')\" $database");
1957
1958                 my $printername='lp';
1959                 my $printerqueue='/dev/lp0';
1960                 if ($auto_install->{PrinterName}) {
1961                         $printername=$auto_install->{PrinterName};
1962                         print ON_YELLOW.BLACK."auto-setting a printer : $printername".RESET."\n";
1963                 } else {
1964                         $printername=showmessage(getmessage('PrinterName', [$printername]), 'free', $printername, 1);
1965                         $printername=~s/[^A-Za-z0-9\s]//g;
1966                 }
1967                 if ($auto_install->{PrinterQueue}) {
1968                         $printerqueue=$auto_install->{PrinterQueue};
1969                         print ON_YELLOW.BLACK."auto-setting printer queue to : $printerqueue".RESET."\n";
1970                 } else {
1971                         $printerqueue=showmessage(getmessage('PrinterQueue', [$printerqueue]), 'free', $printerqueue, 1);
1972                         $printerqueue=~s/[^A-Za-z0-9]//g;
1973                 }
1974                 startsysout();  
1975                 system("$mysqldir/bin/mysql -u$user -e \"insert into printers (printername,printqueue,printtype) values ('$printername', '$printerqueue', '')\" $database");
1976         }
1977         my $language;
1978         if ($auto_install->{Language}) {
1979                 $language=$auto_install->{Language};
1980                 print ON_YELLOW.BLACK."auto-setting language to : $language".RESET."\n";
1981         } else {
1982                 $language=showmessage(getmessage('Language'), 'free', 'en');
1983         }
1984         startsysout();  
1985         system("$mysqldir/bin/mysql -u$user -e \"update systempreferences set value='$language' where variable='opaclanguages'\" $database");
1986         my @dirs;
1987         if (-d "scripts/misc/sql-datas") {
1988                 # ask for directory to look for files to append
1989                 my @directories;
1990                 push @directories,"FINISHED";
1991                 if (-d "scripts/misc/sql-datas") {
1992                         opendir D, "scripts/misc/sql-datas";
1993                         foreach my $dir (readdir D) {
1994                                 next if ($dir =~ /^\./);
1995                                 push @directories, $dir;
1996                         }
1997                 }
1998                 my $loopend=0;
1999                 while (not $loopend) {
2000                         print heading("SELECT SQL DIRECTORY");
2001                         print qq|
2002 Select a directory. You will see every file included in this directory and be able to choose file(s) to import into Koha
2003 This is a VERY important feature. By selecting the proper options, you can get a pre-setup Koha, almost ready to be put in production.
2004 Choose wisely.
2005 |;
2006                         for (my $i=0;$i<=$#directories;$i++) {
2007                                 print "$i => ".$directories[$i]."\n";
2008                         }
2009                         my $sqluploaddir =<STDIN>;
2010                         if ($sqluploaddir==0) {
2011                                 $loopend = 1;
2012                         } else {
2013                                 $sqluploaddir = $directories[$sqluploaddir];
2014                                 # CHECK for any other file to append...
2015                                 my @sql;
2016                                 push @sql,"FINISHED";
2017                                 if (-d "scripts/misc/sql-datas/$sqluploaddir") {
2018                                         opendir D, "scripts/misc/sql-datas/$sqluploaddir";
2019                                         foreach my $sql (readdir D) {
2020                                                 next unless ($sql =~ /.txt$/);
2021                                                 push @sql, $sql;
2022                                         }
2023                                 }
2024                                 $loopend=0;
2025                                 while (not $loopend) {
2026                                         print heading("SELECT SQL FILE");
2027                                         print qq|
2028 Select a file to append to the Koha DB.
2029 enter a number. A detailled explanation of the file will be given
2030 if you confirm, the file will be added to the DB
2031 |;
2032                                         for (my $i=0;$i<=$#sql;$i++) {
2033                                                 print "$i => ".$sql[$i]."\n";
2034                                         }
2035                                         my $response =<STDIN>;
2036                                         if ($response==0) {
2037                                                 $loopend = 1;
2038                                         } else {
2039                                                 # show the content of the file
2040                                                 my $FileToUpload = $sql[$response];
2041                                                 open FILE,"scripts/misc/sql-datas/$sqluploaddir/$FileToUpload";
2042                                                 my $content = <FILE>;
2043                                                 print heading("INSERT $sqluploaddir/$FileToUpload ?")."$content\n";
2044                                                 # ask confirmation
2045                                                 $response=showmessage(getmessage('ConfirmFileUpload'), 'yn', 'y');
2046                                                 # if confirmed, upload the file in the DB
2047                                                 unless ($response =~/^n/i) {
2048                                                         $FileToUpload =~ s/\.txt/\.sql/;
2049                                                         system("$mysqldir/bin/mysql -u$user $database <scripts/misc/sql-datas/$sqluploaddir/$FileToUpload");
2050                                                 }
2051                                         }
2052                                 }
2053                                 $loopend=0;
2054                         }
2055                 }
2056         }
2057 }
2058
2059 =item restartapache
2060
2061     restartapache;
2062
2063 Asks the user whether to restart Apache, and restart it if the user
2064 wants so.
2065
2066 =cut
2067
2068 $messages->{'RestartApache'}->{en} = heading('RESTART APACHE') . qq|
2069 The web server daemon needs to be restarted to load the new configuration for Koha.
2070 The installer can do this if you are using Apache and give the root password.
2071
2072 Would you like to try to restart Apache now?  [Y]/N: |;
2073
2074 sub restartapache {
2075         my ($auto_install)=@_;
2076         my $response;
2077     $response=showmessage(getmessage('RestartApache'), 'yn', 'y') unless ($auto_install->{NoPressEnter});
2078     $response='y' if ($auto_install->{NoPressEnter});
2079
2080     unless ($response=~/^n/i) {
2081                 startsysout();
2082                 # Need to support other init structures here?
2083                 if (-e "/etc/rc.d/init.d/httpd") {
2084                         system('su root -c "/etc/rc.d/init.d/httpd restart"');
2085                 } elsif (-e "/etc/init.d/apache") {
2086                         system('su root -c "/etc/init.d/apache restart"');
2087                 } elsif (-e "/etc/init.d/apache-ssl") {
2088                         system('su root -c "/etc/init.d/apache-ssl restart"');
2089                 }
2090         }
2091 }
2092
2093 =item backupkoha
2094
2095    backupkoha;
2096
2097 This function attempts to back up all koha's details.
2098
2099 =cut
2100
2101 $messages->{'BackupDir'}->{en} = heading('BACKUP STORAGE').qq|
2102 The upgrader will now try to backup your old files.
2103
2104 Please specify a directory to store the backup in [%s]: |;
2105
2106 $messages->{'BackupSummary'}->{en} = heading('BACKUP SUMMARY').qq|
2107 Backed up:
2108
2109 %6d biblio entries
2110 %6d biblioitems entries
2111 %6d items entries
2112 %6d borrowers
2113
2114 File Listing
2115 ---------------------------------------------------------------------
2116 %s
2117 ---------------------------------------------------------------------
2118
2119 Does this look right? ([Y]/N): |;
2120
2121 #FIXME: rewrite to use Install.pm
2122 sub backupkoha {
2123 if (!$ENV{prefix}) { $ENV{prefix} = "/usr/local"; }
2124 my $backupdir=$ENV{prefix}.'/backups';
2125
2126 my $answer = showmessage(getmessage('BackupDir',[$backupdir]),'free',$backupdir);
2127 $backupdir = $answer; 
2128
2129 if (! -e $backupdir) {
2130         my $result=mkdir ($backupdir, oct(770));
2131         if ($result==0) {
2132                 my @dirs = split(m#/#, $backupdir);
2133                 my $checkdir='';
2134                 foreach (@dirs) {
2135                         $checkdir.="$_/";
2136                         unless (-e "$checkdir") {
2137                                 mkdir($checkdir, 0775);
2138                         }
2139                 }
2140         }
2141 }
2142
2143 chmod 0770, $backupdir;
2144
2145 # Backup MySql database
2146 #
2147 #
2148 my $mysqldir = getmysqldir();
2149
2150 my ($sec, $min, $hr, $day, $month, $year) = (localtime(time))[0,1,2,3,4,5];
2151 $month++;
2152 $year+=1900;
2153 my $date= sprintf "%4d-%02d-%02d_%02d:%02d:%02d", $year, $month, $day,$hr,$min,$sec;
2154
2155 setmysqlclipass($pass); 
2156 open (MD, "$mysqldir/bin/mysqldump --user=$user --host=$hostname $database|");
2157
2158 (open BF, ">$backupdir/Koha.backup_$date") || (die "Error opening up backup file $backupdir/Koha.backup_$date: $!\n");
2159
2160 my $itemcounter=0;
2161 my $bibliocounter=0;
2162 my $biblioitemcounter=0;
2163 my $membercounter=0;
2164
2165 while (<MD>) {
2166         (/insert into items /i) && ($itemcounter++);
2167         (/insert into biblioitems /i) && ($biblioitemcounter++);
2168         (/insert into biblio /i) && ($bibliocounter++);
2169         (/insert into borrowers /i) && ($membercounter++);
2170         print BF $_;
2171 }
2172
2173 close BF;
2174 close MD;
2175
2176 my $filels=`ls -hl $backupdir/Koha.backup_$date`;
2177 chomp $filels;
2178 $answer = showmessage(getmessage('BackupSummary',[$bibliocounter, $biblioitemcounter, $itemcounter, $membercounter, $filels]),'yn');
2179
2180 if ($answer=~/^n/i) {
2181     print qq|
2182
2183 Aborting.  The database dump is located in:
2184
2185         $backupdir/Koha.backup_$date
2186
2187 |;
2188     exit;
2189 } else {
2190         print "Great! continuing upgrade... \n";
2191 };
2192
2193
2194
2195 }
2196
2197 =item finalizeconfigfile
2198
2199    finalizeconfigfile;
2200
2201 This function must be called when the installation is complete,
2202 to rename the koha.conf.tmp file to koha.conf.
2203
2204 Currently, failure to rename the file results only in a warning.
2205
2206 =cut
2207
2208 sub finalizeconfigfile {
2209         restoremycnf();
2210    rename "$etcdir/koha.conf.tmp", "$etcdir/koha.conf"
2211       || showmessage(<<EOF, 'PressEnter', undef, 1);
2212 An unexpected error, $!, occurred
2213 while the Koha config file is being saved to its final location,
2214 $etcdir/koha.conf.
2215
2216 Couldn't rename file at $etcdir. Must have write capability.
2217
2218 Press Enter to continue.
2219 EOF
2220 #'
2221 }
2222
2223
2224 =item loadconfigfile
2225
2226    loadconfigfile
2227
2228 Open the existing koha.conf file and get its values,
2229 saving the values to some global variables.
2230
2231 If the existing koha.conf file cannot be opened for any reason,
2232 the file is silently ignored.
2233
2234 =cut
2235
2236 sub loadconfigfile {
2237     my %configfile;
2238
2239         #MJR: reverted to r1.53.  Please call setetcdir().  Do NOT hardcode this.
2240         #FIXME: make a dated backup
2241     open (KC, "<$etcdir/koha.conf");
2242     while (<KC>) {
2243      chomp;
2244      (next) if (/^\s*#/);
2245      if (/(.*)\s*=\s*(.*)/) {
2246        my $variable=$1;
2247        my $value=$2;
2248        # Clean up white space at beginning and end
2249        $variable=~s/^\s*//g;
2250        $variable=~s/\s*$//g;
2251        $value=~s/^\s*//g;
2252        $value=~s/\s*$//g;
2253        $configfile{$variable}=$value;
2254      }
2255     }
2256
2257         #MJR: Reverted this too. You do not mess with my privates. Please ask for new functions if required.
2258     $intranetdir=$configfile{'intranetdir'};
2259     $opacdir=$configfile{'opacdir'};
2260     $kohaversion=$configfile{'kohaversion'};
2261     $kohalogdir=$configfile{'kohalogdir'};
2262     $database=$configfile{'database'};
2263     $hostname=$configfile{'hostname'};
2264     $user=$configfile{'user'};
2265     $pass=$configfile{'pass'};
2266 }
2267
2268 END { }       # module clean-up code here (global destructor)
2269
2270 ### These things may move
2271
2272 sub setecho {
2273 my $state=shift;
2274 my $t = POSIX::Termios->new;
2275
2276 $t->getattr();
2277 if ($state) {
2278   $t->setlflag(($t->getlflag) | &POSIX::ECHO);
2279   }
2280 else {
2281   $t->setlflag(($t->getlflag) & !(&POSIX::ECHO));
2282   }
2283 $t->setattr();
2284 }
2285
2286 sub setmysqlclipass {
2287         my $pass = shift;
2288         open(MYCNF,">$mycnf");
2289         chmod(0600,$mycnf);
2290         print MYCNF "[client]\npassword=$pass\n";
2291         close(MYCNF);
2292 }
2293
2294 sub backupmycnf {
2295         if (-e $mycnf) {
2296                 rename $mycnf,$mytmpcnf;
2297         }
2298 }
2299
2300 sub restoremycnf {
2301         if (defined $mycnf && -e $mycnf) {
2302                 unlink($mycnf);
2303         }
2304         if (defined $mytmpcnf && -e $mytmpcnf) {
2305                 rename $mytmpcnf,$mycnf;
2306         }
2307 }
2308
2309 =back
2310
2311 =head1 SEE ALSO
2312
2313 buildrelease.pl
2314 installer.pl
2315 koha.upgrade
2316
2317 =cut
2318
2319 1;