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