570 lines
14 KiB
Perl
570 lines
14 KiB
Perl
#!/usr/bin/perl -w
|
|
|
|
#use diagnostics;
|
|
use strict; # please develop with the strict pragma
|
|
|
|
|
|
if ($<) {
|
|
print "\n\nYou must run koha.upgrade as root.\n\n";
|
|
exit;
|
|
}
|
|
|
|
my $input;
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
my $intranetdir=$configfile{'intranetdir'};
|
|
my $opacdir=$configfile{'opacdir'};
|
|
my $kohaversion=$configfile{'kohaversion'};
|
|
my $kohalogdir=$configfile{'kohalogdir'};
|
|
my $database=$configfile{'database'};
|
|
my $hostname=$configfile{'hostname'};
|
|
my $user=$configfile{'user'};
|
|
my $pass=$configfile{'pass'};
|
|
|
|
|
|
($kohaversion) || ($kohaversion='unknown version');
|
|
my $newversion=`cat koha.version`;
|
|
chomp $newversion;
|
|
if ($newversion =~ /RC/) {
|
|
print qq|
|
|
=====================
|
|
= RELEASE CANDIDATE =
|
|
=====================
|
|
|
|
WARNING WARNING WARNING WARNING WARNING
|
|
|
|
You are about to install Koha version $newversion. 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.
|
|
|
|
|;
|
|
print "Are you sure you want to install Koha $newversion? (Y/[N]): ";
|
|
|
|
my $answer = <STDIN>;
|
|
chomp $answer;
|
|
|
|
if ($answer eq "Y" || $answer eq "y") {
|
|
print "Great! continuing setup... \n";
|
|
} else {
|
|
print qq|
|
|
|
|
Watch for announcements of Koha releases on the Koha mailing list or the Koha
|
|
web site (http://www.koha.org/).
|
|
|
|
|;
|
|
exit;
|
|
};
|
|
}
|
|
|
|
print qq|
|
|
|
|
================
|
|
= Koha Upgrade =
|
|
================
|
|
|
|
You are attempting to upgrade from Koha $kohaversion to $newversion.
|
|
|
|
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):
|
|
|;
|
|
|
|
my $answer = <STDIN>;
|
|
chomp $answer;
|
|
|
|
if ($answer eq "Y" || $answer eq "y") {
|
|
print "Great! continuing upgrade... \n";
|
|
} else {
|
|
print qq|
|
|
|
|
Aborting. Please re-run koha.upgrade when you are ready to upgrade Koha.
|
|
|;
|
|
exit;
|
|
};
|
|
|
|
|
|
#
|
|
# Test for Perl and Modules
|
|
#
|
|
print qq|
|
|
|
|
PERL & MODULES
|
|
==============
|
|
|
|
|;
|
|
|
|
print "\nChecking perl modules ...\n";
|
|
unless (eval "require 5.004") {
|
|
die "Sorry, you need at least Perl 5.004\n";
|
|
}
|
|
|
|
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 Net::Z3950}) {
|
|
print 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:
|
|
|;
|
|
<STDIN>;
|
|
}
|
|
|
|
#
|
|
# Print out a list of any missing modules
|
|
#
|
|
if (@missing > 0) {
|
|
print "\n\n";
|
|
print "You are missing some Perl modules which are required by Koha.\n";
|
|
print "Once these modules have been installed, rerun this installer.\n";
|
|
print "They can be installed by running (as root) the following:\n";
|
|
foreach my $module (@missing) {
|
|
print " perl -MCPAN -e 'install \"$module\"'\n";
|
|
exit(1);
|
|
}} else{
|
|
print "All modules appear to be installed, continuing...\n";
|
|
};
|
|
|
|
|
|
my $backupdir='/usr/local/koha/backups';
|
|
print "Please specify a backup directory [$backupdir]: ";
|
|
|
|
$answer = <STDIN>;
|
|
chomp $answer;
|
|
|
|
if ($answer) {
|
|
$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 $mysql;
|
|
my $mysqldir;
|
|
|
|
foreach my $mysql (qw(/usr/local/mysql
|
|
/opt/mysql
|
|
)) {
|
|
if ( -d $mysql ) {
|
|
$mysqldir=$mysql;
|
|
}
|
|
}
|
|
if (!$mysqldir){
|
|
$mysqldir='/usr';
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
open (MD, "$mysqldir/bin/mysqldump --user=$user --password=$pass --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;
|
|
printf qq|
|
|
|
|
Backed up:
|
|
|
|
%6d biblio entries
|
|
%6d biblioitems entries
|
|
%6d items entries
|
|
%6d borrowers
|
|
|
|
$filels
|
|
|
|
Does this look right? ([Y]/N):
|
|
|, $bibliocounter, $biblioitemcounter, $itemcounter, $membercounter;
|
|
|
|
$answer = <STDIN>;
|
|
chomp $answer;
|
|
|
|
if ($answer=~/^n/i) {
|
|
print qq|
|
|
|
|
Aborting. The database dump is located in:
|
|
|
|
$backupdir/Koha.backup_$date
|
|
|
|
|;
|
|
exit;
|
|
} else {
|
|
print "Great! continuing upgrade... \n";
|
|
};
|
|
|
|
|
|
|
|
if ($opacdir && $intranetdir) {
|
|
print qq|
|
|
|
|
I believe that your old files are located in:
|
|
|
|
OPAC: $opacdir
|
|
INTRANET: $intranetdir
|
|
|
|
|
|
Does this look right? ([Y]/N):
|
|
|;
|
|
$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 INTRANET files: ";
|
|
|
|
$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: ";
|
|
|
|
$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='';
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
print "\n\nBacking up old Koha scripts...\n";
|
|
print "===============================\n\n";
|
|
|
|
mkdir "$backupdir/kohafiles-$date", 0770;
|
|
mkdir "$backupdir/kohafiles-$date/intranet", 0770;
|
|
mkdir "$backupdir/kohafiles-$date/opac", 0770;
|
|
|
|
my $result=system("cp -R $intranetdir/* $backupdir/kohafiles-$date/intranet/");
|
|
if ($result) {
|
|
print "Error encounted when copying $intranetdir to $backupdir/kohafiles-$date/intranet/\n";
|
|
exit;
|
|
} else {
|
|
system("rm -rf $intranetdir/*");
|
|
}
|
|
$result=system("cp -R $opacdir/* $backupdir/kohafiles-$date/opac/");
|
|
if ($result) {
|
|
print "Error encounted when copying $opacdir to $backupdir/kohafiles-$date/opac/\n";
|
|
exit;
|
|
} else {
|
|
system("rm -rf $opacdir/*");
|
|
}
|
|
|
|
print "Creating $intranetdir/htdocs...\n";
|
|
mkdir ("$intranetdir/htdocs", oct(750));
|
|
print "Creating $intranetdir/cgi-bin...\n";
|
|
mkdir ("$intranetdir/cgi-bin", oct(750));
|
|
print "Creating $intranetdir/modules...\n";
|
|
mkdir ("$intranetdir/modules", oct(750));
|
|
print "Creating $intranetdir/scripts...\n";
|
|
mkdir ("$intranetdir/scripts", oct(750));
|
|
chmod (oct(770), "$opacdir");
|
|
print "Creating $opacdir/htdocs...\n";
|
|
mkdir ("$opacdir/htdocs", oct(750));
|
|
print "Creating $opacdir/cgi-bin...\n";
|
|
mkdir ("$opacdir/cgi-bin", oct(750));
|
|
|
|
my $httpduser;
|
|
my $realhttpdconf;
|
|
|
|
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 ) {
|
|
$realhttpdconf=$httpdconf;
|
|
open (HTTPDCONF, $httpdconf) or warn "Insufficient privileges to open $httpdconf for reading.\n";
|
|
while (<HTTPDCONF>) {
|
|
if (/^\s*User\s+"?([-\w]+)"?\s*$/) {
|
|
$httpduser = $1;
|
|
}
|
|
}
|
|
close(HTTPDCONF);
|
|
}
|
|
}
|
|
|
|
unless ($httpduser) {
|
|
print qq|
|
|
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.
|
|
|;
|
|
print "What is your Apache user? ";
|
|
chomp($input = <STDIN>);
|
|
|
|
if ($input) {
|
|
$httpduser = $input;
|
|
} else {
|
|
$httpduser='Undetermined';
|
|
}
|
|
}
|
|
|
|
print "\n\nINSTALLING KOHA...\n";
|
|
print "\n\n==================\n";
|
|
print "Copying internet-html files to $intranetdir/htdocs...\n";
|
|
system("cp -R intranet-html/* $intranetdir/htdocs/");
|
|
print "Copying intranet-cgi files to $intranetdir/cgi-bin...\n";
|
|
system("cp -R intranet-cgi/* $intranetdir/cgi-bin/");
|
|
print "Copying script files to $intranetdir/scripts...\n";
|
|
system("cp -R scripts/* $intranetdir/scripts/");
|
|
print "Copying module files to $intranetdir/modules...\n";
|
|
system("cp -R modules/* $intranetdir/modules/");
|
|
print "Copying opac-html files to $opacdir/htdocs...\n";
|
|
system("cp -R opac-html/* $opacdir/htdocs/");
|
|
print "Copying opac-cgi files to $opacdir/cgi-bin...\n";
|
|
system("cp -R opac-cgi/* $opacdir/cgi-bin/");
|
|
|
|
system("chown -R root.$httpduser $opacdir");
|
|
system("chown -R root.$httpduser $intranetdir");
|
|
|
|
# LAUNCH SCRIPT
|
|
print "Modifying Z39.50 daemon launch script...\n";
|
|
my $newfile='';
|
|
open (L, "$intranetdir/scripts/z3950daemon/z3950-daemon-launch.sh");
|
|
while (<L>) {
|
|
if (/^RunAsUser=/) {
|
|
$newfile.="RunAsUser=$httpduser\n";
|
|
} elsif (/^KohaZ3950Dir=/) {
|
|
$newfile.="KohaZ3950Dir=$intranetdir/scripts/z3950daemon\n";
|
|
} else {
|
|
$newfile.=$_;
|
|
}
|
|
}
|
|
close L;
|
|
system("mv $intranetdir/scripts/z3950daemon/z3950-daemon-launch.sh $intranetdir/scripts/z3950daemon/z3950-daemon-launch.sh.orig");
|
|
open L, ">$intranetdir/scripts/z3950daemon/z3950-daemon-launch.sh";
|
|
print L $newfile;
|
|
close L;
|
|
|
|
unless ($kohalogdir && -e $kohalogdir) {
|
|
$kohalogdir='/var/log/koha';
|
|
print "\n\nDirectory for logging by Z39.50 daemon [$kohalogdir]: ";
|
|
chomp($input = <STDIN>);
|
|
if ($input) {
|
|
$kohalogdir=$input;
|
|
}
|
|
}
|
|
|
|
unless (-e "$kohalogdir") {
|
|
my $result = mkdir 0770, "$kohalogdir";
|
|
if ($result==0) {
|
|
my @dirs = split(m#/#, $kohalogdir);
|
|
my $checkdir='';
|
|
foreach (@dirs) {
|
|
$checkdir.="$_/";
|
|
unless (-e "$checkdir") {
|
|
mkdir($checkdir, 0775);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
# SHELL SCRIPT
|
|
print "Modifying Z39.50 daemon wrapper script...\n";
|
|
$newfile='';
|
|
open (S, "$intranetdir/scripts/z3950daemon/z3950-daemon-shell.sh");
|
|
while (<S>) {
|
|
if (/^KohaModuleDir=/) {
|
|
$newfile.="KohaModuleDir=$intranetdir/modules\n";
|
|
} elsif (/^KohaZ3950Dir=/) {
|
|
$newfile.="KohaZ3950Dir=$intranetdir/scripts/z3950daemon\n";
|
|
} elsif (/^LogDir=/) {
|
|
$newfile.="LogDir=$kohalogdir\n";
|
|
} else {
|
|
$newfile.=$_;
|
|
}
|
|
}
|
|
close S;
|
|
|
|
system("mv $intranetdir/scripts/z3950daemon/z3950-daemon-shell.sh $intranetdir/scripts/z3950daemon/z3950-daemon-shell.sh.orig");
|
|
open S, ">$intranetdir/scripts/z3950daemon/z3950-daemon-shell.sh";
|
|
print S $newfile;
|
|
close S;
|
|
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: $!";
|
|
|
|
|
|
open (KC, "/etc/koha.conf");
|
|
my $kccontents='';
|
|
my $kc;
|
|
while (<KC>) {
|
|
if (/^\s*includes\s*=/) {
|
|
$kccontents.="includes=$intranetdir/htdocs/includes\n";
|
|
$kc->{'includes'}=1;
|
|
} elsif (/^\s*httpduser\s*=/) {
|
|
$kccontents.="httpduser=$httpduser\n";
|
|
$kc->{'httpduser'}=1;
|
|
} elsif (/^\s*kohaversion\s*=/) {
|
|
$kccontents.="kohaversion=$newversion\n";
|
|
$kc->{'kohaversion'}=1;
|
|
} elsif (/^\s*kohalogdir\s*=/) {
|
|
$kccontents.="kohalogdir=$kohalogdir\n";
|
|
$kc->{'kohalogdir'}=1;
|
|
} elsif (/^\s*intranetdir\s*=/) {
|
|
$kccontents.="intranetdir=$intranetdir\n";
|
|
$kc->{'intranetdir'}=1;
|
|
} elsif (/^\s*opacdir\s*=/) {
|
|
$kccontents.="opacdir=$opacdir\n";
|
|
$kc->{'opacdir'}=1;
|
|
} else {
|
|
$kccontents.="$_";
|
|
}
|
|
}
|
|
|
|
unless (defined($kc->{'kohaversion'})) {
|
|
$kccontents.="kohaversion=$newversion\n";
|
|
}
|
|
unless (defined($kc->{'includes'})) {
|
|
$kccontents.="includes=$intranetdir/htdocs/includes\n";
|
|
}
|
|
unless (defined($kc->{'httpduser'})) {
|
|
$kccontents.="httpduser=$httpduser\n";
|
|
}
|
|
unless (defined($kc->{'intranetdir'})) {
|
|
$kccontents.="intranetdir=$intranetdir\n";
|
|
}
|
|
unless (defined($kc->{'opacdir'})) {
|
|
$kccontents.="opacdir=$opacdir\n";
|
|
}
|
|
unless (defined($kc->{'kohalogdir'})) {
|
|
$kccontents.="kohalogdir=$kohalogdir\n";
|
|
}
|
|
|
|
|
|
system("mv /etc/koha.conf /etc/koha.conf.backup");
|
|
|
|
open (KC, ">/etc/koha.conf") || warn "Couldn't open /etc/koha.conf for writing.";
|
|
print KC $kccontents;
|
|
close KC;
|
|
|
|
|
|
print qq|
|
|
|
|
Upgrading Database
|
|
==================
|
|
|;
|
|
system ("perl -I $intranetdir/modules scripts/updater/updatedatabase");
|
|
|
|
|
|
|
|
print qq|
|
|
|
|
==========================
|
|
= Koha Upgrade Completed =
|
|
==========================
|
|
The Koha Upgrade is finished. If you are upgrading from a version of Koha
|
|
prior to 1.2.1, it is likely that you will have to modify your Apache
|
|
configuration to point it to the new files.
|
|
|
|
In your INTRANET VirtualHost section you should have:
|
|
DocumentRoot $intranetdir/htdocs
|
|
ScriptAlias /cgi-bin/koha/ $intranetdir/cgi-bin/
|
|
SetEnv PERL5LIB $intranetdir/modules
|
|
|
|
In the OPAC VirtualHost section you should have:
|
|
DocumentRoot $opacdir/htdocs
|
|
ScriptAlias /cgi-bin/koha/ $opacdir/cgi-bin/
|
|
SetEnv PERL5LIB $intranetdir/modules
|
|
|
|
You may also need to uncomment a "LoadModules env_module ... " line and restart
|
|
Apache.
|
|
|
|
Please report any problems you encounter through http://bugs.koha.org/
|
|
|;
|