495 lines
13 KiB
Perl
495 lines
13 KiB
Perl
#!/usr/bin/perl -w
|
|
|
|
#use diagnostics;
|
|
use strict; # please develop with the strict pragma
|
|
use Install;
|
|
|
|
$::language='en';
|
|
|
|
if ($<) {
|
|
print "\n\nYou must run koha.upgrade as root.\n\n";
|
|
exit;
|
|
}
|
|
|
|
my $input;
|
|
|
|
|
|
loadconfigfile();
|
|
|
|
|
|
|
|
($::kohaversion) || ($::kohaversion='unknown version');
|
|
$::newversion=`cat koha.version`;
|
|
chomp $::newversion;
|
|
if ($::newversion =~ /RC/) {
|
|
releasecandidatewarning();
|
|
}
|
|
|
|
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 =~/n/i) {
|
|
print qq|
|
|
|
|
Aborting. Please re-run koha.upgrade when you are ready to upgrade Koha.
|
|
|;
|
|
exit;
|
|
} else {
|
|
print "Great! continuing upgrade... \n";
|
|
};
|
|
|
|
|
|
|
|
checkperlmodules();
|
|
|
|
|
|
|
|
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
|
|
|
|
File Listing
|
|
---------------------------------------------------------------------
|
|
$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 intranet-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("touch $::opacdir/cgi-bin/opac");
|
|
|
|
system("chown -R root.$httpduser $::opacdir");
|
|
system("chown -R root.$httpduser $::intranetdir");
|
|
|
|
|
|
# Copy custom templates and reports back in
|
|
|
|
opendir D, "$backupdir/kohafiles-$date/intranet/htdocs/";
|
|
my @dirlist=readdir D;
|
|
foreach (@dirlist) {
|
|
(next) if (/^\./);
|
|
(next) if ($_ eq 'default');
|
|
(next) if ($_ eq 'doc');
|
|
(next) if ($_=~/^koha-/);
|
|
(next) if (-e "$::intranetdir/htdocs/$_");
|
|
print "Restoring custom intranet templates $_...\n";
|
|
system("cp -a $backupdir/kohafiles-$date/intranet/htdocs/$_ $::intranetdir/htdocs/");
|
|
}
|
|
|
|
opendir D, "$backupdir/kohafiles-$date/opac/htdocs/";
|
|
my @dirlist=readdir D;
|
|
foreach (@dirlist) {
|
|
(next) if (/^\./);
|
|
(next) if ($_ eq 'default');
|
|
(next) if ($_ eq 'doc');
|
|
(next) if ($_=~/^koha-/);
|
|
(next) if (-e "$::opacdir/htdocs/$_");
|
|
print "Restoring custom opac template $_...\n";
|
|
system("cp -a $backupdir/kohafiles-$date/opac/htdocs/$_ $::opacdir/htdocs/");
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
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|
|
|
|
|
==================
|
|
= 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 1.2.3RC1. Do not give passwords to
|
|
any patrons unless you want them to have full access to your intranet.]
|
|
|;
|
|
print "Press the <ENTER> key to continue: ";
|
|
<STDIN>;
|
|
|
|
|
|
|
|
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/
|
|
|;
|
|
|
|
|
|
my $reply=showmessage('Would you like to complete a survey about your library?', 'yn', 'y');
|
|
if ($reply=~/y/i) {
|
|
system("perl kohareporter");
|
|
}
|