1 package Install; #assumes Install.pm
4 # Copyright 2000-2002 Katipo Communications
5 # Contains parts Copyright 2003 MJ Ray
7 # This file is part of Koha.
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
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.
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
23 # MJR: my.cnf, etcdir, prefix, new display, apache conf, copying fixups
27 #MJR: everyone will have these modules, right?
28 # They look like part of perl core to me
30 use Term::ANSIColor qw(:constants);
34 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
38 Install.pm - Perl module containing the bulk of the installation logic
42 The Install.pm module contains the bulk
43 of the code to do installation;
44 this code is used by installer.pl
45 to perform an actual installation.
47 =head2 Internal functions (not meant to be used outside of Install.pm)
53 # set the version for version checking
57 @EXPORT = qw( &checkperlmodules
61 &releasecandidatewarning
62 &getinstallationdirectories
79 use vars qw( $kohaversion ); # set in installer.pl
80 use vars qw( $language ); # set in installer.pl
81 use vars qw( $domainname ); # set in installer.pl
83 use vars qw( $etcdir ); # set in installer.pl, usu. /etc
84 use vars qw( $intranetdir $opacdir $kohalogdir );
85 use vars qw( $realhttpdconf $httpduser );
86 use vars qw( $servername $svr_admin $opacport $intranetport );
87 use vars qw( $mysqldir );
88 use vars qw( $database $mysqluser );
89 use vars qw( $mysqlpass ); # normally should not be used
90 use vars qw( $dbname $hostname $user $pass ); # virtual hosting
92 use vars qw( $newversion ); # XXX this seems to be unused
96 $messages->{'WelcomeToKohaInstaller'
97 = heading('Welcome to the Koha Installer') . qq|...|;
99 The heading function takes one string, the text to be displayed as
100 the heading, and returns a formatted heading (currently formatted
103 This reduces the likelihood of pod2man(1) etc. misinterpreting
104 a line of equal signs as illegal POD directives.
108 my $termios = POSIX::Termios->new();
110 my $terminal = Term::Cap->Tgetent({OSPEED=>$termios->getospeed()});
111 my $clear_string = "\n\n"; #MJR: was $terminal->Tputs('cl');
116 return($clear_string.ON_BLUE.WHITE.BOLD." "x$bal.uc($title)." "x$bal.RESET."\n\n");
119 my $mycnf = $ENV{HOME}."/.my.cnf";
120 my $mytmpcnf = `mktemp my.cnf.koha.XXXXXX`;
124 $messages->{'continuing'}->{en}="Great! Continuing...\n\n";
125 $messages->{'WelcomeToKohaInstaller'}->{en} =
126 heading('Welcome to the Koha Installer') . qq|
127 This program will ask some questions and try to install koha for you.
128 You need to know: where most koha files should be stored (you can set
129 the prefix environment variable for this); the username and password of
130 a mysql superuser; and details of your library setup. You may also need
131 to know details of your Apache setup.
133 If you want to install the Koha configuration files somewhere other than
134 /etc (for multiple Koha versions on one system, for example), you should
135 set the etcdir environment variable. Please look at your manuals for
136 details of how to set that.
138 Recommended answers are given in brackets after each question. To accept
139 the default value for any question (indicated by []), simply hit Enter
142 Are you ready to begin the installation? ([Y]/N): |;
144 $messages->{'ReleaseCandidateWarning'}->{en} =
145 heading('RELEASE CANDIDATE') . qq|
146 WARNING: You are about to install Koha version %s. This is a
147 release candidate, not intended for production systems.
148 It is being released so that users can test it before we release a final
149 version and report bugs to us.
151 Most people should answer Yes here.
153 Are you sure you want to install Koha %s? (Y/[N]): |;
154 $messages->{'WatchForReleaseAnnouncements'}->{en}=qq|
156 Watch for announcements of Koha releases on the Koha mailing list or the Koha
157 web site (http://www.koha.org/).
161 $messages->{'NETZ3950Missing'}->{en}=qq|
163 The Net::Z3950 module is missing. This module is necessary if you want to use
164 Koha's Z39.50 client to download bibliographic records from other libraries.
166 To install this module, you will need the yaz client installed from
167 http://www.indexdata.dk/yaz/ and then you can install the perl module with the
170 perl -MCPAN -e 'install Net::Z3950'
172 ...or by installing packages for your distribution, if available.
174 IMPORTANT NOTE : If you use Perl 5.8.0, you might need to
175 edit NET::Z3950's Makefile.PL and yazwrap/Makefile.PL to include:
177 'DEFINE' => '-D_GNU_SOURCE',
179 Also note that some installations of Perl on Red Hat will generate a lot of
180 "'my_perl' undeclared" errors when running make in Net-Z3950. This is fixed by
181 inserting in yazwrap/ywpriv.h a line saying #include "XSUB.h"
183 Press the <ENTER> key to continue: |; #'
185 $messages->{'CheckingPerlModules'}->{en} = heading('PERL MODULES') . qq|
186 Checking perl modules ...
189 $messages->{'PerlVersionFailure'}->{en}="Sorry, you need at least Perl %s\n";
191 $messages->{'MissingPerlModules'}->{en} = heading('MISSING PERL MODULES') . qq|
192 You are missing some Perl modules which are required by Koha.
193 Once these modules have been installed, rerun this installer.
194 They may be installed by running (as root) the following:
199 $messages->{'AllPerlModulesInstalled'}->{en} =
200 heading('PERL MODULES AVAILABLE') . qq|
201 All mandatory perl modules are installed.
203 Press <ENTER> to continue: |;
204 $messages->{'KohaVersionInstalled'}->{en}="You currently have Koha %s on your system.";
205 $messages->{'KohaUnknownVersionInstalled'}->{en}="I am not able to determine what version of Koha is installed now.";
206 $messages->{'KohaAlreadyInstalled'}->{en} =
207 heading('Koha already installed') . qq|
208 It looks like Koha is already installed on your system (%s/koha.conf exists).
209 If you would like to upgrade your system to %s, please use
210 the koha.upgrade script in this directory.
215 $messages->{'GetOpacDir'}->{en} = heading('OPAC DIRECTORY') . qq|
216 Please supply the directory you want Koha to store its OPAC files in. This
217 directory will be auto-created for you if it doesn't exist.
219 OPAC Directory [%s]: |; #'
221 $messages->{'GetIntranetDir'}->{en} =
222 heading('LIBRARIAN DIRECTORY') . qq|
223 Please supply the directory you want Koha to store its Librarian interface
224 files in. This directory will be auto-created for you if it doesn't exist.
226 Intranet Directory [%s]: |; #'
228 $messages->{'GetKohaLogDir'}->{en} = heading('LOG DIRECTORY') . qq|
229 Specify a directory where log files will be written.
231 Koha Log Directory [%s]: |;
233 $messages->{'AuthenticationWarning'}->{en} = heading('Authentication') . qq|
234 This release of Koha has a new authentication module.
235 You will be required to log in to
236 access some features.
238 IMPORTANT: You can log in using the userid and password from the %s/koha.conf configuration file at any time.
239 Use the "Members" screen to add passwords for other accounts and set their flags.
241 Press the <ENTER> key to continue: |;
243 $messages->{'Completed'}->{en} = heading('INSTALLATION COMPLETE') . qq|
244 Congratulations ... your Koha installation is complete!
246 You will be able to connect to your Librarian interface at:
250 use the koha admin mysql login and password to connect to this interface.
252 and the OPAC interface at:
256 Please read the Hints file and visit http://www.koha.org
258 Press <ENTER> to exit the installer: |;
260 sub releasecandidatewarning {
261 my $message=getmessage('ReleaseCandidateWarning', [$newversion, $newversion]);
262 my $answer=showmessage($message, 'yn', 'n');
264 if ($answer =~ /y/i) {
265 print getmessage('continuing');
267 my $message=getmessage('WatchForReleaseAnnouncements');
276 =head2 Accessor functions (for installer.pl)
286 Sets the installation language, normally "en" (English).
287 In fact, only "en" is supported.
291 sub setlanguage ($) {
297 setdomainname('example.org');
299 Sets the domain name of the host.
301 The domain name should not contain a leading dot;
302 otherwise, the results are undefined.
306 sub setdomainname ($) {
314 Sets the sysconfdir, normally /etc.
315 This should be an absolute path; a trailing / is not required.
325 setkohaversion('1.3.3RC26');
327 Sets the Koha version as known by the installer.
331 sub setkohaversion ($) {
337 my $servername = getservername;
339 Gets the name of the Koha virtual server as specified by the user.
343 sub getservername () {
351 Gets the port that will run the Koha OPAC virtual server,
352 as specified by the user.
360 =item getintranetport
362 $port = getintranetport;
364 Gets the port that will run the Koha INTRANET virtual server,
365 as specified by the user.
369 sub getintranetport () {
375 =head2 Miscellaneous utility functions
385 Does the equivalent of dirname(1). Given a path $path, return the
386 parent directory of $path (best guess), except when $path seems to
387 be the same as /, in which case $path itself is returned unchanged.
393 if ($path =~ /[^\/]/s) {
395 $path =~ s/\/+[^\/]+\/*$//s;
406 mkdir_parents $path, $mode;
408 Does the equivalent of mkdir -p, or mkdir --parents. Given a path $path,
409 create the directory $path, recursively creating any intermediate
410 directories. If $mode is given, the directory will be created with
413 WARNING: If $path already exists, mkdir_parents will just return
414 successfully (just like mkdir -p), whether the mode of $path conforms
415 to $mode or not. (This is the behaviour of the mkdir -p command.)
420 my($path, $mode) = @_;
421 my $ok = -d($path)? 1: defined $mode? mkdir($path, $mode): mkdir($path);
423 if (!$ok && $! == ENOENT) {
424 my $parent = dirname($path);
425 $ok = mkdir_parents($parent, $mode);
427 # retry and at the same time make sure that $! is set correctly
428 $ok = defined $mode? mkdir($path, $mode): mkdir($path);
437 getmessage($msgid, $variables);
439 Gets a localized message (format string) with message id $msgid,
440 and, if an array reference of variables $variables is given,
441 substitutes variables in the format string with @$variables.
442 Returns the found message string, with variable substitutions
445 $msgid must be the message identifier corresponding to a defined
446 message string (a valid key to the $messages hash in the Installer
447 package). getmessage throws an exception if the message cannot be
453 my $messagename=shift;
455 my $message=$messages->{$messagename}->{$language} || $messages->{$messagename}->{en} || RED.BOLD."Error: No message named $messagename in Install.pm\n";
456 if (defined($variables)) {
457 $message=sprintf $message, @$variables;
465 showmessage($message, 'none');
466 showmessage($message, 'none', undef, $noclear);
468 $result = showmessage($message, 'yn');
469 $result = showmessage($message, 'yn', $defaultresponse);
470 $result = showmessage($message, 'yn', $defaultresponse, $noclear);
472 $result = showmessage($message, 'restrictchar CHARS');
473 $result = showmessage($message, 'free');
474 $result = showmessage($message, 'silentfree');
475 $result = showmessage($message, 'numerical');
476 $result = showmessage($message, 'email');
477 $result = showmessage($message, 'PressEnter');
479 Shows a message and optionally gets a response from the user.
481 The first two arguments, the message and the response type,
482 are mandatory. The message must be the actual string to
483 display; the caller is responsible for calling getmessage if
486 The response type must be one of "none", "yn", "free", "silentfree"
487 "numerical", "email", "PressEnter", or a string consisting
488 of "restrictchar " followed by a list of allowed characters
489 (space can be specified). (Case is not significant, but case is
490 significant in the list of allowed characters.) If a response
491 type other than the above-listed is specified, the result is
494 Note that the response type "yn" is equivalent to "restrictchar yn".
495 Because "restrictchar" is case-sensitive, the user is expected
496 to enter "y" or "n" in lowercase only.
498 Note that the response type of "email" does not actually
499 guarantee that the returned value is a well-formed RFC-822
500 email address, nor does it accept all well-formed RFC-822 email
501 addresses. What it does is to restrict the returned value to a
502 string that is looks reasonably likely to be an email address
503 in the "real world", given the premise that the user is trying
504 to enter a real email address.
506 If a response type other than "none" or "PressEnter" is
507 specified, a third argument, specifying the default value, can
508 be specified: If this default response is not specified, the
509 default response is the first allowed character if the response
510 type is "restrictchar", otherwise the default response is the
511 empty string. This default response is used when the user does
512 not specify a value (i.e., presses Enter without typing in
513 anything), showmessage will assume that the default response is
516 Note that because the response type "yn" is equivalent to
517 "restrictchar yn", the default value for response type "yn",
518 if unspecified, is "y".
520 The screen is normally cleared before the message is displayed;
521 if a fourth argument is specified and is nonzero, this
522 screen-clearing is not done.
528 #MJR: Maybe refactor to use anonymous functions that
529 # check the responses instead of RnP branching.
530 my $message=join('',fill('','',(shift)));
531 my $responsetype=shift;
532 my $defaultresponse=shift;
534 $noclear = 0 unless defined $noclear; # defaults to "clear"
535 ($noclear) || (print $clear_string);
536 if ($responsetype =~ /^yn$/) {
537 $responsetype='restrictchar ynYN';
539 print RESET.$message;
540 if ($responsetype =~/^restrictchar (.*)/i) {
543 until ($options=~/$response/) {
544 (defined($defaultresponse)) || ($defaultresponse=substr($options,0,1));
547 (length($response)) || ($response=$defaultresponse);
548 if ( $response=~/.*[\:\(\)\^\$\*\!\\].*/ ) {
549 ($noclear) || (print $clear_string);
550 print RED."Response contains invalid characters. Choose from [$options].\n\n";
551 print RESET.$message;
554 unless ($options=~/$response/) {
555 ($noclear) || (print $clear_string);
556 print RED."Invalid Response. Choose from [$options].\n\n";
557 print RESET.$message;
562 } elsif ($responsetype =~/^(silent)?free$/i) {
563 (defined($defaultresponse)) || ($defaultresponse='');
564 if ($responsetype =~/^(silent)/i) { setecho(0) };
565 my $response=<STDIN>;
566 if ($responsetype =~/^(silent)/i) { setecho(1) };
568 ($response) || ($response=$defaultresponse);
570 } elsif ($responsetype =~/^numerical$/i) {
571 (defined($defaultresponse)) || ($defaultresponse='');
573 until ($response=~/^\d+$/) {
576 ($response) || ($response=$defaultresponse);
577 unless ($response=~/^\d+$/) {
578 ($noclear) || (print $clear_string);
579 print RED."Invalid Response ($response). Response must be a number.\n\n";
580 print RESET.$message;
584 } elsif ($responsetype =~/^email$/i) {
585 (defined($defaultresponse)) || ($defaultresponse='');
587 until ($response=~/.*\@.*\..*/) {
590 ($response) || ($response=$defaultresponse);
591 if ($response!~/.*\@.*\..*/) {
592 ($noclear) || (print $clear_string);
593 print RED."Invalid Response ($response). Response must be a valid email address.\n\n";
594 print RESET.$message;
598 } elsif ($responsetype =~/^PressEnter$/i) {
601 } elsif ($responsetype =~/^none$/i) {
604 # FIXME: There are a few places where we will get an undef as the
605 # response type. Should we thrown an exception here, or should we
606 # legitimize this usage and say "none" is the default if not specified?
607 #die "Illegal response type \"$responsetype\"";
618 Changes the display to show system output until the next showmessage call.
619 At the time of writing, this means using red text.
630 =head2 Subtasks of doing an installation
636 =item checkabortedinstall
640 Checks whether a previous installation process has been abnormally
641 aborted, by checking whether $etcidr/koha.conf is a symlink matching
642 a particular pattern. If an aborted installation is detected, give
643 the user a chance to abort, before trying to recover the aborted
646 FIXME: The recovery is not complete; it only partially rolls back
651 sub checkabortedinstall () {
652 if (-l("$etcdir/koha.conf")
653 && readlink("$etcdir/koha.conf") =~ /\.tmp$/
656 I have detected that you tried to install Koha before, but the installation
657 was aborted. I will try to continue, but there might be problems if the
658 database is already created.
661 print "Please press <ENTER> to continue: ";
664 # Remove the symlink after the <STDIN>, so the user can back out
665 unlink "$etcdir/koha.conf"
666 || die "Failed to remove incomplete $etcdir/koha.conf: $!\n";
671 =item checkperlmodules
675 Test whether the version of Perl is new enough, whether Perl is
676 found at the expected location, and whether all required modules
681 sub checkperlmodules {
683 # Test for Perl and Modules
686 my $message = getmessage('CheckingPerlModules');
687 showmessage($message, 'none');
689 unless ($] >= 5.006001) { # Bug 179
690 die getmessage('PerlVersionFailure', ['5.6.1']);
695 unless (eval {require DBI}) { push @missing,"DBI" };
696 unless (eval {require Date::Manip}) { push @missing,"Date::Manip" };
697 unless (eval {require DBD::mysql}) { push @missing,"DBD::mysql" };
698 unless (eval {require HTML::Template}) { push @missing,"HTML::Template" };
699 # unless (eval {require Set::Scalar}) { push @missing,"Set::Scalar" };
700 unless (eval {require Digest::MD5}) { push @missing,"Digest::MD5" };
701 unless (eval {require MARC::Record}) { push @missing,"MARC::Record" };
702 unless (eval {require Mail::Sendmail}) { push @missing,"Mail::Sendmail" };
703 unless (eval {require Event}) {
704 if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
705 push @missing, "Event";
708 unless (eval {require Net::Z3950}) {
709 showmessage(getmessage('NETZ3950Missing'), 'PressEnter', '', 1);
710 if ($#missing>=0) { # see above note
711 push @missing, "Net::Z3950";
716 # Print out a list of any missing modules
721 if (POSIX::setlocale(LC_ALL) != "C") {
722 $missing.=" export LC_ALL=C\n";
724 foreach my $module (@missing) {
725 $missing.=" perl -MCPAN -e 'install \"$module\"'\n";
727 my $message=getmessage('MissingPerlModules', [$missing]);
728 showmessage($message, 'none');
732 showmessage(getmessage('AllPerlModulesInstalled'), 'PressEnter', '', 1);
737 unless (-x "/usr/bin/perl") {
738 my $realperl=`which perl`;
740 $realperl = showmessage(getmessage('NoUsrBinPerl'), 'none');
741 until (-x $realperl) {
742 $realperl=showmessage(getmessage('AskLocationOfPerlExecutable', $realperl), 'free', $realperl, 1);
744 my $response=showmessage(getmessage('ConfirmPerlExecutableSymlink', $realperl), 'yn', 'y', 1);
745 unless ($response eq 'n') {
747 system("ln -s $realperl /usr/bin/perl");
754 $messages->{'NoUsrBinPerl'}->{en} =
755 heading('No /usr/bin/perl') . qq|
756 Koha expects to find the perl executable in the /usr/bin
757 directory. It is not there on your system.
761 $messages->{'AskLocationOfPerlExecutable'}->{en}=qq|Location of Perl Executable [%s]: |;
762 $messages->{'ConfirmPerlExecutableSymlink'}->{en}=qq|
763 Some Koha scripts will _not_ work without a symlink from %s to /usr/bin/perl
765 Most users should answer Y here.
767 May I try to create this symlink? ([Y]/N):|;
769 $messages->{'DirFailed'}->{en} = RED.qq|
770 We could not create %s, but continuing anyway...
776 =item getinstallationdirectories
778 getinstallationdirectories;
780 Get the various installation directories from the user, and then
781 create those directories (if they do not already exist).
783 These pieces of information are saved to global variables; the
784 function does not return any values.
788 sub getinstallationdirectories {
789 if (!$ENV{prefix}) { $ENV{prefix} = "/usr/local"; }
790 $opacdir = $ENV{prefix}.'/koha/opac';
791 $intranetdir = $ENV{prefix}.'/koha/intranet';
793 while ($getdirinfo) {
794 # Loop until opac directory and koha directory are different
795 my $message=getmessage('GetOpacDir', [$opacdir]);
796 $opacdir=showmessage($message, 'free', $opacdir);
798 $message=getmessage('GetIntranetDir', [$intranetdir]);
799 $intranetdir=showmessage($message, 'free', $intranetdir);
801 if ($intranetdir eq $opacdir) {
804 You must specify different directories for the OPAC and INTRANET files!
805 :: $intranetdir :: $opacdir ::
812 $kohalogdir=$ENV{prefix}.'/koha/log';
813 my $message=getmessage('GetKohaLogDir', [$kohalogdir]);
814 $kohalogdir=showmessage($message, 'free', $kohalogdir);
817 # FIXME: Need better error handling for all mkdir calls here
818 unless ( -d $intranetdir ) {
819 mkdir_parents (dirname($intranetdir), 0775) || print getmessage('DirFailed',['parents of '.$intranetdir]);
820 mkdir ($intranetdir, 0770) || print getmessage('DirFailed',[$intranetdir]);
821 if ($>==0) { chown (oct(0), (getgrnam($httpduser))[2], "$intranetdir"); }
822 chmod 0770, "$intranetdir";
824 mkdir_parents ("$intranetdir/htdocs", 0750);
825 mkdir_parents ("$intranetdir/cgi-bin", 0750);
826 mkdir_parents ("$intranetdir/modules", 0750);
827 mkdir_parents ("$intranetdir/scripts", 0750);
828 unless ( -d $opacdir ) {
829 mkdir_parents (dirname($opacdir), 0775) || print getmessage('DirFailed',['parents of '.$opacdir]);
830 mkdir ($opacdir, 0770) || print getmessage('DirFailed',[$opacdir]);
831 if ($>==0) { chown (oct(0), (getgrnam($httpduser))[2], "$opacdir"); }
832 chmod (oct(770), "$opacdir");
834 mkdir_parents ("$opacdir/htdocs", 0750);
835 mkdir_parents ("$opacdir/cgi-bin", 0750);
838 unless ( -d $kohalogdir ) {
839 mkdir_parents (dirname($kohalogdir), 0775) || print getmessage('DirFailed',['parents of '.$kohalogdir]);
840 mkdir ($kohalogdir, 0770) || print getmessage('DirFailed',[$kohalogdir]);
841 if ($>==0) { chown (oct(0), (getgrnam($httpduser))[2,3], "$kohalogdir"); }
842 chmod (oct(770), "$kohalogdir");
848 =item getdatabaseinfo
852 Get various pieces of information related to the Koha database:
853 the name of the database, the host on which the SQL server is
854 running, and the database user name.
856 These pieces of information are saved to global variables; the
857 function does not return any values.
861 $messages->{'DatabaseName'}->{en} = heading('Database Name') . qq|
862 Please provide the name that you wish to give your koha database.
863 It must not exist already on the database server.
865 Most users give a short single-word name for their library here.
867 Database name [%s]: |;
869 $messages->{'DatabaseHost'}->{en} = heading('Database Host') . qq|
870 Please provide the mysql server name. Unless the database is stored on
871 another machine, this should be "localhost".
873 Database host [%s]: |;
875 $messages->{'DatabaseUser'}->{en} = heading('Database User') . qq|
876 We are going to create a new mysql user for Koha. This user will have full administrative rights
877 to the database called %s when they connect from %s.
878 This is also the name of the Koha librarian superuser.
880 Most users give a single-word name here.
882 Database user [%s]: |;
884 $messages->{'DatabasePassword'}->{en} = heading('Database Password') . qq|
885 Please provide a good password for the user %s.
887 IMPORTANT: You can log in using this user and password at any time.
889 Password for database user %s: |;
891 $messages->{'BlankPassword'}->{en} = heading('BLANK PASSWORD') . qq|
892 You must not use a blank password for your MySQL user.
894 Press <ENTER> to try again:
897 sub getdatabaseinfo {
900 $hostname = 'localhost';
904 #Get the database name
906 my $message=getmessage('DatabaseName', [$dbname]);
907 $dbname=showmessage($message, 'free', $dbname);
909 #Get the hostname for the database
911 $message=getmessage('DatabaseHost', [$hostname]);
912 $hostname=showmessage($message, 'free', $hostname);
914 #Get the username for the database
916 $message=getmessage('DatabaseUser', [$dbname, $hostname, $user]);
917 $user=showmessage($message, 'free', $user);
919 #Get the password for the database user
921 while ($pass eq '') {
922 my $message=getmessage('DatabasePassword', [$user, $user]);
923 $pass=showmessage($message, 'free', $pass);
925 my $message=getmessage('BlankPassword');
926 showmessage($message,'PressEnter');
937 Get various pieces of information related to the Apache server:
938 the location of the configuration file and, if needed, the Unix
939 user that the Koha CGI will be run under.
941 These pieces of information are saved to global variables; the
942 function does not return any values.
946 $messages->{'FoundMultipleApacheConfFiles'}->{en} =
947 heading('MULTIPLE APACHE CONFIG FILES FOUND') . qq|
948 I found more than one possible Apache configuration file:
952 Enter number of the file to read [1]: |;
954 $messages->{'NoApacheConfFiles'}->{en} =
955 heading('NO APACHE CONFIG FILE FOUND') . qq|
956 I was not able to find your Apache configuration file.
958 The file is usually called httpd.conf, apache.conf or similar.
960 Please enter the full name, starting with /: |;
962 $messages->{'NotAFile'}->{en} = heading('FILE DOES NOT EXIST') . qq|
963 The file %s does not exist.
965 Please press <ENTER> to continue: |;
967 $messages->{'EnterApacheUser'}->{en} = heading('NEED APACHE USER') . qq\
968 The installer could not find the User setting in the Apache configuration file.
969 This is used to set up access permissions for
970 %s/koha.conf. This user should be set in one of the Apache configuration.
971 Please try to find it and enter the user name below. You might find
972 that "ps u|grep apache" will tell you. It probably is NOT "root".
974 Enter the Apache userid: \;
976 $messages->{'InvalidUserid'}->{en} = heading('INVALID USER') . qq|
977 The userid %s is not a valid userid on this system.
979 Press <ENTER> to continue: |;
982 my @confpossibilities;
984 foreach my $httpdconf (qw(/usr/local/apache/conf/httpd.conf
985 /usr/local/etc/apache/httpd.conf
986 /usr/local/etc/apache/apache.conf
987 /var/www/conf/httpd.conf
988 /etc/apache2/httpd.conf
989 /etc/apache2/apache2.conf
990 /etc/apache/conf/httpd.conf
991 /etc/apache/conf/apache.conf
992 /etc/apache-ssl/conf/apache.conf
993 /etc/apache-ssl/httpd.conf
994 /etc/httpd/conf/httpd.conf
995 /etc/httpd/httpd.conf
996 /etc/httpd/2.0/conf/httpd2.conf
998 if ( -f $httpdconf ) {
999 push @confpossibilities, $httpdconf;
1003 if ($#confpossibilities==-1) {
1004 my $message=getmessage('NoApacheConfFiles');
1007 until (-f $realhttpdconf) {
1008 $choice=showmessage($message, "free", 1);
1010 $realhttpdconf=$choice;
1012 showmessage(getmessage('NotAFile', [$choice]),'PressEnter', '', 1);
1015 } elsif ($#confpossibilities>0) {
1019 foreach (@confpossibilities) {
1020 $conffiles.=" $counter: $_\n";
1021 $options.="$counter";
1024 my $message=getmessage('FoundMultipleApacheConfFiles', [$conffiles]);
1025 my $choice=showmessage($message, "restrictchar $options", 1);
1026 $realhttpdconf=$confpossibilities[$choice-1];
1028 $realhttpdconf=$confpossibilities[0];
1030 unless (open (HTTPDCONF, "<$realhttpdconf")) {
1031 warn RED."Insufficient privileges to open $realhttpdconf for reading.\n";
1035 while (<HTTPDCONF>) {
1036 if (/^\s*User\s+"?([-\w]+)"?\s*$/) {
1042 unless (defined($httpduser)) {
1043 my $message=getmessage('EnterApacheUser', [$etcdir]);
1044 until (defined($httpduser) && length($httpduser) && getpwnam($httpduser)) {
1045 $httpduser=showmessage($message, "free", '');
1046 if (length($httpduser)>0) {
1047 unless (getpwnam($httpduser)) {
1048 my $message=getmessage('InvalidUserid', [$httpduser]);
1049 showmessage($message,'PressEnter');
1058 =item getapachevhostinfo
1062 Gets various pieces of information related to virtual hosting:
1063 the webmaster email address, virtual hostname, and the ports
1064 that the OPAC and INTRANET modules run on.
1066 These pieces of information are saved to global variables; the
1067 function does not return any values.
1071 $messages->{'ApacheConfigIntroduction'}->{en} =
1072 heading('APACHE CONFIGURATION') . qq|
1073 Koha needs to write an Apache configuration file for the
1074 OPAC and Librarian sites. By default this installer
1075 will do this by using one name and two different ports
1076 for the virtual hosts. There are other ways to set this up,
1077 and the installer will leave comments in
1078 %s/koha-httpd.conf about them.
1080 NOTE: You will need to add lines to your main httpd.conf to
1081 include %s/koha-httpd.conf
1082 and to make sure it is listening on the right ports
1083 (using the Listen directive).
1085 Press <ENTER> to continue: |;
1087 $messages->{'GetVirtualHostEmail'}->{en} =
1088 heading('WEB E-MAIL CONTACT') . qq|
1089 Enter the e-mail address to be used as a contact for Koha. This
1090 address is displayed if fatal errors are encountered.
1092 E-mail contact [%s]: |;
1094 $messages->{'GetServerName'}->{en} =
1095 heading('WEB HOST NAME OR IP ADDRESS') . qq|
1096 Please enter the host name or IP address that you wish to use for koha.
1097 Normally, this should be a name or IP that belongs to this machine.
1099 Host name or IP Address [%s]: |;
1101 $messages->{'GetOpacPort'}->{en} = heading('OPAC PORT') . qq|
1102 Please enter the port for your OPAC interface. This defaults to port 80, but
1103 if you are already serving web content with this hostname, you should change it
1104 to a different port (8000 might be a good choice, but check any firewalls).
1106 Enter the OPAC Port [%s]: |;
1108 $messages->{'GetIntranetPort'}->{en} =
1109 heading('LIBRARIAN PORT') . qq|
1110 Please enter the port for your Librarian interface. This must be different from
1113 Enter the Intranet Port [%s]: |;
1116 sub getapachevhostinfo {
1118 $svr_admin = "webmaster\@$domainname";
1119 $servername=`hostname`;
1124 showmessage(getmessage('ApacheConfigIntroduction',[$etcdir,$etcdir]), 'PressEnter');
1126 $svr_admin=showmessage(getmessage('GetVirtualHostEmail', [$svr_admin]), 'email', $svr_admin);
1127 $servername=showmessage(getmessage('GetServerName', [$servername]), 'free', $servername);
1130 $opacport=showmessage(getmessage('GetOpacPort', [$opacport]), 'numerical', $opacport);
1131 $intranetport=showmessage(getmessage('GetIntranetPort', [$opacport, $intranetport]), 'numerical', $intranetport);
1136 =item updateapacheconf
1140 Updates the Apache config file according to parameters previously
1141 specified by the user.
1143 It will append fully-commented directives at the end of the original
1144 Apache config file. The old config file is renamed with an extension
1147 If you need to uninstall Koha for any reason, the lines between
1149 # Ports to listen to for Koha
1151 and the block of comments beginning with
1153 # If you want to use name based Virtual Hosting:
1159 $messages->{'StartUpdateApache'}->{en} =
1160 heading('UPDATING APACHE CONFIGURATION') . qq|
1161 Checking for modules that need to be loaded...
1164 $messages->{'ApacheConfigMissingModules'}->{en} =
1165 heading('APACHE CONFIGURATION NEEDS UPDATE') . qq|
1166 Koha uses the mod_env and mod_include apache features, but the
1167 installer did not find them in your config. Please
1168 make sure that they are enabled for your Koha site.
1170 Press <ENTER> to continue: |;
1173 $messages->{'ApacheAlreadyConfigured'}->{en} =
1174 heading('APACHE ALREADY CONFIGURED') . qq|
1175 %s appears to already have an entry for Koha. You may need to edit %s
1176 if anything has changed since it was last set up. This
1177 script will not attempt to modify an existing Koha apache
1180 Press <ENTER> to continue: |;
1182 sub updateapacheconf {
1183 my $logfiledir=$kohalogdir;
1184 my $httpdconf = $etcdir."/koha-httpd.conf";
1186 showmessage(getmessage('StartUpdateApache'), 'none');
1187 # to be polite about it: I don't think this should touch the main httpd.conf
1189 # QUESTION: Should we warn for includes_module too?
1191 my $includesmodule=0;
1192 open HC, "<$realhttpdconf";
1194 if (/^\s*#\s*LoadModule env_module /) {
1195 showmessage(getmessage('ApacheConfigMissingModules'));
1198 if (/\s*LoadModule includes_module / ) {
1204 if (`grep -q 'VirtualHost $servername' "$httpdconf" 2>/dev/null`) {
1205 showmessage(getmessage('ApacheAlreadyConfigured', [$httpdconf, $httpdconf]), 'PressEnter');
1208 my $includesdirectives='';
1209 if ($includesmodule) {
1210 $includesdirectives.="Options +Includes\n";
1211 $includesdirectives.=" AddHandler server-parsed .html\n";
1213 open(SITE,">$httpdconf") or warn "Insufficient priveleges to open $httpdconf for writing.\n";
1214 my $opaclisten = '';
1215 if ($opacport != 80) {
1216 $opaclisten="Listen $opacport";
1218 my $intranetlisten = '';
1219 if ($intranetport != 80) {
1220 $intranetlisten="Listen $intranetport";
1224 # Ports to listen to for Koha
1225 # uncomment these if they aren't already in main httpd.conf
1229 # NameVirtualHost is used by one of the optional configurations detailed below
1231 #NameVirtualHost 11.22.33.44
1233 # KOHA's OPAC Configuration
1234 <VirtualHost $servername\:$opacport>
1235 ServerAdmin $svr_admin
1236 DocumentRoot $opacdir/htdocs
1237 ServerName $servername
1238 ScriptAlias /cgi-bin/koha/ $opacdir/cgi-bin/
1239 ErrorLog $logfiledir/opac-error_log
1240 TransferLog $logfiledir/opac-access_log
1241 SetEnv PERL5LIB "$intranetdir/modules"
1242 SetEnv KOHA_CONF "$etcdir/koha.conf"
1246 # KOHA's INTRANET Configuration
1247 <VirtualHost $servername\:$intranetport>
1248 ServerAdmin $svr_admin
1249 DocumentRoot $intranetdir/htdocs
1250 ServerName $servername
1251 ScriptAlias /cgi-bin/koha/ "$intranetdir/cgi-bin/"
1252 ErrorLog $logfiledir/koha-error_log
1253 TransferLog $logfiledir/koha-access_log
1254 SetEnv PERL5LIB "$intranetdir/modules"
1255 SetEnv KOHA_CONF "$etcdir/koha.conf"
1259 # If you want to use name based Virtual Hosting:
1260 # 1. remove the two Listen lines
1261 # 2. replace $servername\:$opacport wih your.opac.domain.name
1262 # 3. replace ServerName $servername wih ServerName your.opac.domain.name
1263 # 4. replace $servername\:$intranetport wih your intranet domain name
1264 # 5. replace ServerName $servername wih ServerName your.intranet.domain.name
1266 # If you want to use NameVirtualHost'ing (using two names on one ip address):
1267 # 1. Follow steps 1-5 above
1268 # 2. Uncomment the NameVirtualHost line and set the correct ip address
1277 =item basicauthentication
1279 basicauthentication;
1281 Asks the user whether HTTP basic authentication is wanted, and,
1282 if so, the user name and password for the basic authentication.
1284 These pieces of information are saved to global variables; the
1285 function does not return any values.
1289 $messages->{'IntranetAuthenticationQuestion'}->{en} =
1290 heading('LIBRARIAN AUTHENTICATION') . qq|
1291 The Librarian site can be password protected using
1292 Apache's Basic Authorization instead of Koha user details.
1294 This method going to be phased out very soon. Most users should answer N here.
1296 Would you like to do this (Y/[N]): |; #'
1298 $messages->{'BasicAuthUsername'}->{en}="Please enter a username for librarian access [%s]: ";
1299 $messages->{'BasicAuthPassword'}->{en}="Please enter a password for %s: ";
1300 $messages->{'BasicAuthPasswordWasBlank'}->{en}="\nYou cannot use a blank password!\n\n";
1302 sub basicauthentication {
1303 my $message=getmessage('IntranetAuthenticationQuestion');
1304 my $answer=showmessage($message, 'yn', 'n');
1305 my $httpdconf = $etcdir."/koha-httpd.conf";
1307 my $apacheauthusername='librarian';
1308 my $apacheauthpassword='';
1309 if ($answer=~/^y/i) {
1310 ($apacheauthusername) = showmessage(getmessage('BasicAuthUsername', [ $apacheauthusername]), 'free', $apacheauthusername, 1);
1311 $apacheauthusername=~s/[^a-zA-Z0-9]//g;
1312 while (! $apacheauthpassword) {
1313 ($apacheauthpassword) = showmessage(getmessage('BasicAuthPassword', [ $apacheauthusername]), 'free', 1);
1314 if (!$apacheauthpassword) {
1315 ($apacheauthpassword) = showmessage(getmessage('BasicAuthPasswordWasBlank'), 'none', '', 1);
1318 open AUTH, ">$etcdir/kohaintranet.pass";
1319 my $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
1320 my $salt=substr($chars, int(rand(length($chars))),1);
1321 $salt.=substr($chars, int(rand(length($chars))),1);
1322 print AUTH $apacheauthusername.":".crypt($apacheauthpassword, $salt)."\n";
1324 open(SITE,">>$httpdconf") or warn "Insufficient priveleges to open $realhttpdconf for writing.\n";
1327 <Directory $intranetdir>
1328 AuthUserFile $etcdir/kohaintranet.pass
1330 AuthName "Koha Intranet (for librarians only)"
1343 Install the Koha files to the specified OPAC and INTRANET
1344 directories (usually in /usr/local/koha).
1346 The koha.conf file is created, but as koha.conf.tmp. The
1347 caller is responsible for calling finalizeconfigfile when
1348 installation is completed, to rename it back to koha.conf.
1352 $messages->{'InstallFiles'}->{en} = heading('INSTALLING FILES') . qq|
1353 Copying files to installation directories:
1358 $messages->{'CopyingFiles'}->{en}="Copying %s to %s.\n";
1364 #MJR: preserve old files, just in case
1371 print getmessage('CopyingFiles', ["old ".$desc,$tgt.".old"]);
1373 system("mv ".$tgt." ".$tgt.".old");
1376 print getmessage('CopyingFiles', [$desc,$tgt]);
1378 system("cp -R ".$src." ".$tgt);
1381 showmessage(getmessage('InstallFiles'),'none');
1383 neatcopy("admin templates", 'intranet-html', "$intranetdir/htdocs");
1384 neatcopy("admin interface", 'intranet-cgi', "$intranetdir/cgi-bin");
1385 neatcopy("main scripts", 'scripts', "$intranetdir/scripts");
1386 neatcopy("perl modules", 'modules', "$intranetdir/modules");
1387 neatcopy("OPAC templates", 'opac-html', "$opacdir/htdocs");
1388 neatcopy("OPAC interface", 'opac-cgi', "$opacdir/cgi-bin");
1390 system("touch $opacdir/cgi-bin/opac");
1392 #MJR: is this necessary?
1394 system("chown -R $httpduser:$httpduser $opacdir $intranetdir");
1396 system("chmod -R a+rx $opacdir $intranetdir");
1398 # Create /etc/koha.conf
1400 my $old_umask = umask(027); # make sure koha.conf is never world-readable
1401 open(SITES,">$etcdir/koha.conf.tmp") or warn "Couldn't create file at $etcdir. Must have write capability.\n";
1407 includes=$opacdir/htdocs/includes
1408 intranetdir=$intranetdir
1410 kohalogdir=$kohalogdir
1411 kohaversion=$kohaversion
1412 httpduser=$httpduser
1413 intrahtdocs=$intranetdir/htdocs/intranet-tmpl
1414 opachtdocs=$opacdir/htdocs/opac-tmpl
1420 #MJR: can't help but this be broken, can we?
1421 chmod 0440, "$etcdir/koha.conf.tmp";
1423 #MJR: does this contain any passwords?
1424 chmod 0755, "$intranetdir/scripts/z3950daemon/z3950-daemon-launch.sh", "$intranetdir/scripts/z3950daemon/z3950-daemon-shell.sh", "$intranetdir/scripts/z3950daemon/processz3950queue";
1426 #MJR: generate our own settings, to remove the /home/paul hardwired links
1427 open(FILE,">$intranetdir/scripts/z3950daemon/z3950-daemon-options");
1428 print FILE "RunAsUser=apache\nKohaZ3950Dir=$intranetdir/scripts/z3950daemon\nKohaModuleDir=$intranetdir/modules\nLogDir=$kohalogdir\nKohaConf=$etcdir/koha.conf";
1432 chown((getpwnam($httpduser)) [2,3], "$etcdir/koha.conf.tmp") or warn "can't chown koha.conf: $!";
1433 chown(0, (getpwnam($httpduser)) [3], "$intranetdir/scripts/z3950daemon/z3950-daemon-shell.sh") or warn "can't chown $intranetdir/scripts/z3950daemon/z3950-daemon-shell.sh: $!";
1434 chown(0, (getpwnam($httpduser)) [3], "$intranetdir/scripts/z3950daemon/processz3950queue") or warn "can't chown $intranetdir/scripts/z3950daemon/processz3950queue: $!";
1435 } #MJR: FIXME: Should report that we haven't chown()d.
1443 Finds out where the MySQL utitlities are located in the system,
1444 then create the Koha database structure and MySQL permissions.
1448 $messages->{'MysqlRootPassword'}->{en} =
1449 heading('MYSQL ROOT USER PASSWORD') . qq|
1450 To create the koha database, please enter your
1451 mysql server's root user password:
1455 $messages->{'CreatingDatabase'}->{en} = heading('CREATING DATABASE') . qq|
1456 Creating the MySQL database for Koha...
1460 $messages->{'CreatingDatabaseError'}->{en} =
1461 heading('ERROR CREATING DATABASE') . qq|
1462 Couldn't connect to the MySQL server for the reason given above.
1463 This is a serious problem, the database will not get installed.
1465 Press <ENTER> to continue: |; #'
1467 $messages->{'SampleData'}->{en} = heading('SAMPLE DATA') . qq|
1468 If you are installing Koha for evaluation purposes,
1469 you can install some sample data now.
1471 If you are installing Koha to use your own
1472 data, you probably don't want this sample data installed.
1474 Would you like to install the sample data? Y/[N]: |; #'
1476 $messages->{'SampleDataInstalled'}->{en} =
1477 heading('SAMPLE DATA INSTALLED') . qq|
1478 Sample data has been installed. For some suggestions on testing Koha, please
1479 read the file doc/HOWTO-Testing. If you find any bugs, please submit them at
1480 http://bugs.koha.org/. If you need help with testing Koha, you can post a
1481 question through the koha-devel mailing list, or you can check for a developer
1482 online at irc.katipo.co.nz:6667 channel #koha.
1484 You can find instructions for subscribing to the Koha mailing lists at:
1489 Press <ENTER> to continue: |;
1491 $messages->{'AddBranchPrinter'}->{en} = heading('Add Branch and Printer') . qq|
1492 Would you like to describe an initial branch and printer? [Y]/N: |;
1494 $messages->{'BranchName'}->{en}="Branch Name [%s]: ";
1495 $messages->{'BranchCode'}->{en}="Branch Code (4 letters or numbers) [%s]: ";
1496 $messages->{'PrinterQueue'}->{en}="Printer Queue [%s]: ";
1497 $messages->{'PrinterName'}->{en}="Printer Name [%s]: ";
1500 $mysqluser = 'root';
1503 foreach my $mysql (qw(/usr/local/mysql
1507 if ( -d $mysql && -f "$mysql/bin/mysqladmin") {
1512 print "I don't see mysql in the usual places.\n";
1514 print "Where have you installed mysql? ";
1515 chomp($mysqldir = <STDIN>);
1516 last if -f "$mysqldir/bin/mysqladmin";
1519 I can't find it there either. If you compiled mysql yourself,
1520 please give the value of --prefix when you ran configure.
1522 The file mysqladmin should be in bin/mysqladmin under the directory that you
1529 # we must not put the mysql root password on the command line
1530 $mysqlpass= showmessage(getmessage('MysqlRootPassword'),'silentfree');
1532 showmessage(getmessage('CreatingDatabase'),'none');
1534 setmysqlclipass($mysqlpass);
1535 # Set up permissions
1537 print system("$mysqldir/bin/mysql -u$mysqluser mysql -e \"insert into user (Host,User,Password) values ('$hostname','$user',password('$pass'))\"\;");
1538 system("$mysqldir/bin/mysql -u$mysqluser mysql -e \"insert into db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv, index_priv, alter_priv) values ('%','$dbname','$user','Y','Y','Y','Y','Y','Y','Y','Y')\"");
1539 system("$mysqldir/bin/mysqladmin -u$mysqluser reload");
1540 # Change to admin user login
1541 setmysqlclipass($pass);
1542 my $result=system("$mysqldir/bin/mysqladmin", "-u$user", "create", "$dbname");
1544 showmessage(getmessage('CreatingDatabaseError'),'PressEnter', '', 1);
1546 # Create the database structure
1548 system("$mysqldir/bin/mysql -u$user $dbname < koha.mysql");
1554 =item updatedatabase
1558 Updates the Koha database structure, including the addition of
1561 The MARC tables are also populated in addition to being created.
1563 Because updatedatabase calls scripts/updater/updatedatabase to
1564 do the actual update, and that script uses C4::Context,
1565 $etcdir/koha.conf must exist at this point. We use the KOHA_CONF
1566 environment variable to do this.
1568 FIXME: (See checkabortedinstall as it depends on old symlink way.)
1572 $messages->{'UpdateMarcTables'}->{en} =
1573 heading('MARC FIELD DEFINITIONS') . qq|
1574 You can import MARC settings for:
1580 NOTE: If you choose N,
1581 nothing will be added, and you must create them all yourself.
1582 Only choose N if you want to use a MARC format not listed here,
1583 such as DANMARC. We would like to hear from you if you do.
1585 Choose MARC definition [1]: |;
1587 $messages->{'Language'}->{en} = heading('CHOOSE LANGUAGE') . qq|
1588 This version of koha supports a few languages.
1590 en : default language, all pages available
1591 fr : complete translation (except pictures)
1592 es : partial librarian site translation (including pictures)
1593 pl : complete OPAC and partial librarian translation
1594 zh_TW : partial translation
1596 en is used when a screen is not available in your language
1598 If you specify a language here, you can still
1599 change it from the system preferences screen in the librarian sit.
1601 Which language do you choose? |;
1603 sub updatedatabase {
1604 # At this point, $etcdir/koha.conf must exist, for C4::Context
1605 $ENV{"KOHA_CONF"}=$etcdir.'/koha.conf.tmp';
1607 my $result=system ("perl -I $intranetdir/modules scripts/updater/updatedatabase");
1610 print "Problem updating database...\n";
1614 my $response=showmessage(getmessage('UpdateMarcTables'), 'restrictchar 12N', '1');
1617 if ($response eq '1') {
1618 system("cat scripts/misc/marc_datas/marc21_en/structure_def.sql | $mysqldir/bin/mysql -u$user $dbname");
1620 if ($response eq '2') {
1621 system("cat scripts/misc/marc_datas/unimarc_fr/structure_def.sql | $mysqldir/bin/mysql -u$user $dbname");
1622 system("cat scripts/misc/lang-datas/fr/stopwords.sql | $mysqldir/bin/mysql -u$user $dbname");
1624 delete($ENV{"KOHA_CONF"});
1626 print RESET."\n\nFinished updating of database. Press <ENTER> to continue...";
1631 =item populatedatabase
1635 Populate the non-MARC tables. If the user wants to install the
1636 sample data, install them.
1640 sub populatedatabase {
1641 # my $response=showmessage(getmessage('SampleData'), 'yn', 'n');
1642 # if ($response =~/^y/i) {
1644 # FIXME: These calls are now unsafe and should either be removed
1645 # or updated to use -u$user and no mysqlpass_quoted
1647 # system("gunzip -d < sampledata-1.2.gz | $mysqldir/bin/mysql -u$mysqluser $mysqlpass_quoted $dbname");
1648 # system("$mysqldir/bin/mysql -u$mysqluser $mysqlpass_quoted $dbname -e \"insert into branches (branchcode,branchname,issuing) values ('MAIN', 'Main Library', 1)\"");
1649 # system("$mysqldir/bin/mysql -u$mysqluser $mysqlpass_quoted $dbname -e \"insert into branchrelations (branchcode,categorycode) values ('MAIN', 'IS')\"");
1650 # system("$mysqldir/bin/mysql -u$mysqluser $mysqlpass_quoted $dbname -e \"insert into branchrelations (branchcode,categorycode) values ('MAIN', 'CU')\"");
1651 # system("$mysqldir/bin/mysql -u$mysqluser $mysqlpass_quoted $dbname -e \"insert into printers (printername,printqueue,printtype) values ('Circulation Desk Printer', 'lp', 'hp')\"");
1652 # showmessage(getmessage('SampleDataInstalled'), 'PressEnter','',1);
1655 my $response=showmessage(getmessage('AddBranchPrinter'), 'yn', 'y');
1657 unless ($response =~/^n/i) {
1658 my $branch='Main Library';
1659 $branch=showmessage(getmessage('BranchName', [$branch]), 'free', $branch, 1);
1660 $branch=~s/[^A-Za-z0-9\s]//g;
1662 my $branchcode=$branch;
1663 $branchcode=~s/[^A-Za-z0-9]//g;
1664 $branchcode=uc($branchcode);
1665 $branchcode=substr($branchcode,0,4);
1666 $branchcode=showmessage(getmessage('BranchCode', [$branchcode]), 'free', $branchcode, 1);
1667 $branchcode=~s/[^A-Za-z0-9]//g;
1668 $branchcode=uc($branchcode);
1669 $branchcode=substr($branchcode,0,4);
1670 $branchcode or $branchcode='DEF';
1673 system("$mysqldir/bin/mysql -u$user $dbname -e \"insert into branches (branchcode,branchname,issuing) values ('$branchcode', '$branch', 1)\"");
1674 system("$mysqldir/bin/mysql -u$user $dbname -e \"insert into branchrelations (branchcode,categorycode) values ('MAIN', 'IS')\"");
1675 system("$mysqldir/bin/mysql -u$user $dbname -e \"insert into branchrelations (branchcode,categorycode) values ('MAIN', 'CU')\"");
1677 my $printername='Library Printer';
1678 $printername=showmessage(getmessage('PrinterName', [$printername]), 'free', $printername, 1);
1679 $printername=~s/[^A-Za-z0-9\s]//g;
1681 my $printerqueue='lp';
1682 $printerqueue=showmessage(getmessage('PrinterQueue', [$printerqueue]), 'free', $printerqueue, 1);
1683 $printerqueue=~s/[^A-Za-z0-9]//g;
1685 system("$mysqldir/bin/mysql -u$user $dbname -e \"insert into printers (printername,printqueue,printtype) values ('$printername', '$printerqueue', '')\"");
1687 my $language=showmessage(getmessage('Language'), 'free', 'en');
1689 system("$mysqldir/bin/mysql -u$user $dbname -e \"update systempreferences set value='$language' where variable='opaclanguages'\"");
1698 Asks the user whether to restart Apache, and restart it if the user
1701 FIXME: If the installer does not know how to restart the Apache
1702 server (e.g., if the user is not actually using Apache), it still
1707 $messages->{'RestartApache'}->{en} = heading('RESTART APACHE') . qq|
1708 Apache needs to be restarted to load the new configuration for Koha.
1709 This requires the root password.
1711 Would you like to try to restart Apache now? [Y]/N: |;
1715 my $response=showmessage(getmessage('RestartApache'), 'yn', 'y');
1719 unless ($response=~/^n/i) {
1721 # Need to support other init structures here?
1722 if (-e "/etc/rc.d/init.d/httpd") {
1723 system('su root -c /etc/rc.d/init.d/httpd restart');
1724 } elsif (-e "/etc/init.d/apache") {
1725 system('su root -c /etc/init.d/apache restart');
1726 } elsif (-e "/etc/init.d/apache-ssl") {
1727 system('su root -c /etc/init.d/apache-ssl restart');
1734 =item finalizeconfigfile
1738 This function must be called when the installation is complete,
1739 to rename the koha.conf.tmp file to koha.conf.
1741 Currently, failure to rename the file results only in a warning.
1745 sub finalizeconfigfile {
1747 rename "$etcdir/koha.conf.tmp", "$etcdir/koha.conf"
1748 || showmessage(<<EOF, 'PressEnter', undef, 1);
1749 An unexpected error, $!, occurred
1750 while the Koha config file is being saved to its final location,
1753 Couldn't rename file at $etcdir. Must have write capability.
1755 Press Enter to continue.
1761 =item loadconfigfile
1765 Open the existing koha.conf file and get its values,
1766 saving the values to some global variables.
1768 If the existing koha.conf file cannot be opened for any reason,
1769 the file is silently ignored.
1773 sub loadconfigfile {
1776 #MJR: reverted to r1.53. Please call setetcdir(). Do NOT hardcode this.
1777 open (KC, "<$etcdir/koha.conf");
1780 (next) if (/^\s*#/);
1781 if (/(.*)\s*=\s*(.*)/) {
1784 # Clean up white space at beginning and end
1785 $variable=~s/^\s*//g;
1786 $variable=~s/\s*$//g;
1789 $configfile{$variable}=$value;
1793 $::intranetdir=$configfile{'intranetdir'};
1794 $::opacdir=$configfile{'opacdir'};
1795 $::kohaversion=$configfile{'kohaversion'};
1796 $::kohalogdir=$configfile{'kohalogdir'};
1797 $::database=$configfile{'database'};
1798 $::hostname=$configfile{'hostname'};
1799 $::user=$configfile{'user'};
1800 $::pass=$configfile{'pass'};
1803 END { } # module clean-up code here (global destructor)
1805 ### These things may move
1809 my $t = POSIX::Termios->new;
1813 $t->setlflag(($t->getlflag) | &POSIX::ECHO);
1816 $t->setlflag(($t->getlflag) & !(&POSIX::ECHO));
1821 sub setmysqlclipass {
1823 open(MYCNF,">$mycnf");
1825 print MYCNF "[client]\npassword=$pass\n";
1831 rename $mycnf,$mytmpcnf;
1840 rename $mytmpcnf,$mycnf;