-package Install; #assumes Install.pm
-
-
-# Copyright 2000-2002 Katipo Communications
-# Contains parts Copyright 2003-4 MJ Ray
-#
-# This file is part of Koha.
-#
-# Koha is free software; you can redistribute it and/or modify it under the
-# terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at your option) any later
-# version.
-#
-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
-# Suite 330, Boston, MA 02111-1307 USA
-#
-# Current maintainer MJR slef at users.sourceforge.net
-
-use strict;
-use POSIX;
-#MJR: everyone will have these modules, right?
-# They look like part of perl core to me
-use Term::ANSIColor qw(:constants);
-use Text::Wrap;
-use File::Temp qw/ :mktemp /;
-require Exporter;
-
-use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
-
-=head1 NAME
-
-Install.pm - Perl module containing the bulk of the installation logic
-
-=head1 DESCRIPTION
-
-The Install.pm module contains the bulk
-of the code to do installation;
-this code is used by installer.pl
-to perform an actual installation.
-
-=head2 Internal variables
-
-=over 4
-
-=item $VERSION, @ISA, @EXPORT
-
-Defines the version and structure of the module interface
-
-=cut
-
-# set the version for version checking
-# set the version for version checking
-$VERSION = do { my @v = '$Revision$' =~ /\d+/g; shift(@v) . "." . join( "_", map { sprintf "%03d", $_ } @v ); };
-
-@ISA = qw(Exporter);
-@EXPORT = qw(
- &read_autoinstall_file
- &checkperlmodules
- &checkabortedinstall
- &getmessage
- &showmessage
- &completeupgrade
- &releasecandidatewarning
- &getinstallationdirectories
- &getdatabaseinfo
- &getapacheinfo
- &getapachevhostinfo
- &updateapacheconf
- &basicauthentication
- &installfiles
- &databasesetup
- &updatedatabase
- &populatedatabase
- &restartapache
- &backupkoha
- &finalizeconfigfile
- &loadconfigfile
- &backupmycnf
- &restoremycnf
- );
-
-=item $kohaversion, $newversion, $language, $clear_string
-
-Installer setting details
-
-=item $etcdir, $intranetdir, $opacdir, $kohalogdir
-
-Directories to use for installation (configuration, intranet, opac, logs)
-
-=item $domainname, $realhttpdconf, $httpduser, $httpdgroup, $servername, $svr_admin, $opacport, $intranetport, $hostname, $user, $pass
-
-Apache configuration settings
-
-=item $mysqldir, $database, $mysqluser, $mysqlpass, $mycnf, $mytmpcnf
-
-MySQL configuration settings
-
-=cut
-
-use vars qw( $kohaversion $newversion $language
- $etcdir $intranetdir $opacdir $kohalogdir
- $domainname $realhttpdconf $httpduser $httpdgroup
- $servername $svr_admin $opacport $intranetport
- $hostname $user $pass
- $mysqldir $database $mysqluser $mysqlpass );
-
-my $clear_string = "\n\n"; #MJR: was $terminal->Tputs('cl');
-
-my $mycnf = $ENV{HOME}."/.my.cnf";
-my $mytmpcnf = mktemp("my.cnf.koha.XXXXXX");
-chomp($mytmpcnf);
-
-=back
-
-=head2 Internal functions (not meant to be used outside of Install.pm)
-
-=over 4
-
-=item C<heading($)>
-
-Takes: a string to be displayed as the heading
-
-Returns: a formatted heading (currently with ANSI colours).
-
-This reduces the likelihood of pod2man(1) etc. misinterpreting
-a line of equal signs as illegal POD directives.
-
-=cut
-
-sub heading ($) {
- my $title = shift;
- my $bal = 5;
- return($clear_string.ON_BLUE.WHITE.BOLD." "x$bal.uc($title)." "x$bal.RESET."\n\n");
-}
-
-my $messages;
-$messages->{'continuing'}->{en}="Great! Continuing...\n\n";
-$messages->{'WelcomeToKohaInstaller'}->{en} =
- heading('Welcome to the Koha Installer') . qq|
-This program will ask some questions and try to install koha for you.
-You need to know: where most koha files should be stored (you can set
-the prefix environment variable for this); the username and password of
-a mysql superuser; and details of your library setup. You may also need
-to know details of your Apache setup.
-
-If you want to install the Koha configuration files somewhere other than
-/etc (for installing not as root, or to have many Kohas on one system, for example), you should
-set the etcdir environment variable. Please look at your manuals for
-details of how to set that.
-
-Recommended answers are given in brackets after each question. To accept
-the default value for any question (indicated by []), simply hit Enter
-at the prompt.
-
-Note that you also can define an auto_install_file, that will answer every question automatically.
-To use this feature, run ./installer.pl -i /path/to/auto_install_file
-
-Are you ready to begin the installation? ([Y]/N): |;
-
-$messages->{'WelcomeToUpgrader'}->{en} =
- heading('Welcome to the Koha Upgrader') . qq|
-You are attempting to upgrade from Koha %s to Koha %s.
-
-We recommend that you do a complete backup of all your files before upgrading.
-This upgrade script will make a backup copy of your files for you.
-
-Would you like to proceed? (Y/[N]):|;
-
-$messages->{'AbortingInstall'}->{en} =
- heading('ABORTING') . qq|
-Aborting as requested. Please rerun when you are ready.
-|;
-
-$messages->{'ReleaseCandidateWarning'}->{en} =
- heading('RELEASE CANDIDATE') . qq|
-WARNING: You are about to install Koha version %s. This is a
-release candidate, It is NOT bugfree.
-However, it works, and has been declared stable enough to
-be released.
-
-Most people should answer Yes here.
-
-Are you sure you want to install Koha %s? (Y/[N]): |;
-$messages->{'WatchForReleaseAnnouncements'}->{en}=qq|
-
-Watch for announcements of Koha releases on the Koha mailing list or the Koha
-web site (http://www.koha.org/).
-
-|;
-
-$messages->{'NETZ3950Missing'}->{en}=qq|
-
-The Net::Z3950 module is missing. This module is necessary if you want to use
-Koha's Z39.50 client to download bibliographic records from other libraries.
-
-To install this module, you will need the yaz client installed from
-http://www.indexdata.dk/yaz/ and then you can install the perl module with the
-command:
-
-perl -MCPAN -e 'install Net::Z3950'
-
-...or by installing packages for your distribution, if available.
-
-IMPORTANT NOTE : If you use Perl 5.8.0, you might need to
-edit NET::Z3950's Makefile.PL and yazwrap/Makefile.PL to include:
-
- 'DEFINE' => '-D_GNU_SOURCE',
-
-Also note that some installations of Perl on Red Hat will generate a lot of
-"'my_perl' undeclared" errors when running make in Net-Z3950. This is fixed by
-inserting in yazwrap/ywpriv.h a line saying #include "XSUB.h"
-
-Press the <ENTER> key to continue: |; #'
-
-$messages->{'CheckingPerlModules'}->{en} = heading('PERL MODULES') . qq|
-Checking perl modules ...
-|;
-
-$messages->{'PerlVersionFailure'}->{en}="Sorry, you need at least Perl %s\n";
-
-$messages->{'MissingPerlModules'}->{en} = heading('MISSING PERL MODULES') . qq|
-You are missing some Perl modules required by Koha.
-Please run this again after installing them.
-They may be installed by finding packages from your operating system supplier, or running (as root) the following commands:
-
-%s
-|;
-
-$messages->{'AllPerlModulesInstalled'}->{en} =
- heading('PERL MODULES AVAILABLE') . qq|
-All required perl modules are installed.
-
-Press <ENTER> to continue: |;
-$messages->{'KohaVersionInstalled'}->{en}="You currently have Koha %s on your system.";
-$messages->{'KohaUnknownVersionInstalled'}->{en}="I am not able to determine what version of Koha is installed now.";
-$messages->{'KohaAlreadyInstalled'}->{en} =
- heading('Koha already installed') . qq|
-It looks like Koha is already installed on your system (%s/koha.conf exists).
-If you would like to upgrade your system to %s, please use
-the koha.upgrade script in this directory.
-
-%s
-
-|;
-$messages->{'GetOpacDir'}->{en} = heading('OPAC DIRECTORY') . qq|
-Please supply the directory you want Koha to store its OPAC files in. This
-directory will be auto-created for you if it doesn't exist.
-
-OPAC Directory [%s]: |; #'
-
-$messages->{'GetIntranetDir'}->{en} =
- heading('LIBRARIAN DIRECTORY') . qq|
-Please supply the directory you want Koha to store its Librarian interface
-files in. This directory will be auto-created for you if it doesn't exist.
-
-Intranet Directory [%s]: |; #'
-
-$messages->{'GetKohaLogDir'}->{en} = heading('LOG DIRECTORY') . qq|
-Specify a directory where log files will be written.
-
-Koha Log Directory [%s]: |;
-
-$messages->{'AuthenticationWarning'}->{en} = heading('Authentication') . qq|
-This release of Koha has a new authentication module.
-You will be required to log in to
-access some features.
-
-IMPORTANT: You can log in using the userid and password from the %s/koha.conf configuration file at any time.
-Use the "Members" screen to add passwords for other accounts and set their flags.
-
-Press the <ENTER> key to continue: |;
-
-$messages->{'Completed'}->{en} = heading('INSTALLATION COMPLETE') . qq|
-Congratulations ... your Koha installation is complete!
-
-You will be able to connect to your Librarian interface at:
-
- http://%s\:%s/
-
- use the koha admin mysql login and password to connect to this interface.
-and the OPAC interface at:
-
- http://%s\:%s/
-
-NOTE: You need to add lines to your main httpd.conf to include
-/etc/koha-httpd.conf and to make sure it is listening on the right ports
-(using the Listen directive). Then, restart Apache.
-
-Please read the Hints file and visit http://www.koha.org (in english) or www.koha-fr.org (in french)
-Press <ENTER> to exit the installer: |;
-
-$messages->{'UpgradeCompleted'}->{en} = heading('UPGRADE COMPLETE') . qq|
-Congratulations ... your Koha upgrade is finished!
-
-Please report any problems you encounter through http://bugs.koha.org/
-
-Press <ENTER> to exit the installer: |;
-
-#'
-
-=item C<completeupgrade()>
-
-Display a message describing what may need changing in httpd.conf
-and any other instructions for just before exit.
-
-=cut
-
-sub completeupgrade {
- showmessage(getmessage('UpgradeCompleted',[$intranetdir,$intranetdir,$intranetdir,$opacdir,$opacdir,$intranetdir]),'PressEnter');
-}
-
-=item C<releasecandidatewarning()>
-
-Display a warning about upgrading to a public test release.
-
-=cut
-
-sub releasecandidatewarning {
- my $message=getmessage('ReleaseCandidateWarning', [$newversion, $newversion]);
- my $answer=showmessage($message, 'yn', 'n');
-
- if ($answer =~ /y/i) {
- print getmessage('continuing');
- } else {
- my $message=getmessage('WatchForReleaseAnnouncements');
- print $message."\n";
- exit;
- };
-}
-
-=item C<read_autoinstall_file($)>
-
-Takes: a configuration file describing the installation
-
-Returns: a hashref of the configuration
-
-=cut
-
-sub read_autoinstall_file
-{
- my $fname = shift; # Config file to read
- my $retval = {}; # Return value: ref-to-hash holding the
- # configuration
-
- open (CONF, $fname) or return undef;
-
- while (<CONF>)
- {
- my $var; # Variable name
- my $value; # Variable value
-
- chomp;
- s/#.*//; # Strip comments
- next if /^\s*$/; # Ignore blank lines
-
- # Look for a line of the form
- # var = value
- if (!/^\s*(\w+)\s*=\s*(.*?)\s*$/)
- {
- next;
- }
-
- # Found a variable assignment
- # variable that was already set.
- $var = $1;
- $value = $2;
- $retval->{$var} = $value;
- }
- close CONF;
- if ($retval->{MysqlRootPassword} eq "XXX") {
- print "ERROR : the root password is XXX. It is NOT valid. Edit your auto_install_file\n";
- }
- return $retval;
-}
-
-=back
-
-=head2 Accessor functions (for installer.pl)
-
-=over 4
-
-=item C<setlanguage($)>
-
-Sets the installation language code, normally "en" (English).
-Only "en" is supported so far.
-
-=cut
-
-sub setlanguage ($) {
- ($language) = @_;
-}
-
-=item C<setdomainname($)>
-
-Sets the domain name of the host.
-
-The domain name should not contain a leading dot;
-otherwise, the results are undefined.
-
-=cut
-
-sub setdomainname ($) {
- ($domainname) = @_;
-}
-
-=item C<setetcdir($)>
-
-Sets the sysconfdir, normally /etc.
-This should be an absolute path; a trailing / is not required.
-Must be writeable, else we die.
-
-=cut
-
-sub setetcdir ($) {
- ($etcdir) = @_;
- if (! ((-d $etcdir) && (-w $etcdir))) { die("Cannot write to $etcdir! Please set the etcdir environment variable to a writeable directory.\nFailed"); }
-}
-
-=item C<getkohaversion()>
-
-Returns: the Koha version as known by the previous config file..
-
-=cut
-
-sub getkohaversion () {
- return($kohaversion);
-}
-
-=item C<setkohaversion($)>
-
-Sets the Koha version as known by the installer.
-
-Note: function is now misnamed, setting $newversion not $kohaversion
-
-=cut
-
-sub setkohaversion ($) {
- ($newversion) = @_;
-}
-
-=item C<getservername()>
-
-Returns: the name of the Koha virtual server as specified by the user.
-
-=cut
-
-sub getservername () {
- $servername;
-}
-
-=item C<getopacport()>
-
-Returns the port that will run the Koha OPAC virtual server, as
-specified by the user.
-
-=cut
-
-sub getopacport () {
- $opacport;
-}
-
-=item C<getintranetport()>
-
-Returns the port that will run the Koha INTRANET virtual server, as
-specified by the user.
-
-=cut
-
-sub getintranetport () {
- $intranetport;
-}
-
-=back
-
-=head2 Miscellaneous utility functions
-
-=over 4
-
-=item C<dirname($)>
-
-Does the equivalent of dirname(1).
-
-Takes: a path
-
-Returns: parent directory of path (best guess), except when the path
-seems to be the same as /, in which case it is returned unchanged.
-
-=cut
-
-sub dirname ($;$) {
- my($path) = @_;
- if ($path =~ /[^\/]/s) {
- if ($path =~ /\//) {
- $path =~ s/\/+[^\/]+\/*$//s;
- } else {
- $path = '.';
- }
- }
- return $path;
-}
-
-=item C<mkdir_parents($;$)>
-
-Does the equivalent of mkdir -p, or mkdir --parents.
-
-Takes: a path and an optional mode.
-
-Create the directory path, recursively creating any intermediate
-directories, with the access mode if given.
-
-WARNING: If the path already exists, mkdir_parents will just return
-successfully (just like mkdir -p), whether the mode of path conforms
-to the mode or not. (This is the behaviour of the mkdir -p command.)
-
-=cut
-
-sub mkdir_parents ($;$) {
- my($path, $mode) = @_;
- my $ok = -d($path)? 1: defined $mode? mkdir($path, $mode): mkdir($path);
-
- if (!$ok && $! == ENOENT) {
- my $parent = dirname($path);
- $ok = &mkdir_parents($parent, $mode);
-
- # retry and at the same time make sure that $! is set correctly
- $ok = defined $mode? mkdir($path, $mode): mkdir($path);
- }
- return $ok;
-}
-
-=item C<getmessage($;$)>
-
-Takes: a message identifier, an array reference
-
-Returns: a localized message (format string)
-
-The first message must be the message identifier corresponding to a
-defined message string (a valid key to the $Installer::messages hash).
-The second parameter may be an array reference of variables,
-to be substituted into the format string.
-
-getmessage throws an exception if the message cannot be found.
-
-=cut
-
-sub getmessage {
- my $messagename=shift;
- my $variables=shift;
- my $message=$messages->{$messagename}->{$language} || $messages->{$messagename}->{en} || RED.BOLD."Error: No message named $messagename in Install.pm\n";
- if (defined($variables)) {
- $message=sprintf $message, @$variables;
- }
- return $message;
-}
-
-
-=item C<showmessage($$;$$)>
-
-Shows a message and optionally gets a response from the user.
-
-Takes:
-message string, question type, default response, noclear
-
-Returns: response string
-
-The message must be the actual string to display; the caller is
-responsible for calling getmessage if required.
-
-Question type must be 'none' for no response, 'yn' for a yes/no
-question, 'restrictchar CHARS' for one letter from CHARS (Case is not
-significant, but case is significant in the list of allowed
-characters), 'free' for any string, 'silentfree' for any string
-entered without on-screen display, 'numerical', 'email' or
-'PressEnter'. If a response type other than the above-listed is
-specified, the result is undefined.
-
-Note that the response type of "email" does not actually
-guarantee that the returned value is a well-formed RFC-822
-email address, nor does it accept all well-formed RFC-822 email
-addresses. What it does is to restrict the returned value to a
-string that is looks reasonably likely to be an email address
-in the "real world", given the premise that the user is trying
-to enter a real email address.
-
-If a response type other than "none" or "PressEnter" is specified, a
-third argument, specifying the default value, can be specified: If
-this default response is not specified, the default response is the
-first allowed character if the response type is "restrictchar",
-otherwise the default response is the empty string. This default
-response is used when the user does not specify a value (i.e., presses
-Enter without typing in anything), showmessage will assume that the
-default response is the user's response.
-
-Note that because the response type "yn" is equivalent to
-"restrictchar yn", the default value for response type "yn", if
-unspecified, is "y".
-
-The screen is normally cleared before the message is displayed; if a
-fourth argument is specified and is nonzero, this screen-clearing is
-not done.
-
-=cut
-#'
-
-sub showmessage ($$;$$) {
- #MJR: Maybe refactor to use anonymous functions that
- # check the responses instead of RnP branching.
- my $message=join('',fill('','',(shift)));
- my $responsetype=shift;
- my $defaultresponse=shift;
- my $noclear=shift;
- $noclear = 0 unless defined $noclear; # defaults to "clear"
- ($noclear) || (print $clear_string);
- if ($responsetype =~ /^yn$/) {
- $responsetype='restrictchar ynYN';
- }
- print RESET.$message;
- if ($responsetype =~/^restrictchar (.*)/i) {
- my $response='\0';
- my $options=$1;
- until ($options=~/$response/) {
- (defined($defaultresponse)) || ($defaultresponse=substr($options,0,1));
- $response=<STDIN>;
- chomp $response;
- (length($response)) || ($response=$defaultresponse);
- if ( $response=~/.*[\:\(\)\^\$\*\!\\].*/ ) {
- ($noclear) || (print $clear_string);
- print RED."Response contains invalid characters. Choose from [$options].\n\n";
- print RESET.$message;
- $response='\0';
- } else {
- unless ($options=~/$response/) {
- ($noclear) || (print $clear_string);
- print RED."Invalid Response. Choose from [$options].\n\n";
- print RESET.$message;
- }
- }
- }
- return $response;
- } elsif ($responsetype =~/^(silent)?free$/i) {
- (defined($defaultresponse)) || ($defaultresponse='');
- if ($responsetype =~/^(silent)/i) { setecho(0) };
- my $response=<STDIN>;
- if ($responsetype =~/^(silent)/i) { setecho(1) };
- chomp $response;
- ($response) || ($response=$defaultresponse);
- return $response;
- } elsif ($responsetype =~/^numerical$/i) {
- (defined($defaultresponse)) || ($defaultresponse='');
- my $response='';
- until ($response=~/^\d+$/) {
- $response=<STDIN>;
- chomp $response;
- ($response) || ($response=$defaultresponse);
- unless ($response=~/^\d+$/) {
- ($noclear) || (print $clear_string);
- print RED."Invalid Response ($response). Response must be a number.\n\n";
- print RESET.$message;
- }
- }
- return $response;
- } elsif ($responsetype =~/^email$/i) {
- (defined($defaultresponse)) || ($defaultresponse='');
- my $response='';
- until ($response=~/.*\@.*\..*/) {
- $response=<STDIN>;
- chomp $response;
- ($response) || ($response=$defaultresponse);
- if ($response!~/.*\@.*\..*/) {
- ($noclear) || (print $clear_string);
- print RED."Invalid Response ($response). Response must be a valid email address.\n\n";
- print RESET.$message;
- }
- }
- return $response;
- } elsif ($responsetype =~/^PressEnter$/i) {
- <STDIN>;
- return;
- } elsif ($responsetype =~/^none$/i) {
- return;
- } else {
- # FIXME: There are a few places where we will get an undef as the
- # response type. Should we thrown an exception here, or should we
- # legitimize this usage and say "none" is the default if not specified?
- #die "Illegal response type \"$responsetype\"";
- }
-}
-
-
-=item C<startsysout()>
-
-Changes the display to show system output until the next showmessage call.
-At the time of writing, this means using red text.
-
-=cut
-
-sub startsysout {
- print RED."\n";
-}
-
-=back
-
-=head2 Subtasks of doing an installation
-
-=over 4
-
-=item C<checkabortedinstall()>
-
-Checks whether a previous installation process has been abnormally
-aborted, by checking whether $etcidr/koha.conf is a symlink matching
-a particular pattern. If an aborted installation is detected, give
-the user a chance to abort, before trying to recover the aborted
-installation.
-
-FIXME: The recovery is not complete; it only partially rolls back
-some changes.
-
-=cut
-
-sub checkabortedinstall () {
- if (-l("$etcdir/koha.conf")
- && readlink("$etcdir/koha.conf") =~ /\.tmp$/
- ) {
- print qq|
-I have detected that you tried to install Koha before, but the installation
-was aborted. I will try to continue, but there might be problems if the
-database is already created.
-
-|;
- print "Please press <ENTER> to continue: ";
- <STDIN>;
-
- # Remove the symlink after the <STDIN>, so the user can back out
- unlink "$etcdir/koha.conf"
- || die "Failed to remove incomplete $etcdir/koha.conf: $!\n";
- }
-}
-
-=item C<checkpaths()>
-
-Make sure that we loaded the right dirs from an old koha.conf
-
-FIXME: needs update to use Install.pm
-
-=cut
-
-sub checkpaths {
-if ($opacdir && $intranetdir) {
- print qq|
-
-I believe that your old files are located in:
-
- OPAC: $opacdir
- LIBRARIAN: $intranetdir
-
-
-Does this look right? ([Y]/N):
-|;
- my $answer = <STDIN>;
- chomp $answer;
-
- if ($answer =~/n/i) {
- $intranetdir='';
- $opacdir='';
- } else {
- print "Great! continuing upgrade... \n";
- }
-}
-
-if (!$opacdir || !$intranetdir) {
- $intranetdir='';
- $opacdir='';
- while (!$intranetdir) {
- print "Please specify the location of your LIBRARIAN files: ";
-
- my $answer = <STDIN>;
- chomp $answer;
-
- if ($answer) {
- $intranetdir=$answer;
- }
- if (! -e "$intranetdir/htdocs") {
- print "\nCouldn't find the htdocs directory here. That doesn't look right.\nPlease enter another location.\n\n";
- $intranetdir='';
- }
- }
- while (!$opacdir) {
- print "Please specify the location of your OPAC files: ";
-
- my $answer = <STDIN>;
- chomp $answer;
-
- if ($answer) {
- $opacdir=$answer;
- }
- if (! -e "$opacdir/htdocs") {
- print "\nCouldn't find the htdocs directory here. That doesn't look right.\nPlease enter another location.\n\n";
- $opacdir='';
- }
- }
-}
-
-}
-
-=item C<checkperlmodules(;$)>
-
-Test whether the version of Perl is new enough, whether Perl is found
-at the expected location, and whether all required modules have been
-installed.
-
-=cut
-
-sub checkperlmodules(;$) {
-#
-# Test for Perl and Modules
-#
- my ($auto_install) = @_;
- my $message = getmessage('CheckingPerlModules');
- showmessage($message, 'none');
-
- unless ($] >= 5.006001) { # Bug 179
- die getmessage('PerlVersionFailure', ['5.6.1']);
- }
- startsysout();
-
- my @missing = ();
- unless (eval {require DBI}) { push @missing,"DBI" };
- unless (eval {require Date::Manip}) { push @missing,"Date::Manip" };
- unless (eval {require DBD::mysql}) { push @missing,"DBD::mysql" };
- unless (eval {require HTML::Template}) { push @missing,"HTML::Template" };
- unless (eval {require Digest::MD5}) { push @missing,"Digest::MD5" };
- unless (eval {require MARC::Record}) { push @missing,"MARC::Record" };
- unless (eval {require Mail::Sendmail}) { push @missing,"Mail::Sendmail" };
-# The following modules are not mandatory, depends on how the library want to use Koha
- unless (eval {require PDF::API2}) {
- if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
- push @missing,"You will need PDF::API2 for barcode generator";
- }
- }
- unless (eval {require GD::Barcorde}) {
- if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
- push @missing,"You will need GD::Barcode for the new barcode generator";
- }
- }
- unless (eval {require GD::Barcorde}) {
- if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
- push @missing,"You will need GD::Barcode for the new barcode generator";
- }
- }
- unless (eval {require Data::Random}) {
- if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
- push @missing,"You will need Data::Random for the new barcode generator";
- }
- }
- unless (eval {require PDF::Reuse::Barcode}) {
- if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
- push @missing,"You will need PDF::Reuse::Barcode for the new barcode generator";
- }
- }
- unless (eval {require PDF::Report}) {
- if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
- push @missing,"You will need PDF::Report for spine and barcode printing"
- }
- }
-
- unless (eval {require GD::Barcode}) {
- if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
- push @missing,"You will need GD::Barcode for spine and barcode printing"
- }
- }
-
- unless (eval {require GD::Barcode::UPCE}) {
- if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
- push @missing,"You will need GD::Barcode::UPCE for spine and barcode printing"
- }
- }
-
- unless (eval {require Net::LDAP}) {
- if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
- push @missing, "Net::LDAP";
- }
- }
- unless (eval {require Event}) {
- if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
- push @missing, "Event";
- }
- }
- unless (eval {require Net::Z3950}) {
- showmessage(getmessage('NETZ3950Missing'), 'PressEnter', '', 1);
- if ($#missing>=0) { # see above note
- push @missing, "Net::Z3950";
- }
- }
- unless (eval {require LWP::Simple}) {
- showmessage(getmessage('LWP::Simple'), 'PressEnter', '', 1);
- if ($#missing>=0) { # see above note
- push @missing, "LWP::Simple";
- }
- }
- unless (eval {require XML::Simple}) {
- showmessage(getmessage('XML::Simple'), 'PressEnter', '', 1);
- if ($#missing>=0) { # see above note
- push @missing, "XML::Simple";
- }
- }
-
-#
-# Print out a list of any missing modules
-#
-
- if (@missing > 0) {
- my $missing='';
- if (POSIX::setlocale(LC_ALL) ne "C") {
- $missing.=" export LC_ALL=C\n";
- }
- foreach my $module (@missing) {
- $missing.=" perl -MCPAN -e 'install \"$module\"'\n";
- }
- my $message=getmessage('MissingPerlModules', [$missing]);
- showmessage($message, 'none');
- print "\n";
- exit;
- } else {
- showmessage(getmessage('AllPerlModulesInstalled'), 'PressEnter', '', 1) unless $auto_install->{NoPressEnter};
- }
-
-
- startsysout();
- unless (-x "/usr/bin/perl") {
- my $realperl=`which perl`;
- chomp $realperl;
- $realperl = showmessage(getmessage('NoUsrBinPerl'), 'none');
- until (-x $realperl) {
- $realperl=showmessage(getmessage('AskLocationOfPerlExecutable', $realperl), 'free', $realperl, 1);
- }
- my $response=showmessage(getmessage('ConfirmPerlExecutableSymlink', $realperl), 'yn', 'y', 1);
- unless ($response eq 'n') {
- startsysout();
- system("ln -s $realperl /usr/bin/perl");
- }
- }
-
-
-}
-
-$messages->{'NoUsrBinPerl'}->{en} =
- heading('No /usr/bin/perl') . qq|
-Koha expects to find the perl executable in the /usr/bin
-directory. It is not there on your system.
-
-|;
-
-$messages->{'AskLocationOfPerlExecutable'}->{en}=qq|Location of Perl Executable [%s]: |;
-$messages->{'ConfirmPerlExecutableSymlink'}->{en}=qq|
-Some Koha scripts will _not_ work without a symlink from %s to /usr/bin/perl
-
-Most users should answer Y here.
-
-May I try to create this symlink? ([Y]/N):|;
-
-$messages->{'DirFailed'}->{en} = RED.qq|
-We could not create %s, but continuing anyway...
-
-|;
-
-
-
-=item C<getinstallationdirectories(;$)>
-
-Asks the user for the various installation directories, and then
-creates those directories (if they do not already exist).
-
-These pieces of information are saved to variables; the function does
-not return any values.
-
-=cut
-
-sub getinstallationdirectories(;$) {
- my ($auto_install) = @_;
- if (!$ENV{prefix}) { $ENV{prefix} = "/usr/local"; }
- $opacdir = $ENV{prefix}.'/koha/opac';
- $intranetdir = $ENV{prefix}.'/koha/intranet';
- my $getdirinfo=1;
- while ($getdirinfo) {
- # Loop until opac directory and koha directory are different
- my $message;
- if ($auto_install->{GetOpacDir}) {
- $opacdir=$auto_install->{GetOpacDir};
- print ON_YELLOW.BLACK."auto-setting OpacDir to : $opacdir".RESET."\n";
- } else {
- $message=getmessage('GetOpacDir', [$opacdir]);
- $opacdir=showmessage($message, 'free', $opacdir);
- }
- if ($auto_install->{GetIntranetDir}) {
- $intranetdir=$auto_install->{GetIntranetDir};
- print ON_YELLOW.BLACK."auto-setting IntranetDir to : $intranetdir".RESET."\n";
- } else {
- $message=getmessage('GetIntranetDir', [$intranetdir]);
- $intranetdir=showmessage($message, 'free', $intranetdir);
- }
- if ($intranetdir eq $opacdir) {
- print qq|
-
-You must specify different directories for the OPAC and INTRANET files!
- :: $intranetdir :: $opacdir ::
-|;
-<STDIN>
- } else {
- $getdirinfo=0;
- }
- }
- $kohalogdir=$ENV{prefix}.'/koha/log';
- if ($auto_install->{GetOpacDir}) {
- $kohalogdir=$auto_install->{KohaLogDir};
- print ON_YELLOW.BLACK."auto-setting log dir to : $kohalogdir".RESET."\n";
- } else {
- my $message=getmessage('GetKohaLogDir', [$kohalogdir]);
- $kohalogdir=showmessage($message, 'free', $kohalogdir);
- }
-
-
- # FIXME: Need better error handling for all mkdir calls here
- unless ( -d $intranetdir ) {
- mkdir_parents (dirname($intranetdir), 0775) || print getmessage('DirFailed',['parents of '.$intranetdir]);
- mkdir ($intranetdir, 0770) || print getmessage('DirFailed',[$intranetdir]);
- if ($>==0) { chown (oct(0), (getgrnam($httpduser))[2], "$intranetdir"); }
- chmod 0770, "$intranetdir";
- }
- mkdir_parents ("$intranetdir/htdocs", 0750);
- mkdir_parents ("$intranetdir/cgi-bin", 0750);
- mkdir_parents ("$intranetdir/modules", 0750);
- mkdir_parents ("$intranetdir/scripts", 0750);
- unless ( -d $opacdir ) {
- mkdir_parents (dirname($opacdir), 0775) || print getmessage('DirFailed',['parents of '.$opacdir]);
- mkdir ($opacdir, 0770) || print getmessage('DirFailed',[$opacdir]);
- if ($>==0) { chown (oct(0), (getgrnam($httpduser))[2], "$opacdir"); }
- chmod (oct(770), "$opacdir");
- }
- mkdir_parents ("$opacdir/htdocs", 0750);
- mkdir_parents ("$opacdir/cgi-bin", 0750);
-
-
- unless ( -d $kohalogdir ) {
- mkdir_parents (dirname($kohalogdir), 0775) || print getmessage('DirFailed',['parents of '.$kohalogdir]);
- mkdir ($kohalogdir, 0770) || print getmessage('DirFailed',[$kohalogdir]);
- if ($>==0) { chown (oct(0), (getgrnam($httpduser))[2,3], "$kohalogdir"); }
- chmod (oct(770), "$kohalogdir");
- }
-}
-
-=item C<getmysqldir()>
-
-Returns: the MySQL database server installation directory,
-automatically if possible and from the user otherwise.
-
-=cut
-
-$messages->{'WhereIsMySQL'}->{en} = heading('MYSQL LOCATION').qq|
-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.
-If you compiled mysql yourself,
-please give the value of --prefix when you ran configure.
-The file mysqladmin should be in bin/mysqladmin under the directory that you give here.
-
-MySQL installation directory: |;
-#'
-sub getmysqldir () {
- foreach my $mysql (qw(/usr/local/mysql
- /opt/mysql
- /usr/local
- /usr
- )) {
- if ( -d $mysql && -f "$mysql/bin/mysqladmin") {
- $mysqldir=$mysql;
- }
- }
- if (!$mysqldir){
- for (;;) {
- $mysqldir = showmessage(getmessage('WhereIsMySQL'),'free');
- last if -f "$mysqldir/bin/mysqladmin";
- }
- }
- return($mysqldir);
-}
-
-=item C<getdatabaseinfo(;$)>
-
-Asks for various pieces of information related to the Koha database:
-the name of the database, the host on which the SQL server is running,
-and the database user name.
-
-These pieces of information are saved to global variables; the
-function does not return any values.
-
-=cut
-
-$messages->{'DatabaseName'}->{en} = heading('Database Name') . qq|
-Please provide the name that you wish to give your koha database.
-It must not exist already on the database server.
-
-Most users give a short single-word name for their library here.
-
-Database name [%s]: |;
-
-$messages->{'DatabaseHost'}->{en} = heading('Database Host') . qq|
-Please provide the mysql server name. Unless the database is stored on
-another machine, this should be "localhost".
-
-Database host [%s]: |;
-
-$messages->{'DatabaseUser'}->{en} = heading('Database User') . qq|
-We are going to create a new mysql user for Koha. This user will have full administrative rights
-to the database called %s when they connect from %s.
-This is also the name of the Koha librarian superuser.
-
-Most users give a single-word name here.
-
-Database user [%s]: |;
-
-$messages->{'DatabasePassword'}->{en} = heading('Database Password') . qq|
-Please provide a good password for the user %s.
-
-IMPORTANT: You can log in using this user and password at any time.
-
-Password for database user %s: |;
-
-$messages->{'BlankPassword'}->{en} = heading('BLANK PASSWORD') . qq|
-You must not use a blank password for your MySQL user.
-
-Press <ENTER> to try again:
-|;
-
-sub getdatabaseinfo(;$) {
- my ($auto_install) = @_;
- $database = 'Koha';
- $hostname = 'localhost';
- $user = 'kohaadmin';
- $pass = '';
-
-#Get the database name
- my $message;
-
- if ($auto_install->{database}) {
- $database=$auto_install->{database};
- print ON_YELLOW.BLACK."auto-setting database to : $database".RESET."\n";
- } else {
- $message=getmessage('DatabaseName', [$database]);
- $database=showmessage($message, 'free', $database);
- }
-#Get the hostname for the database
-
- if ($auto_install->{DatabaseHost}) {
- $hostname=$auto_install->{DatabaseHost};
- print ON_YELLOW.BLACK."auto-setting database host to : $hostname".RESET."\n";
- } else {
- $message=getmessage('DatabaseHost', [$hostname]);
- $hostname=showmessage($message, 'free', $hostname);
- }
-#Get the username for the database
-
- if ($auto_install->{DatabaseUser}) {
- $user=$auto_install->{DatabaseUser};
- print ON_YELLOW.BLACK."auto-setting DB user to : $user".RESET."\n";
- } else {
- $message=getmessage('DatabaseUser', [$database, $hostname, $user]);
- $user=showmessage($message, 'free', $user);
- }
-#Get the password for the database user
-
- while ($pass eq '') {
- my $message=getmessage('DatabasePassword', [$user, $user]);
- if ($auto_install->{DatabasePassword}) {
- $pass=$auto_install->{DatabasePassword};
- print ON_YELLOW.BLACK."auto-setting database password to : $pass".RESET."\n";
- } else {
- $pass=showmessage($message, 'free', $pass);
- }
- if ($pass eq '') {
- my $message=getmessage('BlankPassword');
- showmessage($message,'PressEnter');
- }
- }
-}
-
-
-
-=item C<getapacheinfo(;$)>
-
-Detects or asks for various pieces of information related to the
-Apache server: the location of the configuration file and, if needed,
-the Unix user that the Koha CGI will be run under.
-
-These pieces of information are saved to global variables; the
-function does not return any values.
-
-=cut
-
-$messages->{'FoundMultipleApacheConfFiles'}->{en} =
- heading('MULTIPLE APACHE CONFIG FILES FOUND') . qq|
-I found more than one possible Apache configuration file:
-
-%s
-
-Enter number of the file to read [1]: |;
-
-$messages->{'NoApacheConfFiles'}->{en} =
- heading('NO APACHE CONFIG FILE FOUND') . qq|
-I was not able to find your Apache configuration file.
-
-The file is usually called httpd.conf, apache.conf or similar.
-
-Please enter the full name, starting with /: |;
-
-$messages->{'NotAFile'}->{en} = heading('FILE DOES NOT EXIST') . qq|
-The file %s does not exist.
-
-Please press <ENTER> to continue: |;
-
-$messages->{'EnterApacheUser'}->{en} = heading('NEED APACHE USER') . qq\
-The installer could not find the User setting in the Apache configuration file.
-This is used to set up access permissions for
-%s/koha.conf. This user should be set in one of the Apache configuration.
-Please try to find it and enter the user name below. You might find
-that "ps u|grep apache" will tell you. It probably is NOT "root".
-
-Enter the Apache userid: \;
-
-$messages->{'InvalidUserid'}->{en} = heading('INVALID USER') . qq|
-The userid %s is not a valid userid on this system.
-
-Press <ENTER> to continue: |;
-
-sub getapacheinfo (;$) {
- my ($auto_install) = @_;
- my @confpossibilities;
-
- foreach my $httpdconf (qw(/usr/local/apache/conf/httpd.conf
- /usr/local/etc/apache/httpd.conf
- /usr/local/etc/apache/apache.conf
- /var/www/conf/httpd.conf
- /etc/apache2/httpd.conf
- /etc/apache2/apache2.conf
- /etc/apache/conf/httpd.conf
- /etc/apache/conf/apache.conf
- /etc/apache/httpd.conf
- /etc/apache-ssl/conf/apache.conf
- /etc/apache-ssl/httpd.conf
- /etc/httpd/conf/httpd.conf
- /etc/httpd/httpd.conf
- /etc/httpd/2.0/conf/httpd2.conf
- )) {
- if ( -f $httpdconf ) {
- push @confpossibilities, $httpdconf;
- }
- }
-
- if ($#confpossibilities==-1) {
- my $message=getmessage('NoApacheConfFiles');
- my $choice='';
- $realhttpdconf='';
- until (-f $realhttpdconf) {
- $choice=showmessage($message, "free", 1);
- if (-f $choice) {
- $realhttpdconf=$choice;
- } else {
- showmessage(getmessage('NotAFile', [$choice]),'PressEnter', '', 1);
- }
- }
- } elsif ($#confpossibilities>0) {
- my $conffiles='';
- my $counter=1;
- my $options='';
- foreach (@confpossibilities) {
- $conffiles.=" $counter: $_\n";
- $options.="$counter";
- $counter++;
- }
- my $message=getmessage('FoundMultipleApacheConfFiles', [$conffiles]);
- my $choice=showmessage($message, "restrictchar $options", 1);
- $realhttpdconf=$confpossibilities[$choice-1];
- } else {
- $realhttpdconf=$confpossibilities[0];
- }
- unless (open (HTTPDCONF, "<$realhttpdconf")) {
- warn RED."Insufficient privileges to open $realhttpdconf for reading.\n";
- sleep 4;
- }
-
- while (<HTTPDCONF>) {
- if (/^\s*User\s+"?([-\w]+)"?\s*$/) {
- $httpduser = $1;
- }
- }
- close(HTTPDCONF);
-
- unless (defined($httpduser)) {
- my $message;
- if ($auto_install->{EnterApacheUser}) {
- $message = $auto_install->{EnterApacheUser};
- print ON_YELLOW.BLACK."auto-setting Apache User to : $message".RESET."\n";
- } else {
- $message=getmessage('EnterApacheUser', [$etcdir]);
- }
- until (defined($httpduser) && length($httpduser) && getpwnam($httpduser)) {
- if ($auto_install->{EnterApacheUser}) {
- $httpduser = $auto_install->{EnterApacheUser};
- } else {
- $httpduser=showmessage($message, "free", '');
- }
- if (length($httpduser)>0) {
- unless (getpwnam($httpduser)) {
- my $message=getmessage('InvalidUserid', [$httpduser]);
- showmessage($message,'PressEnter');
- }
- } else {
- }
- }
- }
-}
-
-
-=item C<getapachevhostinfo(;$)>
-
-Asks for various pieces of information related to virtual hosting: the
-webmaster email address, virtual hostname, and the ports that the OPAC
-and INTRANET modules run on.
-
-These pieces of information are saved to global variables; the
-function does not return any values.
-
-=cut
-
-$messages->{'ApacheConfigIntroduction'}->{en} =
- heading('APACHE CONFIGURATION') . qq|
-Koha needs to write an Apache configuration file for the
-OPAC and Librarian sites. By default this installer
-will do this by using one name and two different ports
-for the virtual hosts. There are other ways to set this up,
-and the installer will leave comments in
-%s/koha-httpd.conf about them.
-
-NOTE: You will need to add lines to your main httpd.conf to
-include %s/koha-httpd.conf
-(using the Include directive)
-and to make sure it is listening on the right ports
-and host names
-(using the Listen directive).
-
-Press <ENTER> to continue: |;
-
-$messages->{'GetVirtualHostEmail'}->{en} =
- heading('WEB E-MAIL CONTACT') . qq|
-Enter the e-mail address to be used as a contact for Koha. This
-address is displayed if fatal errors are encountered.
-
-E-mail contact [%s]: |;
-
-$messages->{'GetServerName'}->{en} =
- heading('WEB HOST NAME OR IP ADDRESS') . qq|
-Please enter the host name or IP address that you wish to use for koha.
-Normally, this should be a name or IP that belongs to this machine.
-
-Host name or IP Address [%s]: |;
-
-$messages->{'GetOpacPort'}->{en} = heading('OPAC PORT') . qq|
-Please enter the port for your OPAC interface. This defaults to port 80, but
-if you are already serving web content with this hostname, you should change it
-to a different port (8000 might be a good choice, but check any firewalls).
-
-Enter the OPAC Port [%s]: |;
-
-$messages->{'GetIntranetPort'}->{en} =
- heading('LIBRARIAN PORT') . qq|
-Please enter the port for your Librarian interface. This must be different from
-the OPAC port (%s).
-
-Enter the Intranet Port [%s]: |;
-
-
-sub getapachevhostinfo (;$) {
- my ($auto_install) = @_;
- $svr_admin = "webmaster\@$domainname";
- $servername=`hostname`;
- chomp $servername;
- $opacport=80;
- $intranetport=8080;
-
- if ($auto_install->{GetVirtualHostEmail}) {
- $svr_admin=$auto_install->{GetVirtualHostEmail};
- print ON_YELLOW.BLACK."auto-setting VirtualHostEmail to : $svr_admin".RESET."\n";
- } else {
- showmessage(getmessage('ApacheConfigIntroduction',[$etcdir,$etcdir]), 'PressEnter');
- $svr_admin=showmessage(getmessage('GetVirtualHostEmail', [$svr_admin]), 'email', $svr_admin);
- }
- if ($auto_install->{servername}) {
- $servername=$auto_install->{servername};
- print ON_YELLOW.BLACK."auto-setting server name to : $servername".RESET."\n";
- } else {
- $servername=showmessage(getmessage('GetServerName', [$servername]), 'free', $servername);
- }
- if ($auto_install->{opacport}) {
- $opacport=$auto_install->{opacport};
- print ON_YELLOW.BLACK."auto-setting opac port to : $opacport".RESET."\n";
- } else {
- $opacport=showmessage(getmessage('GetOpacPort', [$opacport]), 'numerical', $opacport);
- }
- if ($auto_install->{intranetport}) {
- $intranetport=$auto_install->{intranetport};
- print ON_YELLOW.BLACK."auto-setting intranet port to : $intranetport".RESET."\n";
- } else {
- $intranetport=showmessage(getmessage('GetIntranetPort', [$opacport, $intranetport]), 'numerical', $intranetport);
- }
-
-}
-
-
-=item C<updateapacheconf(;$)>
-
-Creates the Apache config file according to parameters previously
-specified by the user as F<$etcdir/koha-httpd.conf>.
-
-If you need to uninstall Koha for any reason, the lines between
-
- # Ports to listen to for Koha
-
-and the block of comments beginning with
-
- # If you want to use name based Virtual Hosting:
-
-must be removed.
-
-=cut
-
-$messages->{'StartUpdateApache'}->{en} =
- heading('UPDATING APACHE CONFIGURATION') . qq|
-Checking for modules that need to be loaded...
-|;
-
-$messages->{'ApacheConfigMissingModules'}->{en} =
- heading('APACHE CONFIGURATION NEEDS UPDATE') . qq|
-Koha uses the mod_env and mod_include apache features, but the
-installer did not find them in your config. Please
-make sure that they are enabled for your Koha site.
-
-Press <ENTER> to continue: |;
-
-
-$messages->{'ApacheAlreadyConfigured'}->{en} =
- heading('APACHE ALREADY CONFIGURED') . qq|
-%s appears to already have an entry for Koha. You may need to edit %s
-if anything has changed since it was last set up. This
-script will not attempt to modify an existing Koha apache
-configuration.
-
-Press <ENTER> to continue: |;
-
-sub updateapacheconf (;$) {
- my ($auto_install)=@_;
- my $logfiledir=$kohalogdir;
- my $httpdconf = $etcdir."/koha-httpd.conf";
-
- showmessage(getmessage('StartUpdateApache'), 'none') unless $auto_install->{NoPressEnter};
- # to be polite about it: I don't think this should touch the main httpd.conf
-
- # QUESTION: Should we warn for includes_module too?
- my $envmodule=0;
- my $includesmodule=0;
- open HC, "<$realhttpdconf";
- while (<HC>) {
- if (/^\s*#\s*LoadModule env_module /) {
- showmessage(getmessage('ApacheConfigMissingModules'),'none');
- $envmodule=1;
- }
- if (/\s*LoadModule includes_module / ) {
- $includesmodule=1;
- }
- }
-
- startsysout;
- if (`grep -q 'VirtualHost $servername' "$httpdconf" 2>/dev/null`) {
- showmessage(getmessage('ApacheAlreadyConfigured', [$httpdconf, $httpdconf]), 'PressEnter');
- return;
- } else {
- my $includesdirectives='';
- if ($includesmodule) {
- $includesdirectives.="Options +Includes\n";
- $includesdirectives.=" AddHandler server-parsed .html\n";
- }
- open(SITE,">$httpdconf") or warn "Insufficient priveleges to open $httpdconf for writing.\n";
- my $opaclisten = '';
- if ($opacport != 80) {
- $opaclisten="Listen $opacport";
- }
- my $intranetlisten = '';
- if ($intranetport != 80) {
- $intranetlisten="Listen $intranetport";
- }
- print SITE <<EOP
-
-# Koha 2.2 Apache Virtual Host Config File
-#
-# Please include this file in your apache configuration.
-# The best way to do that depends on your site setup.
-# Some like an Include adding to /etc/apache/httpd.conf
-# and some prefer a symlink to this file from some dir.
-# Please refer to your system manuals.
-
-# Ports to listen to for Koha
-# uncomment these if they aren't already in main httpd.conf
-#$opaclisten
-#$intranetlisten
-
-# NameVirtualHost is used by one of the optional configurations detailed below
-# Please make sure this line is correct before uncommenting.
-# See http://httpd.apache.org/docs/vhosts/ for some guides.
-
-#NameVirtualHost 11.22.33.44
-
-# KOHA's OPAC Configuration
-<VirtualHost $servername\:$opacport>
- ServerAdmin $svr_admin
- DocumentRoot $opacdir/htdocs
- ServerName $servername
- ScriptAlias /cgi-bin/koha/ $opacdir/cgi-bin/
- Redirect permanent index.html http://$servername\:$opacport/cgi-bin/koha/opac-main.pl
- ErrorLog $logfiledir/opac-error_log
- TransferLog $logfiledir/opac-access_log
- SetEnv PERL5LIB "$intranetdir/modules"
- SetEnv KOHA_CONF "$etcdir/koha.conf"
- $includesdirectives
-</VirtualHost>
-
-# KOHA's INTRANET Configuration
-<VirtualHost $servername\:$intranetport>
- ServerAdmin $svr_admin
- DocumentRoot $intranetdir/htdocs
- ServerName $servername
- ScriptAlias /cgi-bin/koha/ "$intranetdir/cgi-bin/"
- Redirect permanent index.html http://$servername\:$intranetport/cgi-bin/koha/mainpage.pl
- ErrorLog $logfiledir/koha-error_log
- TransferLog $logfiledir/koha-access_log
- SetEnv PERL5LIB "$intranetdir/modules"
- SetEnv KOHA_CONF "$etcdir/koha.conf"
- $includesdirectives
-</VirtualHost>
-
-# If you want to use name based Virtual Hosting:
-# 1. remove the two Listen lines
-# 2. replace $servername\:$opacport wih your.opac.domain.name
-# 3. replace ServerName $servername wih ServerName your.opac.domain.name
-# 4. replace $servername\:$intranetport wih your intranet domain name
-# 5. replace ServerName $servername wih ServerName your.intranet.domain.name
-#
-# If you want to use NameVirtualHost'ing (using two names on one ip address):
-# 1. Follow steps 1-5 above
-# 2. Uncomment the NameVirtualHost line and set the correct ip address
-
-EOP
-
-
- }
-}
-
-
-# =item C<basicauthentication(;$)>
-#
-# Asks the user whether HTTP basic authentication is wanted, and,
-# if so, the user name and password for the basic authentication.
-#
-# These pieces of information are saved to global variables; the
-# function does not return any values.
-#
-# =cut
-#
-# $messages->{'IntranetAuthenticationQuestion'}->{en} =
-# heading('LIBRARIAN AUTHENTICATION') . qq|
-# The Librarian site can be password protected using
-# Apache's Basic Authorization instead of Koha user details.
-#
-# This method going to be phased out very soon. Most users should answer N here.
-#
-# Would you like to do this (Y/[N]): |; #'
-#
-# $messages->{'BasicAuthUsername'}->{en}="Please enter a username for librarian access [%s]: ";
-# $messages->{'BasicAuthPassword'}->{en}="Please enter a password for %s: ";
-# $messages->{'BasicAuthPasswordWasBlank'}->{en}="\nYou cannot use a blank password!\n\n";
-#
-# sub basicauthentication {
-# my $message=getmessage('IntranetAuthenticationQuestion');
-# my $answer=showmessage($message, 'yn', 'n');
-# my $httpdconf = $etcdir."/koha-httpd.conf";
-#
-# my $apacheauthusername='librarian';
-# my $apacheauthpassword='';
-# if ($answer=~/^y/i) {
-# ($apacheauthusername) = showmessage(getmessage('BasicAuthUsername', [ $apacheauthusername]), 'free', $apacheauthusername, 1);
-# $apacheauthusername=~s/[^a-zA-Z0-9]//g;
-# while (! $apacheauthpassword) {
-# ($apacheauthpassword) = showmessage(getmessage('BasicAuthPassword', [ $apacheauthusername]), 'free', 1);
-# if (!$apacheauthpassword) {
-# ($apacheauthpassword) = showmessage(getmessage('BasicAuthPasswordWasBlank'), 'none', '', 1);
-# }
-# }
-# open AUTH, ">$etcdir/kohaintranet.pass";
-# my $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
-# my $salt=substr($chars, int(rand(length($chars))),1);
-# $salt.=substr($chars, int(rand(length($chars))),1);
-# print AUTH $apacheauthusername.":".crypt($apacheauthpassword, $salt)."\n";
-# close AUTH;
-# open(SITE,">>$httpdconf") or warn "Insufficient priveleges to open $realhttpdconf for writing.\n";
-# print SITE <<EOP
-#
-# <Directory $intranetdir>
-# AuthUserFile $etcdir/kohaintranet.pass
-# AuthType Basic
-# AuthName "Koha Intranet (for librarians only)"
-# Require valid-user
-# </Directory>
-# EOP
-# }
-# close(SITE);
-# }
-
-
-=item C<installfiles(;$$)>
-
-Copy the Koha files to the specified OPAC and INTRANET
-directories (usually in /usr/local/koha).
-
-Creates the koha.conf file, but as koha.conf.tmp. The caller is
-responsible for calling C<finalizeconfigfile(;$)> when installation is
-completed, to rename it back to koha.conf.
-
-The first parameter may be a marker to say this is a new installation,
-rather than an upgrade.
-
-=cut
-
-$messages->{'InstallFiles'}->{en} = heading('INSTALLING FILES') . qq|
-Copying files to installation directories:
-
-|;
-
-$messages->{'OldFiles'}->{en} = heading('OLD FILES') . qq|
-Any files from the previous edition of Koha have been
-copied to a dated backup directory alongside the new
-installation. You should move any custom files that you
-want to keep (such as your site templates) into the new
-directories and then move the backup off of the live
-server.
-
-Press ENTER to continue:|;
-
-
-$messages->{'CopyingFiles'}->{en}="Copying %s to %s.\n";
-
-
-
-sub installfiles (;$$) {
-
- my ($is_first_install,$auto_install) = @_;
- # $is_install is set if it's a fresh install and not an upgrade. If it's an upgrade, copy old files.
-
- sub neatcopy {
- my $desc = shift;
- my $src = shift;
- my $tgt = shift;
- my $auto_install = shift;
- my $is_first_install = shift;
- if (!$is_first_install && -e $tgt) {
- print getmessage('CopyingFiles', ["old ".$desc,$tgt.strftime("%Y%m%d%H%M",localtime())]) unless ($auto_install->{NoPressEnter});
- system("mv ".$tgt." ".$tgt.strftime("%Y%m%d%H%M",localtime()));
- system("mkdir ".$tgt); ##New line
- }
- print getmessage('CopyingFiles', [$desc,$tgt]) unless ($auto_install->{NoPressEnter});
- system("cp -R ".$src."/* ".$tgt);
- }
-
-# my ($auto_install) = @_;
- showmessage(getmessage('InstallFiles'),'none') unless ($auto_install->{NoPressEnter});
-
- neatcopy("admin templates", 'intranet-html', "$intranetdir/htdocs",$auto_install,$is_first_install);
- neatcopy("admin interface", 'intranet-cgi', "$intranetdir/cgi-bin",$auto_install,$is_first_install);
- neatcopy("main scripts", 'scripts', "$intranetdir/scripts",$auto_install,$is_first_install);
- neatcopy("perl modules", 'modules', "$intranetdir/modules",$auto_install,$is_first_install);
- neatcopy("OPAC templates", 'opac-html', "$opacdir/htdocs",$auto_install,$is_first_install);
- neatcopy("OPAC interface", 'opac-cgi', "$opacdir/cgi-bin",$auto_install,$is_first_install);
- startsysout();
- system("touch $opacdir/cgi-bin/opac");
-
- #MJR: is this necessary?
- if ($> == 0) {
- my $httpdgrp = getgrnam($httpduser);
- system("chown -R $httpduser:$httpdgrp $opacdir $intranetdir");
- }
- system("chmod -R a+rx $opacdir $intranetdir");
-
- # Create /etc/koha.conf
-
- my $old_umask = umask(027); # make sure koha.conf is never world-readable
- open(SITES,">$etcdir/koha.conf.tmp") or warn "Couldn't create file at $etcdir. Must have write capability.\n";
- print SITES qq|
-database=$database
-hostname=$hostname
-user=$user
-pass=$pass
-intranetdir=$intranetdir
-opacdir=$opacdir
-kohalogdir=$kohalogdir
-kohaversion=$newversion
-httpduser=$httpduser
-intrahtdocs=$intranetdir/htdocs/intranet-tmpl
-opachtdocs=$opacdir/htdocs/opac-tmpl
-|;
- close(SITES);
- umask($old_umask);
-
- startsysout();
- #MJR: can't help but this be broken, can we?
- chmod 0440, "$etcdir/koha.conf.tmp";
-
- #MJR: does this contain any passwords?
- chmod 0755, "$intranetdir/scripts/z3950daemon/z3950-daemon-launch.sh", "$intranetdir/scripts/z3950daemon/z3950-daemon-shell.sh", "$intranetdir/scripts/z3950daemon/processz3950queue";
-
- open(FILE,">$intranetdir/scripts/z3950daemon/z3950-daemon-options");
- print FILE "RunAsUser=$httpduser\nKohaZ3950Dir=$intranetdir/scripts/z3950daemon\nKohaModuleDir=$intranetdir/modules\nLogDir=$kohalogdir\nKohaConf=$etcdir/koha.conf";
- close(FILE);
-
- if ($> == 0) {
- chown((getpwnam($httpduser)) [2,3], "$etcdir/koha.conf.tmp") or warn "can't chown koha.conf: $!";
- chown(0, (getpwnam($httpduser)) [3], "$intranetdir/scripts/z3950daemon/z3950-daemon-shell.sh") or warn "can't chown $intranetdir/scripts/z3950daemon/z3950-daemon-shell.sh: $!";
- chown(0, (getpwnam($httpduser)) [3], "$intranetdir/scripts/z3950daemon/processz3950queue") or warn "can't chown $intranetdir/scripts/z3950daemon/processz3950queue: $!";
- } #MJR: report that we haven't chown()d.
- else {
- print "Please check permissions in $intranetdir/scripts/z3950daemon\n";
- }
- showmessage(getmessage('OldFiles'),'PressEnter') unless ($auto_install->{NoPressEnter} or $is_first_install);
-}
-
-
-=item C<databasesetup(;$)>
-
-Finds out where the MySQL utitlities are located in the system,
-then create the Koha database structure and MySQL permissions.
-
-=cut
-
-$messages->{'MysqlRootPassword'}->{en} =
- heading('MYSQL ROOT USER PASSWORD') . qq|
-To create the koha database, please enter your
-mysql server's root user password:
-
-Password: |;
-
-$messages->{'CreatingDatabase'}->{en} = heading('CREATING DATABASE') . qq|
-Creating the MySQL database for Koha...
-
-|;
-
-$messages->{'CreatingDatabaseError'}->{en} =
- heading('ERROR CREATING DATABASE') . qq|
-Couldn't connect to the MySQL server for the reason given above.
-This is a serious problem, the database will not get installed.
-
-Press <ENTER> to continue: |; #'
-
-$messages->{'SampleData'}->{en} = heading('SAMPLE DATA') . qq|
-If you are installing Koha for evaluation purposes,
-you can install some sample data now.
-
-If you are installing Koha to use your own
-data, you probably don't want this sample data installed.
-
-Would you like to install the sample data? Y/[N]: |; #'
-
-$messages->{'SampleDataInstalled'}->{en} =
- heading('SAMPLE DATA INSTALLED') . qq|
-Sample data has been installed. For some suggestions on testing Koha, please
-read the file doc/HOWTO-Testing. If you find any bugs, please submit them at
-http://bugs.koha.org/. If you need help with testing Koha, you can post a
-question through the koha-devel mailing list, or you can check for a developer
-online at irc.katipo.co.nz:6667 channel #koha.
-
-You can find instructions for subscribing to the Koha mailing lists at:
-
- http://www.koha.org
-
-
-Press <ENTER> to continue: |;
-
-$messages->{'AddBranchPrinter'}->{en} = heading('Add Branch and Printer') . qq|
-Would you like to describe an initial branch and printer? [Y]/N: |;
-
-$messages->{'BranchName'}->{en}="Branch Name [%s]: ";
-$messages->{'BranchCode'}->{en}="Branch Code (4 letters or numbers) [%s]: ";
-$messages->{'PrinterQueue'}->{en}="Printer Queue [%s]: ";
-$messages->{'PrinterName'}->{en}="Printer Name [%s]: ";
-
-sub databasesetup (;$) {
- my ($auto_install) = @_;
- $mysqluser = 'root';
- $mysqlpass = '';
- my $mysqldir = getmysqldir();
-
- if ($auto_install->{MysqlRootPassword}) {
- $mysqlpass=$auto_install->{MysqlRootPassword};
- } else {
- # we must not put the mysql root password on the command line
- $mysqlpass= showmessage(getmessage('MysqlRootPassword'),'silentfree');
- }
-
- showmessage(getmessage('CreatingDatabase'),'none') unless ($auto_install->{NoPressEnter});
- # set the login up
- setmysqlclipass($mysqlpass);
- # Set up permissions
- startsysout();
-Â Â Â Â Â Â Â print system("$mysqldir/bin/mysql -u$mysqluser -e \"insert into user (Host,User,Password) values ('$hostname','$user',password('$pass'))\" -h$hostname mysql\;");
-Â Â Â Â Â Â Â 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')\" -h$hostname mysql");
-Â Â Â Â Â Â Â system("$mysqldir/bin/mysqladmin -u$mysqluser -h$hostname reload");
-
- my $result=system("$mysqldir/bin/mysqladmin", "-u$mysqluser", "create", "$database");
- system("$mysqldir/bin/mysql '-u$mysqluser' -e \"GRANT ALL PRIVILEGES on ".$database.".* to '$user' IDENTIFIED BY '$pass' \" mysql");
- # Change to admin user login
- setmysqlclipass($pass);
- if ($result) {
- showmessage(getmessage('CreatingDatabaseError'),'PressEnter', '', 1);
- } else {
- # Create the database structure
- startsysout();
- system("$mysqldir/bin/mysql '-u$user' '$database' < koha.mysql");
- }
-
-}
-
-
-=item C<updatedatabase(;$)>
-
-Updates the Koha database structure, including the addition of
-MARC tables.
-
-The MARC tables are also populated in addition to being created.
-
-Because updatedatabase calls scripts/updater/updatedatabase to
-do the actual update, and that script uses C4::Context,
-$etcdir/koha.conf must exist at this point. We use the KOHA_CONF
-environment variable to do this.
-
-FIXME: (See checkabortedinstall as it depends on old symlink way.)
-
-=cut
-
-$messages->{'UpdateMarcTables'}->{en} =
- heading('MARC FIELD DEFINITIONS') . qq|
-You can import MARC settings for:
-
- 1 MARC21 in english
- 2 UNIMARC in french
- 3 UNIMARC in english
- 4 UNIMARC in ukrainian
- N none
-
-NOTE: If you choose N,
-nothing will be added, and you must create them all yourself.
-Only choose N if you want to use a MARC format not listed here,
-such as DANMARC. We would like to hear from you if you do.
-
-*** UPGRADE ***
-If you UPGRADE your version from a previous 2.x.x, the right choice here is N (None) to preserve your local MARC setup.
-
-Choose MARC definition [1]: |;
-
-$messages->{'Language'}->{en} = heading('CHOOSE LANGUAGE') . qq|
-This version of koha supports a few languages.
-
- en : default language, all pages available
- fr : complete translation
- es : partial librarian site translation
- zh_TW : partial translation
-
-en is used when a screen is not available in your language
-
-If you specify a language here, you can still
-change it from the system preferences screen in the librarian sit.
-
-Which language do you choose? |;
-
-sub updatedatabase (;$) {
- my ($auto_install) = @_;
- # At this point, $etcdir/koha.conf must exist, for C4::Context
- $ENV{"KOHA_CONF"}=$etcdir.'/koha.conf';
- if (! -e $ENV{"KOHA_CONF"}) { $ENV{"KOHA_CONF"}=$etcdir.'/koha.conf.tmp'; }
- startsysout();
- setmysqlclipass($pass);
- my $result=system ("perl -I $intranetdir/modules scripts/updater/updatedatabase -s");
- if ($result) {
- restoremycnf();
- print "Problem updating database...\n";
- exit;
- }
- my $response;
- if ($auto_install->{UpdateMarcTables}) {
- $response=$auto_install->{UpdateMarcTables};
- print ON_YELLOW.BLACK."auto-setting UpdateMarcTable to : $response".RESET."\n";
- } else {
- $response=showmessage(getmessage('UpdateMarcTables'), 'restrictchar 1234Nn', '1');
- }
- startsysout();
- if ($response eq '1') {
- system("cat scripts/misc/marc_datas/marc21_en/structure_def.sql | $mysqldir/bin/mysql '-u$user' '$database'");
- }
- if ($response eq '2') {
- system("cat scripts/misc/marc_datas/unimarc_fr/structure_def.sql | $mysqldir/bin/mysql '-u$user' '$database'");
- }
- if ($response eq '3') {
- system("cat scripts/misc/marc_datas/unimarc_en/structure_def.sql | $mysqldir/bin/mysql '-u$user' '$database'");
- }
- if ($response eq '4') {
- system("cat scripts/misc/marc_datas/unimarc_uk/structure_def.sql | $mysqldir/bin/mysql '-u$user' '$database'");
- }
- delete($ENV{"KOHA_CONF"});
-
- print RESET."\nFinished updating of database. Press <ENTER> to continue..." unless ($auto_install->{NoPressEnter});
- <STDIN> unless ($auto_install->{NoPressEnter});
-}
-
-
-=item C<populatedatabase(;$)>
-
-Populates the non-MARC tables and installs sample data,
-if wanted.
-
-=cut
-
-$messages->{'ConfirmFileUpload'}->{en} = qq|
-Confirm loading of this file into Koha [Y]/N: |;
-
-sub populatedatabase (;$) {
- my ($auto_install) = @_;
- my $input;
- my $response;
- my $branch='MAIN';
- if ($auto_install->{BranchName}) {
- $branch=$auto_install->{BranchName};
- print ON_YELLOW.BLACK."auto-setting a branch : $branch".RESET."\n";
- } else {
- $response=showmessage(getmessage('AddBranchPrinter'), 'yn', 'y');
- unless ($response =~/^n/i) {
- $branch=showmessage(getmessage('BranchName', [$branch]), 'free', $branch, 1);
- $branch=~s/[^A-Za-z0-9\s]//g;
- }
- }
- if ($branch) {
- my $branchcode=$branch;
- $branchcode=~s/[^A-Za-z0-9]//g;
- $branchcode=uc($branchcode);
- $branchcode=substr($branchcode,0,4);
- if ($auto_install->{BranchCode}) {
- $branchcode=$auto_install->{BranchCode};
- print ON_YELLOW.BLACK."auto-setting branch code : $branchcode".RESET."\n";
- } else {
- $branchcode=showmessage(getmessage('BranchCode', [$branchcode]), 'free', $branchcode, 1);
- }
- $branchcode=~s/[^A-Za-z0-9]//g;
- $branchcode=uc($branchcode);
- $branchcode=substr($branchcode,0,4);
- $branchcode or $branchcode='DEF';
-
- startsysout();
- system("$mysqldir/bin/mysql '-u$user' -e \"insert into branches (branchcode,branchname,issuing) values ('$branchcode', '$branch', 1)\" $database");
- system("$mysqldir/bin/mysql '-u$user' -e \"insert into branchrelations (branchcode,categorycode) values ('MAIN', 'IS')\" $database");
- system("$mysqldir/bin/mysql '-u$user' -e \"insert into branchrelations (branchcode,categorycode) values ('MAIN', 'CU')\" $database");
-
- my $printername='lp';
- my $printerqueue='/dev/lp0';
- if ($auto_install->{PrinterName}) {
- $printername=$auto_install->{PrinterName};
- print ON_YELLOW.BLACK."auto-setting a printer : $printername".RESET."\n";
- } else {
- $printername=showmessage(getmessage('PrinterName', [$printername]), 'free', $printername, 1);
- $printername=~s/[^A-Za-z0-9\s]//g;
- }
- if ($auto_install->{PrinterQueue}) {
- $printerqueue=$auto_install->{PrinterQueue};
- print ON_YELLOW.BLACK."auto-setting printer queue to : $printerqueue".RESET."\n";
- } else {
- $printerqueue=showmessage(getmessage('PrinterQueue', [$printerqueue]), 'free', $printerqueue, 1);
- $printerqueue=~s/[^A-Za-z0-9]//g;
- }
- startsysout();
- system("$mysqldir/bin/mysql '-u$user' -e \"insert into printers (printername,printqueue,printtype) values ('$printername', '$printerqueue', '')\" $database");
- }
- my $language;
- if ($auto_install->{Language}) {
- $language=$auto_install->{Language};
- print ON_YELLOW.BLACK."auto-setting language to : $language".RESET."\n";
- } else {
- $language=showmessage(getmessage('Language'), 'free', 'en');
- }
- startsysout();
- system("$mysqldir/bin/mysql '-u$user' -e \"update systempreferences set value='$language' where variable='opaclanguages'\" $database");
- my @dirs;
- if (-d "scripts/misc/sql-datas") {
- # ask for directory to look for files to append
- my @directories;
- push @directories,"FINISHED";
- if (-d "scripts/misc/sql-datas") {
- opendir D, "scripts/misc/sql-datas";
- foreach my $dir (readdir D) {
- next if ($dir =~ /^\./);
- push @directories, $dir;
- }
- }
- my $loopend=0;
- while (not $loopend) {
- print heading("SELECT SQL DIRECTORY");
- print qq|
-Select a directory. You will see every file included in this directory and be able to choose file(s) to import into Koha
-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.
-Choose wisely.
-|;
- for (my $i=0;$i<=$#directories;$i++) {
- print "$i => ".$directories[$i]."\n";
- }
- my $sqluploaddir =<STDIN>;
- if ($sqluploaddir==0) {
- $loopend = 1;
- } else {
- $sqluploaddir = $directories[$sqluploaddir];
- # CHECK for any other file to append...
- my @sql;
- push @sql,"FINISHED";
- if (-d "scripts/misc/sql-datas/$sqluploaddir") {
- opendir D, "scripts/misc/sql-datas/$sqluploaddir";
- foreach my $sql (readdir D) {
- next unless ($sql =~ /.txt$/);
- push @sql, $sql;
- }
- }
- $loopend=0;
- while (not $loopend) {
- print heading("SELECT SQL FILE");
- print qq|
-Select a file to append to the Koha DB.
-enter a number. A detailled explanation of the file will be given
-if you confirm, the file will be added to the DB
-|;
- for (my $i=0;$i<=$#sql;$i++) {
- print "$i => ".$sql[$i]."\n";
- }
- my $response =<STDIN>;
- if ($response==0) {
- $loopend = 1;
- } else {
- # show the content of the file
- my $FileToUpload = $sql[$response];
- open FILE,"scripts/misc/sql-datas/$sqluploaddir/$FileToUpload";
- my $content = <FILE>;
- print heading("INSERT $sqluploaddir/$FileToUpload ?")."$content\n";
- # ask confirmation
- $response=showmessage(getmessage('ConfirmFileUpload'), 'yn', 'y');
- # if confirmed, upload the file in the DB
- unless ($response =~/^n/i) {
- $FileToUpload =~ s/\.txt/\.sql/;
- system("$mysqldir/bin/mysql '-u$user' '$database' <scripts/misc/sql-datas/$sqluploaddir/$FileToUpload");
- }
- }
- }
- $loopend=0;
- }
- }
- }
-}
-
-=item C<restartapache(;$)>
-
-Asks the user whether to restart Apache, and restarts it if the user
-wants so.
-
-=cut
-
-$messages->{'RestartApache'}->{en} = heading('RESTART APACHE') . qq|
-The web server daemon needs to be restarted to load the new configuration for Koha.
-The installer can do this if you are using Apache and give the root password.
-
-Would you like to try to restart Apache now? [Y]/N: |;
-
-sub restartapache (;$) {
- my ($auto_install)=@_;
- my $response;
- $response=showmessage(getmessage('RestartApache'), 'yn', 'y') unless ($auto_install->{NoPressEnter});
- $response='y' if ($auto_install->{NoPressEnter});
-
- unless ($response=~/^n/i) {
- startsysout();
- # Need to support other init structures here?
- if (-e "/etc/rc.d/init.d/httpd") {
- system('su root -c "/etc/rc.d/init.d/httpd restart"');
- } elsif (-e "/etc/init.d/apache") {
- system('su root -c "/etc/init.d/apache restart"');
- } elsif (-e "/etc/init.d/apache-ssl") {
- system('su root -c "/etc/init.d/apache-ssl restart"');
- }
- }
-}
-
-=item C<backupkoha(;$)>
-
-Attempts to make backup copies of all koha's details.
-
-=cut
-
-$messages->{'BackupDir'}->{en} = heading('BACKUP STORAGE').qq|
-The upgrader will now try to backup your old files.
-
-Please specify a directory to store the backup in [%s]: |;
-
-$messages->{'BackupSummary'}->{en} = heading('BACKUP SUMMARY').qq|
-Backed up:
-
-%6d biblio entries
-%6d biblioitems entries
-%6d items entries
-%6d borrowers
-
-File Listing
----------------------------------------------------------------------
-%s
----------------------------------------------------------------------
-
-Does this look right? ([Y]/N): |;
-
-#FIXME: rewrite to use Install.pm
-sub backupkoha () {
-if (!$ENV{prefix}) { $ENV{prefix} = "/usr/local"; }
-my $backupdir=$ENV{prefix}.'/backups';
-
-my $answer = showmessage(getmessage('BackupDir',[$backupdir]),'free',$backupdir);
-$backupdir = $answer;
-
-if (! -e $backupdir) {
- my $result=mkdir ($backupdir, oct(770));
- if ($result==0) {
- my @dirs = split(m#/#, $backupdir);
- my $checkdir='';
- foreach (@dirs) {
- $checkdir.="$_/";
- unless (-e "$checkdir") {
- mkdir($checkdir, 0775);
- }
- }
- }
-}
-
-chmod 0770, $backupdir;
-
-# Backup MySql database
-#
-#
-my $mysqldir = getmysqldir();
-
-my ($sec, $min, $hr, $day, $month, $year) = (localtime(time))[0,1,2,3,4,5];
-$month++;
-$year+=1900;
-my $date= sprintf "%4d-%02d-%02d_%02d:%02d:%02d", $year, $month, $day,$hr,$min,$sec;
-
-setmysqlclipass($pass);
-open (MD, "$mysqldir/bin/mysqldump --user=$user --host=$hostname $database|");
-
-(open BF, ">$backupdir/Koha.backup_$date") || (die "Error opening up backup file $backupdir/Koha.backup_$date: $!\n");
-
-my $itemcounter=0;
-my $bibliocounter=0;
-my $biblioitemcounter=0;
-my $membercounter=0;
-
-while (<MD>) {
- (/insert into items /i) && ($itemcounter++);
- (/insert into biblioitems /i) && ($biblioitemcounter++);
- (/insert into biblio /i) && ($bibliocounter++);
- (/insert into borrowers /i) && ($membercounter++);
- print BF $_;
-}
-
-close BF;
-close MD;
-
-my $filels=`ls -hl $backupdir/Koha.backup_$date`;
-chomp $filels;
-$answer = showmessage(getmessage('BackupSummary',[$bibliocounter, $biblioitemcounter, $itemcounter, $membercounter, $filels]),'yn');
-
-if ($answer=~/^n/i) {
- print qq|
-
-Aborting. The database dump is located in:
-
- $backupdir/Koha.backup_$date
-
-|;
- exit;
-} else {
- print "Great! continuing upgrade... \n";
-};
-
-
-
-}
-
-=item C<finalizeconfigfile()>
-
-Renames F<koha.conf.tmp> file to F<koha.conf>.
-
-This file must be renamed when the installation is complete,
-Currently, failure to rename the file results only in a warning.
-
-=cut
-
-sub finalizeconfigfile {
- restoremycnf();
- rename "$etcdir/koha.conf.tmp", "$etcdir/koha.conf"
- || showmessage(<<EOF, 'PressEnter', undef, 1);
-An unexpected error, $!, occurred
-while the Koha config file is being saved to its final location,
-$etcdir/koha.conf.
-
-Couldn't rename file at $etcdir. Must have write capability.
-
-Press Enter to continue.
-EOF
-#'
-}
-
-
-=item C<loadconfigfile()>
-
-Opens the existing koha.conf file and gets its values, saving the
-values to some global variables. If the existing koha.conf file
-cannot be opened for any reason, the file is silently ignored.
-
-=cut
-
-sub loadconfigfile () {
- my %configfile;
-
- #MJR: reverted to r1.53. Please call setetcdir(). Do NOT hardcode this.
- #FIXME: make a dated backup
- open (KC, "<$etcdir/koha.conf");
- while (<KC>) {
- chomp;
- (next) if (/^\s*#/);
- if (/(.*)\s*=\s*(.*)/) {
- my $variable=$1;
- my $value=$2;
- # Clean up white space at beginning and end
- $variable=~s/^\s*//g;
- $variable=~s/\s*$//g;
- $value=~s/^\s*//g;
- $value=~s/\s*$//g;
- $configfile{$variable}=$value;
- }
- }
-
- #MJR: Reverted this too. You do not mess with my privates. Please ask for new functions if required.
- $intranetdir=$configfile{'intranetdir'};
- $opacdir=$configfile{'opacdir'};
- $kohaversion=$configfile{'kohaversion'};
- $kohalogdir=$configfile{'kohalogdir'};
- $database=$configfile{'database'};
- $hostname=$configfile{'hostname'};
- $user=$configfile{'user'};
- $pass=$configfile{'pass'};
-}
-
-END { } # module clean-up code here (global destructor)
-
-### These things may move
-
-sub setecho {
-my $state=shift;
-my $t = POSIX::Termios->new;
-
-$t->getattr();
-if ($state) {
- $t->setlflag(($t->getlflag) | &POSIX::ECHO);
- }
-else {
- $t->setlflag(($t->getlflag) & !(&POSIX::ECHO));
- }
-$t->setattr();
-}
-
-sub setmysqlclipass {
- my $pass = shift;
- open(MYCNF,">$mycnf");
- chmod(0600,$mycnf);
- print MYCNF "[client]\npassword=$pass\n";
- close(MYCNF);
-}
-
-sub backupmycnf {
- if (-e $mycnf) {
- rename $mycnf,$mytmpcnf;
- }
-}
-
-sub restoremycnf {
- if (defined $mycnf && -e $mycnf) {
- unlink($mycnf);
- }
- if (defined $mytmpcnf && -e $mytmpcnf) {
- rename $mytmpcnf,$mycnf;
- }
-}
-
-=back
-
-=head1 SEE ALSO
-
-buildrelease.pl
-installer.pl
-koha.upgrade
-
-=cut
-
-1;