#!/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 () { 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 = ; 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 = ; 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 Set::Scalar}) { push @missing,"Set::Scalar" }; 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 key to continue: |; ; } # # 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 = ; 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 () { (/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 = ; 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 = ; 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 = ; 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 = ; 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 () { 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 = ); 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 () { 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 = ); 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 () { 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 () { 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/ |;