Koha/misc/koha.upgrade

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");
}