package Install; #assumes Install.pm

use strict;
require Exporter;

use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);

# set the version for version checking
$VERSION = 0.01;

@ISA = qw(Exporter);
@EXPORT = qw(	&checkperlmodules
		&getmessage
		&showmessage
		&releasecandidatewarning
		&getinstallationdirectories
		&getdatabaseinfo
		&getapacheinfo
		&getapachevhostinfo
		&updateapacheconf
		&basicauthentication
		&installfiles
		&databasesetup
		&restartapache
		&loadconfigfile
		);


my $messages;
$messages->{'continuing'}->{en}="Great!  Continuing setup.\n\n";
$messages->{'WelcomeToKohaInstaller'}->{en}=qq|
=================================
= Welcome to the Koha Installer =
=================================

Welcome to the Koha install script!  This script will prompt you for some
basic information about your desired setup, then install Koha according to
your specifications.  To accept the default value for any question, simply hit
Enter at the prompt.

Please be sure to read the documentation, or visit the Koha website at 
http://www.koha.org for more information.

Are you ready to begin the installation? (Y/[N]): |;
$messages->{'ReleaseCandidateWarning'}->{en}=qq|
=====================
= RELEASE CANDIDATE =
=====================

WARNING WARNING WARNING WARNING WARNING

You are about to install Koha version %s.  This version of Koha is a
release candidate.  It is not intended to be installed on production systems.
It is being released so that users can test it before we release a final
version.

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'

Press the <ENTER> key to continue: |;

$messages->{'CheckingPerlModules'}->{en}=qq|

==================
= PERL & MODULES =
==================

Checking perl modules ...
|;

$messages->{'PerlVersionFailure'}->{en}="Sorry, you need at least Perl %s\n";

$messages->{'MissingPerlModules'}->{en}=qq|

========================
= MISSING PERL MODULES =
========================

You are missing some Perl modules which are required by Koha.
Once these modules have been installed, rerun this installer.
They can be installed by running (as root) the following:

%s
|;
$messages->{'AllPerlModulesInstalled'}->{en}=qq|

==============================
= ALL PERL MODULES INSTALLED =
==============================

All mandatory 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}=qq|
==========================
= Koha already installed =
==========================

It looks like Koha is already installed on your system (/etc/koha.conf exists
already).  If you would like to upgrade your system to %s, please use
the koha.upgrade script in this directory.

%s

|;
$messages->{'GetOpacDir'}->{en}=qq|
==================
= OPAC DIRECTORY =
==================

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}=qq|
=================================
= INTRANET/LIBRARIANS DIRECTORY =
=================================

Please supply the directory you want Koha to store its Intranet/Librarians
files in.  This directory will be auto-created for you if it doesn't exist.

Intranet Directory [%s]: |;

$messages->{'GetKohaLogDir'}->{en}=qq|
======================
= KOHA LOG DIRECTORY =
======================

Specify a log directory where any Koha daemons can create log files.

Koha Log Directory [%s]: |;

$messages->{'AuthenticationWarning'}->{en}=qq|
==================
= Authentication =
==================

This release of Koha has a new authentication module.  If you are not already
using basic authentication on your intranet, you will be required to log in to
access some of the features of the intranet.  You can log in using the userid
and password from the /etc/koha.conf configuration file at any time.  Use the
"Members" module to add passwords for other accounts and set their permissions.

[NOTE PERMISSIONS ARE NOT COMPLETED AS OF THIS RELEASE.  Do not give passwords
to any patrons unless you want them to have full access to your intranet.]

Press the <ENTER> key to continue: |;

$messages->{'Completed'}->{en}=qq|
==============================
= KOHA INSTALLATION COMPLETE =
==============================

Congratulations ... your Koha installation is complete!

You will be able to connect to your Librarian interface at:

   http://%s\:%s/

and the OPAC interface at :

   http://%s\:%s/


Be sure to read the INSTALL, and Hints files. 

For more information visit http://www.koha.org

Press <ENTER> to exit the installer: |;

sub releasecandidatewarning {
    my $message=getmessage('ReleaseCandidateWarning', [$::kohaversion, $::kohaversion]);
    my $answer=showmessage($message, 'yn', 'n');

    if ($answer =~ /y/i) {
	print getmessage('continuing');
    } else {
	my $message=getmessage('WatchForReleaseAnnouncements');
	print $message;
	exit;
    };
}


#
# Test for Perl and Modules
#
#
sub checkperlmodules {
    my $message = getmessage('CheckingPerlModules');
    showmessage($message, 'none');
    
    unless (eval "require 5.6.0") {
	die getmessage('PerlVersionFailure', ['5.6.0']);
    }

    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 Set::Scalar})       { push @missing,"Set::Scalar" };
    unless (eval {require Net::Z3950})        { 
	my $message = getmessage('NETZ3950Missing');
	showmessage($message, 'PressEnter', '', 1);
	if ($#missing>=0) {
	    push @missing, "Net::Z3950";
	}
    }

#
# Print out a list of any missing modules
#

    if (@missing > 0) {
	my $missing='';
	foreach my $module (@missing) {
	    $missing.="   perl -MCPAN -e 'install \"$module\"'\n";
	}
	my $message=getmessage('MissingPerlModules', [$missing]);
	showmessage($message, 'none');
	exit;
    } else {
	showmessage(getmessage('AllPerlModulesInstalled'), 'PressEnter', '', 1);
    }


}


sub getmessage {
    my $messagename=shift;
    my $variables=shift;
    my $message=$messages->{$messagename}->{$::language} || $messages->{$messagename}->{en} || "Error: No message named $messagename in Install.pm\n";
    if (defined($variables)) {
	$message=sprintf $message, @$variables;
    }
    return $message;
}


sub showmessage {
    my $message=shift;
    my $responsetype=shift;
    my $defaultresponse=shift;
    my $noclear=shift;
    ($noclear) || (system('clear'));
    if ($responsetype =~ /^yn$/) {
	$responsetype='restrictchar yn';
    }
    print $message;
    SWITCH: {
	if ($responsetype =~/^restrictchar (.*)/i) {
	    my $response='\0';
	    my $options=$1;
	    until ($options=~/$response/) {
		($defaultresponse) || ($defaultresponse=substr($options,0,1));
		$response=<STDIN>;
		chomp $response;
		(length($response)) || ($response=$defaultresponse);
		unless ($options=~/$response/) {
		    ($noclear) || (system('clear'));
		    print "Invalid Response.  Choose from [$options].\n\n";
		    print $message;
		}
	    }
	    return $response;
	}
	if ($responsetype =~/^free$/i) {
	    (defined($defaultresponse)) || ($defaultresponse='');
	    my $response=<STDIN>;
	    chomp $response;
	    ($response) || ($response=$defaultresponse);
	    return $response;
	}
	if ($responsetype =~/^numerical$/i) {
	    (defined($defaultresponse)) || ($defaultresponse='');
	    my $response='';
	    until ($response=~/^\d+$/) {
		$response=<STDIN>;
		chomp $response;
		($response) || ($response=$defaultresponse);
		unless ($response=~/^\d+$/) {
		    ($noclear) || (system('clear'));
		    print "Invalid Response ($response).  Response must be a number.\n\n";
		    print $message;
		}
	    }
	    return $response;
	}
	if ($responsetype =~/^email$/i) {
	    (defined($defaultresponse)) || ($defaultresponse='');
	    my $response='';
	    until ($response=~/.*\@.*\..*/) {
		$response=<STDIN>;
		chomp $response;
		($response) || ($response=$defaultresponse);
		unless ($response=~/.*\@.*\..*/) {
		    ($noclear) || (system('clear'));
		    print "Invalid Response ($response).  Response must be a valid email address.\n\n";
		    print $message;
		}
	    }
	    return $response;
	}
	if ($responsetype =~/^PressEnter$/i) {
	    <STDIN>;
	    return;
	}
	if ($responsetype =~/^none$/i) {
	    return;
	}
    }
}

sub getinstallationdirectories {
    $::opacdir = '/usr/local/koha/opac';
    $::intranetdir = '/usr/local/koha/intranet';
    my $getdirinfo=1;
    while ($getdirinfo) {
	# Loop until opac directory and koha directory are different
	my $message=getmessage('GetOpacDir', [$::opacdir]);
	$::opacdir=showmessage($message, 'free', $::opacdir);

	$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='/var/log/koha';
    my $message=getmessage('GetKohaLogDir', [$::kohalogdir]);
    $::kohalogdir=showmessage($message, 'free', $::kohalogdir);


    unless ( -d $::intranetdir ) {
       my $result=mkdir ($::intranetdir, oct(770));
       if ($result==0) {
	   my @dirs = split(m#/#, $::intranetdir);
	    my $checkdir='';
	    foreach (@dirs) {
		$checkdir.="$_/";
		unless (-e "$checkdir") {
		    mkdir($checkdir, 0775);
		}
	    }
       }
       chown (oct(0), (getgrnam($::httpduser))[2], "$::intranetdir");
       chmod (oct(770), "$::intranetdir");
    }
    unless ( -d "$::intranetdir/htdocs" ) {
       mkdir ("$::intranetdir/htdocs", oct(750));
    }
    unless ( -d "$::intranetdir/cgi-bin" ) {
       mkdir ("$::intranetdir/cgi-bin", oct(750));
    }
    unless ( -d "$::intranetdir/modules" ) {
       mkdir ("$::intranetdir/modules", oct(750));
    }
    unless ( -d "$::intranetdir/scripts" ) {
       mkdir ("$::intranetdir/scripts", oct(750));
    }
    unless ( -d $::opacdir ) {
       my $result=mkdir ($::opacdir, oct(770));
       if ($result==0) {
	   my @dirs = split(m#/#, $::opacdir);
	    my $checkdir='';
	    foreach (@dirs) {
		$checkdir.="$_/";
		unless (-e "$checkdir") {
		    mkdir($checkdir, 0775);
		}
	    }
       }
       chown (oct(0), (getgrnam($::httpduser))[2], "$::opacdir");
       chmod (oct(770), "$::opacdir");
    }
    unless ( -d "$::opacdir/htdocs" ) {
       mkdir ("$::opacdir/htdocs", oct(750));
    }
    unless ( -d "$::opacdir/cgi-bin" ) {
       mkdir ("$::opacdir/cgi-bin", oct(750));
    }


    unless ( -d $::kohalogdir ) {
       my $result=mkdir ($::kohalogdir, oct(770));
       if ($result==0) {
	   my @dirs = split(m#/#, $::kohalogdir);
	    my $checkdir='';
	    foreach (@dirs) {
		$checkdir.="$_/";
		unless (-e "$checkdir") {
		    mkdir($checkdir, 0775);
		}
	    }
       }

       chown (oct(0), (getgrnam($::httpduser))[2,3], "$::kohalogdir");
       chmod (oct(770), "$::kohalogdir");
    }
}



$messages->{'DatabaseName'}->{en}=qq|
==========================
= Name of MySQL database =
==========================

Please provide the name of the mysql database for your koha installation.

Database name [%s]: |;

$messages->{'DatabaseHost'}->{en}=qq|
=================
= Database Host =
=================

Please provide the hostname for mysql.  Unless the database is located on
another machine this will be "localhost".

Database host [%s]: |;

$messages->{'DatabaseUser'}->{en}=qq|
=================
= Database User =
=================

Please provide the name of the user, who will have full administrative rights
to the %s database, when authenticating from %s.

Database user [%s]: |;

$messages->{'DatabasePassword'}->{en}=qq|
=====================
= Database Password =
=====================

Please provide a good password for the user %s.

Database Password: |;

$messages->{'BlankPassword'}->{en}=qq|
==================
= BLANK PASSWORD =
==================

You must not use a blank password for your MySQL user!

Press <ENTER> to try again: 
|;

sub getdatabaseinfo {

    $::dbname = 'Koha';
    $::hostname = 'localhost';
    $::user = 'kohaadmin';
    $::pass = '';

#Get the database name

    my $message=getmessage('DatabaseName', [$::dbname]);
    $::dbname=showmessage($message, 'free', $::dbname);

#Get the hostname for the database
    
    $message=getmessage('DatabaseHost', [$::hostname]);
    $::hostname=showmessage($message, 'free', $::hostname);

#Get the username for the database

    $message=getmessage('DatabaseUser', [$::dbname, $::hostname, $::user]);
    $::user=showmessage($message, 'free', $::user);

#Get the password for the database user

    while ($::pass eq '') {
	my $message=getmessage('DatabasePassword', [$::user]);
	$::pass=showmessage($message, 'free', $::pass);
	if ($::pass eq '') {
	    my $message=getmessage('BlankPassword');
	    showmessage($message,'PressEnter');
	}
    }
}



$messages->{'FoundMultipleApacheConfFiles'}->{en}=qq|
================================
= MULTIPLE APACHE CONFIG FILES =
================================

I found more than one possible Apache configuration file:

%s

Choose the correct file [1]: |;

$messages->{'NoApacheConfFiles'}->{en}=qq|
===============================
= NO APACHE CONFIG FILE FOUND =
===============================

I was not able to find your Apache configuration file.

The file is usually called httpd.conf or apache.conf.

Please specify the location of your config file: |;

$messages->{'NotAFile'}->{en}=qq|
=======================
= FILE DOES NOT EXIST =
=======================

The file %s does not exist.

Please press <ENTER> to continue: |;

$messages->{'EnterApacheUser'}->{en}=qq|
====================
= NEED APACHE USER =
====================

I was not able to determine the user that Apache is running as.  This
information is necessary in order to set the access privileges correctly on
/etc/koha.conf.  This user should be set in one of the Apache configuration
files using the "User" directive.

Enter the Apache userid: |;

$messages->{'InvalidUserid'}->{en}=qq|
==================
= INVALID USERID =
==================

The userid %s is not a valid userid on this system.

Press <ENTER> to continue: |;

sub getapacheinfo {
    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/apache/conf/httpd.conf
			  /etc/apache/conf/apache.conf
			  /etc/apache-ssl/conf/apache.conf
			  /etc/httpd/conf/httpd.conf
			  /etc/httpd/httpd.conf)) {
	if ( -f $httpdconf ) {
	    push @confpossibilities, $httpdconf;
	}
    }

    if ($#confpossibilities==-1) {
	my $message=getmessage('NoApacheConfFiles');
	my $choice='';
	until (-f $choice) {
	    $choice=showmessage($message, "free", 1);
	    unless (-f $choice) {
		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];
    }
    open (HTTPDCONF, $::realhttpdconf) or warn "Insufficient privileges to open $::realhttpdconf for reading.\n";
    while (<HTTPDCONF>) {
	if (/^\s*User\s+"?([-\w]+)"?\s*$/) {
	    $::httpduser = $1;
	}
    }
    close(HTTPDCONF);




    unless ($::httpduser) {
	my $message=getmessage('EnterApacheUser');
	until (length($::httpduser) && getpwnam($::httpduser)) {
	    $::httpduser=showmessage($message, "free", '');
	    if (length($::httpduser)>0) {
		unless (getpwnam($::httpduser)) {
		    my $message=getmessage('InvalidUserid', [$::httpduser]);
		    showmessage($message,'PressEnter');
		}
	    } else {
	    }
	}
	print "AU: $::httpduser\n";
    }
}


$messages->{'ApacheConfigIntroduction'}->{en}=qq|
========================
= APACHE CONFIGURATION =
========================

Koha needs to setup your Apache configuration file for the
OPAC and LIBRARIAN virtual hosts.  By default this installer
will do this by using one ip address and two different ports
for the virtual hosts.  There are other ways to set this up,
and the installer will leave comments in httpd.conf detailing
what these other options are.


Press <ENTER> to continue: |;

$messages->{'GetVirtualHostEmail'}->{en}=qq|
=============================
= WEB SERVER E-MAIL CONTACT =
=============================

Enter the e-mail address to be used as a contact for the virtual hosts (this
address is displayed if any errors are encountered).

E-mail contact [%s]: |;

$messages->{'GetServerName'}->{en}=qq|
======================================
= WEB SERVER HOST NAME OR IP ADDRESS =
======================================

Please enter the domain name or ip address of your computer.

Host name or IP Address [%s]: |;

$messages->{'GetOpacPort'}->{en}=qq|
==========================
= OPAC VIRTUAL HOST PORT =
==========================

Please enter the port for your OPAC interface.  This defaults to port 80, but
if you are already serving web content from this server, you should change it
to a different port (8000 might be a good choice).

Enter the OPAC Port [%s]: |;

$messages->{'GetIntranetPort'}->{en}=qq|
==============================
= INTRANET VIRTUAL HOST PORT =
==============================

Please enter the port for your Intranet interface.  This must be different from
the OPAC port (%s).

Enter the Intranet Port [%s]: |;


sub getapachevhostinfo {

    $::svr_admin = "webmaster\@$::domainname";
    $::servername=`hostname -f`;
    chomp $::servername;
    $::opacport=80;
    $::intranetport=8080;

    showmessage(getmessage('ApacheConfigIntroduction'), 'PressEnter');

    $::svr_admin=showmessage(getmessage('GetVirtualHostEmail', [$::svr_admin]), 'email', $::svr_admin);
    $::servername=showmessage(getmessage('GetServerName', [$::servername]), 'free', $::servername);


    $::opacport=showmessage(getmessage('GetOpacPort', [$::opacport]), 'numerical', $::opacport);
    $::intranetport=showmessage(getmessage('GetIntranetPort', [$::opacport, $::intranetport]), 'numerical', $::intranetport);

}

$messages->{'StartUpdateApache'}->{en}=qq|
=================================
= UPDATING APACHE CONFIGURATION =
=================================

Checking for modules that need to be loaded...
|;

$messages->{'LoadingApacheModuleModEnv'}->{en}="Loading SetEnv Apache module.\n";

$messages->{'LoadingApacheModuleModInc'}->{en}="Loading Includes Apache module.\n";

$messages->{'ApacheConfigBackupFailed'}->{en}=qq|
======================================
= APACHE CONFIGURATION BACKUP FAILED =
======================================

An error occurred while trying to make a backup copy of %s.

  %s

No changes will be made to the apache configuration file at this time.

Press <ENTER> to continue: |;


$messages->{'ApacheAlreadyConfigured'}->{en}=qq|
=============================
= APACHE ALREADY CONFIGURED =
=============================

%s appears to already have an entry for Koha
Virtual Hosts.  You may need to edit %s
f 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 $logfiledir=`grep ^ErrorLog $::realhttpdconf`;
    chomp $logfiledir;

    if ($logfiledir) {
	$logfiledir=~m#ErrorLog (.*)/[^/]*$#;
	$logfiledir=$1;
    }

    unless ($logfiledir) {
	$logfiledir='logs';
    }

    showmessage(getmessage('StartUpdateApache'), 'none');

    my $httpdconf;
    my $envmodule=0;
    my $includesmodule=0;
    open HC, $::realhttpdconf;
    while (<HC>) {
	if (/^\s*#\s*LoadModule env_module /) {
	    s/^\s*#\s*//;
	    showmessage(getmessage('LoadingApacheModuleModEnv'));
	    $envmodule=1;
	}
	if (/^\s*#\s*LoadModule includes_module /) {
	    s/^\s*#\s*//;
	    showmessage(getmessage('LoadingApacheModuleModInc'));
	}
	if (/\s*LoadModule includes_module / ) {
	    $includesmodule=1;
	}
	$httpdconf.=$_;
    }

    my $backupfailed=0;
    $backupfailed=`cp -f $::realhttpdconf $::realhttpdconf\.prekoha`;
    if ($backupfailed) {
	showmessage(getmessage('ApacheConfigBackupFailed', [$::realhttpdconf,$backupfailed ]), 'PressEnter');
	return;
    }

    if ($envmodule || $includesmodule) {
	open HC, ">$::realhttpdconf";
	print HC $httpdconf;
	close HC;
    }


    
    if (`grep 'VirtualHost $::servername' $::realhttpdconf`) {
	showmessage(getmessage('ApacheAlreadyConfigured', [$::realhttpdconf, $::realhttpdconf]), 'PressEnter');
	return;
    } else {
	my $includesdirectives='';
	if ($includesmodule) {
	    $includesdirectives.="Options +Includes\n";
	    $includesdirectives.="   AddHandler server-parsed .html\n";
	}
	open(SITE,">>$::realhttpdconf") or warn "Insufficient priveleges to open $::realhttpdconf for writing.\n";
	my $opaclisten = '';
	if ($::opacport != 80) {
	    $opaclisten="Listen $::opacport";
	}
	my $intranetlisten = '';
	if ($::intranetport != 80) {
	    $intranetlisten="Listen $::intranetport";
	}
	print SITE <<EOP

# Ports to listen to for Koha
$opaclisten
$intranetlisten

# NameVirtualHost is used by one of the optional configurations detailed below

#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/
   ErrorLog $logfiledir/opac-error_log
   TransferLog $logfiledir/opac-access_log
   SetEnv PERL5LIB "$::intranetdir/modules"
   $includesdirectives
</VirtualHost>

# KOHA's INTRANET Configuration
<VirtualHost $::servername\:$::intranetport>
   ServerAdmin $::svr_admin
   DocumentRoot $::intranetdir/htdocs
   ServerName $::servername
   ScriptAlias /cgi-bin/koha/ "$::intranetdir/cgi-bin/"
   ErrorLog $logfiledir/koha-error_log
   TransferLog $logfiledir/koha-access_log
   SetEnv PERL5LIB "$::intranetdir/modules"
   $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


    }
}

$messages->{'IntranetAuthenticationQuestion'}->{en}=qq|
===========================
= INTRANET AUTHENTICATION =
===========================

I can set it up so that the Intranet/Librarian site is password protected using
Apache's Basic Authorization.

Would you like to do this ([Y]/N): |;

$messages->{'BasicAuthUsername'}->{en}="Please enter a userid for intranet 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', 'y');

    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, ">/etc/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,">>$::realhttpdconf") or warn "Insufficient priveleges to open $::realhttpdconf for writing.\n";
	print SITE <<EOP

<Directory $::intranetdir>
    AuthUserFile /etc/kohaintranet.pass
    AuthType Basic
    AuthName "Koha Intranet (for librarians only)"
    Require  valid-user
</Directory>
EOP
    }
    close(SITE);
}

$messages->{'InstallFiles'}->{en}=qq|
====================
= INSTALLING FILES =
====================

Copying files to installation directories:

|;


$messages->{'CopyingFiles'}->{en}="Copying %s to %s.\n";



sub installfiles {


    showmessage(getmessage('InstallFiles'),'none');
    print getmessage('CopyingFiles', ['internet-html', "$::intranetdir/htdocs" ]);
    system("cp -R intranet-html/* $::intranetdir/htdocs/");
    print getmessage('CopyingFiles', ['internet-cgi', "$::intranetdir/cgi-bin" ]);
    system("cp -R intranet-cgi/* $::intranetdir/cgi-bin/");
    print getmessage('CopyingFiles', ['stand-alone scripts', "$::intranetdir/scripts" ]);
    system("cp -R scripts/* $::intranetdir/scripts/");
    print getmessage('CopyingFiles', ['perl modules', "$::intranetdir/modules" ]);
    system("cp -R modules/* $::intranetdir/modules/");
    print getmessage('CopyingFiles', ['opac-html', "$::opacdir/htdocs" ]);
    system("cp -R opac-html/* $::opacdir/htdocs/");
    print getmessage('CopyingFiles', ['opac-cgi', "$::opacdir/cgi-bin" ]);
    system("cp -R opac-cgi/* $::opacdir/cgi-bin/");

    system("chown -R root.$::httpduser $::opacdir");
    system("chown -R root.$::httpduser $::intranetdir");

    # Create /etc/koha.conf

    open(KC,">$::etcdir/koha.conf") or warn "Couldn't create file
    at $::etcdir.  Must have write capability.\n";
    print KC qq|
database=$::dbname
hostname=$::hostname
user=$::user
pass=$::pass
includes=$::intranetdir/htdocs/includes
intranetdir=$::intranetdir
opacdir=$::opacdir
kohalogdir=$::kohalogdir
kohaversion=$::kohaversion
httpduser=$::httpduser
|;
    close(KC);

    chown((getpwnam($::httpduser)) [2,3], "$::etcdir/koha.conf") or warn "can't chown koha.conf: $!";
    chmod 0440, "$::etcdir/koha.conf";

    chmod 0750, "$::intranetdir/scripts/z3950daemon/z3950-daemon-launch.sh";
    chmod 0750, "$::intranetdir/scripts/z3950daemon/z3950-daemon-shell.sh";
    chmod 0750, "$::intranetdir/scripts/z3950daemon/processz3950queue";
    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: $!";

}

$messages->{'MysqlRootPassword'}->{en}=qq|
============================
= MYSQL ROOT USER PASSWORD =
============================

To allow us to create the koha database please supply your
mysql server's root user password:

Enter MySql root user password: |;

$messages->{'InvalidMysqlRootPassword'}->{en}="Invalid Password.  Please try again.";

$messages->{'CreatingDatabase'}->{en}=qq|
=====================
= CREATING DATABASE =
=====================

Creating the MySql database for Koha...

|;

$messages->{'CreatingDatabaseError'}->{en}=qq|
===========================
= ERROR CREATING DATABASE =
===========================

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}=qq|
===============
= SAMPLE DATA =
===============

If you are installing Koha for evaluation purposes,  I have a batch of sample
data that you can install now.

If you are installing Koha with the intention of populating it with 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}=qq|
=========================
= SAMPLE DATA INSTALLED =
=========================

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}=qq|
==========================
= Add Branch and Printer =
==========================

Would you like to install 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 $mysqldir;
    $::mysqluser = 'root';
    $::mysqlpass = '';

    foreach my $mysql (qw(/usr/local/mysql
			  /opt/mysql
			  )) {
       if ( -d $mysql ) {
		$mysqldir=$mysql;
       }
    }
    if (!$mysqldir){
	$mysqldir='/usr';
    }


    my $needpassword=1;
    while ($needpassword) {
	$::mysqlpass=showmessage(getmessage('MysqlRootPassword'), 'free');
	my $result=system("$mysqldir/bin/mysqladmin -u$::mysqluser -p$::mysqlpass proc > /dev/null 2>&1");
	if ($result) {
	    print getmessage('InvalidMysqlRootPassword');
	} else {
	    $needpassword=0;
	}
    }

    showmessage(getmessage('CreatingDatabase'),'none');

    my $result=system("$mysqldir/bin/mysqladmin -u$::mysqluser -p$::mysqlpass create $::dbname");
    if ($result) {
	showmessage(getmessage('CreatingDatabaseError'),'PressEnter', '', 1);
    } else {
	system("$mysqldir/bin/mysql -u$::mysqluser -p$::mysqlpass $::dbname < koha.mysql");
	system("$mysqldir/bin/mysql -u$::mysqluser -p$::mysqlpass mysql -e \"insert into user (Host,User,Password) values ('$::hostname','$::user',password('$::pass'))\"\;");
	system("$mysqldir/bin/mysql -u$::mysqluser -p$::mysqlpass 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')\"");
	system("$mysqldir/bin/mysqladmin -u$::mysqluser -p$::mysqlpass reload");

	system ("perl -I $::intranetdir/modules scripts/updater/updatedatabase");


	my $response=showmessage(getmessage('SampleData'), 'yn', 'n');
	if ($response =~/^y/i) {
	    system("gunzip sampledata-1.2.gz");
	    system("cat sampledata-1.2 | $mysqldir/bin/mysql -u$::mysqluser -p$::mysqlpass $::dbname");
	    system("gzip -9 sampledata-1.2");
	    system("$mysqldir/bin/mysql -u$::mysqluser -p$::mysqlpass $::dbname -e \"insert into branches (branchcode,branchname,issuing) values ('MAIN', 'Main Library', 1)\"");
	    system("$mysqldir/bin/mysql -u$::mysqluser -p$::mysqlpass $::dbname -e \"insert into printers (printername,printqueue,printtype) values ('Circulation Desk Printer', 'lp', 'hp')\"");
	    showmessage(getmessage('SampleDataInstalled'), 'PressEnter');
	} else {
	    my $input;
	    my $response=showmessage(getmessage('AddBranchPrinter'), 'yn', 'y');

	    unless ($response =~/^n/i) {
		my $branch='Main Library';
		print "Enter a name for the library branch [$branch]: ";
		$branch=showmessage(getmessage('BranchName', [$branch]), 'free', $branch, 1);
		$branch=~s/[^A-Za-z0-9\s]//g;

		my $branchcode=$branch;
		$branchcode=~s/[^A-Za-z0-9]//g;
		$branchcode=uc($branchcode);
		$branchcode=substr($branchcode,0,4);
		$branchcode=showmessage(getmessage('BranchCode', [$branchcode]), 'free', $branchcode, 1);
		$branchcode=~s/[^A-Z]//g;
		$branchcode=uc($branchcode);
		$branchcode=substr($branchcode,0,4);

		system("$mysqldir/bin/mysql -u$::mysqluser -p$::mysqlpass $::dbname -e \"insert into branches (branchcode,branchname,issuing) values ('$branchcode', '$branch', 1)\"");

		my $printername='Library Printer';
		$printername=showmessage(getmessage('PrinterName', [$printername]), 'free', $printername, 1);
		$printername=~s/[^A-Za-z0-9\s]//g;

		my $printerqueue='lp';
		$printerqueue=showmessage(getmessage('PrinterQueue', [$printerqueue]), 'free', $printerqueue, 1);
		$printerqueue=~s/[^A-Za-z0-9]//g;
		system("$mysqldir/bin/mysql -u$::mysqluser -p$::mysqlpass $::dbname -e \"insert into printers (printername,printqueue,printtype) values ('$printername', '$printerqueue', '')\"");

	    }
	}


    }

}

$messages->{'RestartApache'}->{en}=qq|
==================
= RESTART APACHE =
==================

Apache needs to be restarted to load the new configuration for Koha.

Would you like to restart Apache now?  [Y]/N: |;

sub restartapache {

    my $response=showmessage(getmessage('RestartApache'), 'yn', 'y');



    unless ($response=~/^n/i) {
	# Need to support other init structures here?
	if (-e "/etc/rc.d/init.d/httpd") {
	    system('/etc/rc.d/init.d/httpd restart');
	} elsif (-e "/etc/init.d/apache") {
	    system('/etc//init.d/apache restart');
	} elsif (-e "/etc/init.d/apache-ssl") {
	    system('/etc/init.d/apache-ssl restart');
	}
    }

}

sub loadconfigfile {
    my %configfile;

    open (KC, "/etc/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;
     }
    }

    $::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)

