translated for 2.2.2 by hellen
[koha.git] / misc / Install.pm
index 5268108..3a2b4e0 100644 (file)
@@ -2,7 +2,7 @@ package Install; #assumes Install.pm
 
 
 # Copyright 2000-2002 Katipo Communications
-# Contains parts Copyright 2003 MJ Ray
+# Contains parts Copyright 2003-5 MJ Ray
 #
 # This file is part of Koha.
 #
@@ -26,9 +26,10 @@ use strict;
 use POSIX;
 #MJR: everyone will have these modules, right?
 # They look like part of perl core to me
-use Term::Cap;
+#use Term::Cap;
 use Term::ANSIColor qw(:constants);
 use Text::Wrap;
+use File::Temp qw/ :mktemp /;
 require Exporter;
 
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
@@ -54,10 +55,13 @@ to perform an actual installation.
 $VERSION = 0.01;
 
 @ISA = qw(Exporter);
-@EXPORT = qw(  &checkperlmodules
-                &checkabortedinstall
+@EXPORT = qw(
+               &read_autoinstall_file
+               &checkperlmodules
+               &checkabortedinstall
                &getmessage
                &showmessage
+               &completeupgrade
                &releasecandidatewarning
                &getinstallationdirectories
                &getdatabaseinfo
@@ -70,26 +74,25 @@ $VERSION = 0.01;
                &updatedatabase
                &populatedatabase
                &restartapache
+               &backupkoha
                &finalizeconfigfile
                &loadconfigfile
                &backupmycnf
                &restoremycnf
                );
 
-use vars qw( $kohaversion );                   # set in installer.pl
+use vars qw( $kohaversion $newversion );                       # set in loadconfigfile and installer.pl
 use vars qw( $language );                      # set in installer.pl
 use vars qw( $domainname );                    # set in installer.pl
 
 use vars qw( $etcdir );                                # set in installer.pl, usu. /etc
 use vars qw( $intranetdir $opacdir $kohalogdir );
-use vars qw( $realhttpdconf $httpduser );
+use vars qw( $realhttpdconf $httpduser $httpdgroup );
 use vars qw( $servername $svr_admin $opacport $intranetport );
 use vars qw( $mysqldir );
 use vars qw( $database $mysqluser );
 use vars qw( $mysqlpass );                     # normally should not be used
-use vars qw( $dbname $hostname $user $pass );  # virtual hosting
-
-use vars qw( $newversion );                    # XXX this seems to be unused
+use vars qw( $hostname $user $pass );  # virtual hosting
 
 =item heading
 
@@ -105,9 +108,9 @@ a line of equal signs as illegal POD directives.
 
 =cut
 
-my $termios = POSIX::Termios->new();
-$termios->getattr();
-my $terminal = Term::Cap->Tgetent({OSPEED=>$termios->getospeed()});
+#my $termios = POSIX::Termios->new();
+#$termios->getattr();
+#my $terminal = Term::Cap->Tgetent({OSPEED=>$termios->getospeed()});
 my $clear_string = "\n\n"; #MJR: was $terminal->Tputs('cl');
 
 sub heading ($) {
@@ -117,7 +120,7 @@ sub heading ($) {
 }
 
 my $mycnf = $ENV{HOME}."/.my.cnf";
-my $mytmpcnf = `mktemp my.cnf.koha.XXXXXX`;
+my $mytmpcnf = mktemp("my.cnf.koha.XXXXXX");
 chomp($mytmpcnf);
 
 my $messages;
@@ -131,7 +134,7 @@ a mysql superuser; and details of your library setup.  You may also need
 to know details of your Apache setup.
 
 If you want to install the Koha configuration files somewhere other than
-/etc (for multiple Koha versions on one system, for example), you should
+/etc (for installing not as root, or to have many Kohas on one system, for example), you should
 set the etcdir environment variable.  Please look at your manuals for
 details of how to set that.
 
@@ -139,14 +142,31 @@ Recommended answers are given in brackets after each question.  To accept
 the default value for any question (indicated by []), simply hit Enter
 at the prompt.
 
+Note that you also can define an auto_install_file, that will answer every question automatically.
+To use this feature, run ./installer.pl -i /path/to/auto_install_file 
+
 Are you ready to begin the installation? ([Y]/N): |;
 
+$messages->{'WelcomeToUpgrader'}->{en} =
+   heading('Welcome to the Koha Upgrader') . qq|
+You are attempting to upgrade from Koha %s to Koha %s.
+
+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]):|;
+
+$messages->{'AbortingInstall'}->{en} =
+   heading('ABORTING') . qq|
+Aborting as requested.  Please rerun when you are ready.
+|;
+
 $messages->{'ReleaseCandidateWarning'}->{en} =
    heading('RELEASE CANDIDATE') . qq|
 WARNING: You are about to install Koha version %s.  This is a
-release candidate, not intended for production systems.
-It is being released so that users can test it before we release a final
-version and report bugs to us.
+release candidate, It is NOT bugfree.
+However, it works, and has been declared stable enough to
+be released.
 
 Most people should answer Yes here.
 
@@ -189,16 +209,16 @@ Checking perl modules ...
 $messages->{'PerlVersionFailure'}->{en}="Sorry, you need at least Perl %s\n";
 
 $messages->{'MissingPerlModules'}->{en} = heading('MISSING PERL MODULES') . qq|
-You are missing some Perl modules which are required by Koha.
-Once these modules have been installed, rerun this installer.
-They may be installed by running (as root) the following:
+You are missing some Perl modules required by Koha.
+Please run this again after installing them.
+They may be installed by finding packages from your operating system supplier, or running (as root) the following commands:
 
 %s
 |;
 
 $messages->{'AllPerlModulesInstalled'}->{en} =
    heading('PERL MODULES AVAILABLE') . qq|
-All mandatory perl modules are installed.
+All required perl modules are installed.
 
 Press <ENTER> to continue: |;
 $messages->{'KohaVersionInstalled'}->{en}="You currently have Koha %s on your system.";
@@ -248,15 +268,39 @@ You will be able to connect to your Librarian interface at:
    http://%s\:%s/
 
    use the koha admin mysql login and password to connect to this interface.
-
 and the OPAC interface at:
 
    http://%s\:%s/
+   
+NOTE: You need to add lines to your main httpd.conf to include
+/etc/koha-httpd.conf and to make sure it is listening on the right ports
+(using the Listen directive). Then, restart Apache.
+
+Please read the Hints file and visit http://www.koha.org (in english) or www.koha-fr.org (in french)
+Press <ENTER> to exit the installer: |;
+
+$messages->{'UpgradeCompleted'}->{en} = heading('UPGRADE COMPLETE') . qq|
+Congratulations ... your Koha upgrade is finished!
 
-Please read the Hints file and visit http://www.koha.org
+Please report any problems you encounter through http://bugs.koha.org/
 
 Press <ENTER> to exit the installer: |;
 
+#'
+
+=item completeupgrade
+
+   completeupgrade
+
+Display a message describing what may need changing in httpd.conf
+and any other instructions
+
+=cut
+
+sub completeupgrade {
+       showmessage(getmessage('UpgradeCompleted',[$intranetdir,$intranetdir,$intranetdir,$opacdir,$opacdir,$intranetdir]),'PressEnter');
+}
+
 sub releasecandidatewarning {
     my $message=getmessage('ReleaseCandidateWarning', [$newversion, $newversion]);
     my $answer=showmessage($message, 'yn', 'n');
@@ -270,6 +314,42 @@ sub releasecandidatewarning {
     };
 }
 
+sub read_autoinstall_file
+{
+       my $fname = shift;      # Config file to read
+       my $retval = {};        # Return value: ref-to-hash holding the
+                               # configuration
+
+       open (CONF, $fname) or return undef;
+
+       while (<CONF>)
+       {
+               my $var;                # Variable name
+               my $value;              # Variable value
+
+               chomp;
+               s/#.*//;                # Strip comments
+               next if /^\s*$/;        # Ignore blank lines
+
+               # Look for a line of the form
+               #       var = value
+               if (!/^\s*(\w+)\s*=\s*(.*?)\s*$/)
+               {
+                       next;
+               }
+
+               # Found a variable assignment
+               # variable that was already set.
+               $var = $1;
+               $value = $2;
+               $retval->{$var} = $value;
+       }
+       close CONF;
+       if ($retval->{MysqlRootPassword} eq "XXX") {
+               print "ERROR : the root password is XXX. It is NOT valid. Edit your auto_install_file\n";
+       }
+       return $retval;
+}
 
 =back
 
@@ -313,11 +393,25 @@ sub setdomainname ($) {
 
 Sets the sysconfdir, normally /etc.
 This should be an absolute path; a trailing / is not required.
+Must be writeable, else we die.
 
 =cut
 
 sub setetcdir ($) {
     ($etcdir) = @_;
+    if (! ((-d $etcdir) && (-w $etcdir))) { die("Cannot write to $etcdir! Please set the etcdir environment variable to a writeable directory.\nFailed"); }
+}
+
+=item getkohaversion
+
+    getkohaversion();
+
+Gets the Koha version as known by the previous config file.
+
+=cut
+
+sub getkohaversion () {
+    return($kohaversion);
 }
 
 =item setkohaversion
@@ -329,7 +423,7 @@ Sets the Koha version as known by the installer.
 =cut
 
 sub setkohaversion ($) {
-    ($kohaversion) = @_;
+    ($newversion) = @_;
 }
 
 =item getservername
@@ -667,6 +761,72 @@ database is already created.
     }
 }
 
+=item checkpaths
+
+       checkpaths;
+
+Make sure that we loaded the right dirs from an old koha.conf
+
+=cut
+
+#FIXME: update to use Install.pm
+sub checkpaths {
+if ($opacdir && $intranetdir) {
+    print qq|
+
+I believe that your old files are located in:
+
+  OPAC:      $opacdir
+  LIBRARIAN: $intranetdir
+
+
+Does this look right?  ([Y]/N):
+|;
+    my $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 LIBRARIAN files: ";
+
+       my $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: ";  
+
+       my $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='';
+       }
+    }
+}
+
+}
 
 =item checkperlmodules
 
@@ -682,33 +842,39 @@ sub checkperlmodules {
 #
 # Test for Perl and Modules
 #
+       my ($auto_install) = @_;
+       my $message = getmessage('CheckingPerlModules');
+       showmessage($message, 'none');
 
-    my $message = getmessage('CheckingPerlModules');
-    showmessage($message, 'none');
-
-    unless ($] >= 5.006001) {                  # Bug 179
-       die getmessage('PerlVersionFailure', ['5.6.1']);
-    }
+       unless ($] >= 5.006001) {                       # Bug 179
+               die getmessage('PerlVersionFailure', ['5.6.1']);
+       }
        startsysout();
 
-    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 HTML::Template})   { push @missing,"HTML::Template" };
-#    unless (eval {require Set::Scalar})      { push @missing,"Set::Scalar" };
-    unless (eval {require Digest::MD5})      { push @missing,"Digest::MD5" };
-    unless (eval {require MARC::Record})     { push @missing,"MARC::Record" };
-    unless (eval {require Mail::Sendmail})   { push @missing,"Mail::Sendmail" };
-    unless (eval {require Event})       {
+       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 HTML::Template})   { push @missing,"HTML::Template" };
+       unless (eval {require Digest::MD5})      { push @missing,"Digest::MD5" };
+       unless (eval {require MARC::Record})     { push @missing,"MARC::Record" };
+       unless (eval {require Mail::Sendmail})   { push @missing,"Mail::Sendmail" };
+       unless (eval {require PDF::API2})   { push @missing,"PDF::API2" };
+# The following modules are not mandatory, depends on how the library want to use Koha
+       unless (eval {require Net::LDAP})       {
                if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
-                   push @missing, "Event";
-               }
+                               push @missing, "Net::LDAP";
+                       }
+    }
+       unless (eval {require Event})       {
+               if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
+                               push @missing, "Event";
+                       }
     }
     unless (eval {require Net::Z3950})       {
-       showmessage(getmessage('NETZ3950Missing'), 'PressEnter', '', 1);
+               showmessage(getmessage('NETZ3950Missing'), 'PressEnter', '', 1);
                if ($#missing>=0) { # see above note
-                   push @missing, "Net::Z3950";
+                       push @missing, "Net::Z3950";
                }
     }
 
@@ -718,7 +884,7 @@ sub checkperlmodules {
 
     if (@missing > 0) {
        my $missing='';
-       if (POSIX::setlocale(LC_ALL) != "C") {
+       if (POSIX::setlocale(LC_ALL) ne "C") {
                $missing.="   export LC_ALL=C\n";  
        }
        foreach my $module (@missing) {
@@ -729,7 +895,7 @@ sub checkperlmodules {
        print "\n";
        exit;
     } else {
-       showmessage(getmessage('AllPerlModulesInstalled'), 'PressEnter', '', 1);
+       showmessage(getmessage('AllPerlModulesInstalled'), 'PressEnter', '', 1) unless $auto_install->{NoPressEnter};
     }
 
 
@@ -786,18 +952,28 @@ function does not return any values.
 =cut
 
 sub getinstallationdirectories {
+       my ($auto_install) = @_;
        if (!$ENV{prefix}) { $ENV{prefix} = "/usr/local"; }
     $opacdir = $ENV{prefix}.'/koha/opac';
     $intranetdir = $ENV{prefix}.'/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);
-
+       my $message;
+       if ($auto_install->{GetOpacDir}) {
+               $opacdir=$auto_install->{GetOpacDir};
+               print ON_YELLOW.BLACK."auto-setting OpacDir to : $opacdir".RESET."\n";
+       } else {
+               $message=getmessage('GetOpacDir', [$opacdir]);
+               $opacdir=showmessage($message, 'free', $opacdir);
+       }
+       if ($auto_install->{GetIntranetDir}) {
+               $intranetdir=$auto_install->{GetIntranetDir};
+               print ON_YELLOW.BLACK."auto-setting IntranetDir to : $intranetdir".RESET."\n";
+       } else {
+               $message=getmessage('GetIntranetDir', [$intranetdir]);
+               $intranetdir=showmessage($message, 'free', $intranetdir);
+       }
        if ($intranetdir eq $opacdir) {
            print qq|
 
@@ -810,8 +986,13 @@ You must specify different directories for the OPAC and INTRANET files!
        }
     }
     $kohalogdir=$ENV{prefix}.'/koha/log';
-    my $message=getmessage('GetKohaLogDir', [$kohalogdir]);
-    $kohalogdir=showmessage($message, 'free', $kohalogdir);
+       if ($auto_install->{GetOpacDir}) {
+               $kohalogdir=$auto_install->{KohaLogDir};
+               print ON_YELLOW.BLACK."auto-setting log dir to : $kohalogdir".RESET."\n";
+       } else {
+           my $message=getmessage('GetKohaLogDir', [$kohalogdir]);
+       $kohalogdir=showmessage($message, 'free', $kohalogdir);
+       }
 
 
     # FIXME: Need better error handling for all mkdir calls here
@@ -843,7 +1024,40 @@ You must specify different directories for the OPAC and INTRANET files!
     }
 }
 
+=item getmysqldir
+
+       getmysqldir;
+
+Get the MySQL database server installation directory, automatically if possible.
+
+=cut
+
+$messages->{'WhereIsMySQL'}->{en} = heading('MYSQL LOCATION').qq|
+Koha can't find the MySQL command-line tools. If you installed a MySQL package, you may need to install an additional package containing mysqladmin.
+If you compiled mysql yourself,
+please give the value of --prefix when you ran configure.
+The file mysqladmin should be in bin/mysqladmin under the directory that you give here.
 
+MySQL installation directory: |;
+#'
+sub getmysqldir {
+    foreach my $mysql (qw(/usr/local/mysql
+                         /opt/mysql
+                         /usr/local
+                         /usr
+                         )) {
+       if ( -d $mysql  && -f "$mysql/bin/mysqladmin") {
+           $mysqldir=$mysql;
+       }
+    }
+    if (!$mysqldir){
+       for (;;) {
+           $mysqldir = showmessage(getmessage('WhereIsMySQL'),'free');
+           last if -f "$mysqldir/bin/mysqladmin";
+       }
+    }
+    return($mysqldir);
+}
 
 =item getdatabaseinfo
 
@@ -895,36 +1109,54 @@ Press <ENTER> to try again:
 |;
 
 sub getdatabaseinfo {
-
-    $dbname = 'Koha';
+       my ($auto_install) = @_;
+    $database = 'Koha';
     $hostname = 'localhost';
     $user = 'kohaadmin';
     $pass = '';
 
 #Get the database name
-
-    my $message=getmessage('DatabaseName', [$dbname]);
-    $dbname=showmessage($message, 'free', $dbname);
-
+       my $message;
+       
+       if ($auto_install->{database}) {
+               $database=$auto_install->{database};
+               print ON_YELLOW.BLACK."auto-setting database to : $database".RESET."\n";
+       } else {
+               $message=getmessage('DatabaseName', [$database]);
+               $database=showmessage($message, 'free', $database);
+       }
 #Get the hostname for the database
     
-    $message=getmessage('DatabaseHost', [$hostname]);
-    $hostname=showmessage($message, 'free', $hostname);
-
+       if ($auto_install->{DatabaseHost}) {
+               $hostname=$auto_install->{DatabaseHost};
+               print ON_YELLOW.BLACK."auto-setting database host to : $hostname".RESET."\n";
+       } else {
+               $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);
-
+       if ($auto_install->{DatabaseUser}) {
+               $user=$auto_install->{DatabaseUser};
+               print ON_YELLOW.BLACK."auto-setting DB user to : $user".RESET."\n";
+       } else {
+               $message=getmessage('DatabaseUser', [$database, $hostname, $user]);
+               $user=showmessage($message, 'free', $user);
+       }
 #Get the password for the database user
 
     while ($pass eq '') {
-       my $message=getmessage('DatabasePassword', [$user, $user]);
-       $pass=showmessage($message, 'free', $pass);
-       if ($pass eq '') {
-           my $message=getmessage('BlankPassword');
-           showmessage($message,'PressEnter');
-       }
+               my $message=getmessage('DatabasePassword', [$user, $user]);
+               if ($auto_install->{DatabasePassword}) {
+                       $pass=$auto_install->{DatabasePassword};
+                       print ON_YELLOW.BLACK."auto-setting database password to : $pass".RESET."\n";
+               } else {
+                               $pass=showmessage($message, 'free', $pass);
+               }
+               if ($pass eq '') {
+                       my $message=getmessage('BlankPassword');
+                       showmessage($message,'PressEnter');
+               }
     }
 }
 
@@ -964,14 +1196,14 @@ The file %s does not exist.
 
 Please press <ENTER> to continue: |;
 
-$messages->{'EnterApacheUser'}->{en} = heading('NEED APACHE USER') . qq|
-The installer could not find the User setting in the Apache configuration file.  
+$messages->{'EnterApacheUser'}->{en} = heading('NEED APACHE USER') . qq\
+The installer could not find the User setting in the Apache configuration file.
 This is used to set up access permissions for
 %s/koha.conf.  This user should be set in one of the Apache configuration.
 Please try to find it and enter the user name below.  You might find
 that "ps u|grep apache" will tell you.  It probably is NOT "root".
 
-Enter the Apache userid: |;
+Enter the Apache userid: \;
 
 $messages->{'InvalidUserid'}->{en} = heading('INVALID USER') . qq|
 The userid %s is not a valid userid on this system.
@@ -979,6 +1211,7 @@ The userid %s is not a valid userid on this system.
 Press <ENTER> to continue: |;
 
 sub getapacheinfo {
+       my ($auto_install) = @_;
     my @confpossibilities;
 
     foreach my $httpdconf (qw(/usr/local/apache/conf/httpd.conf
@@ -989,40 +1222,44 @@ sub getapacheinfo {
                          /etc/apache2/apache2.conf
                          /etc/apache/conf/httpd.conf
                          /etc/apache/conf/apache.conf
+                         /etc/apache/httpd.conf
                          /etc/apache-ssl/conf/apache.conf
                          /etc/apache-ssl/httpd.conf
                          /etc/httpd/conf/httpd.conf
-                         /etc/httpd/httpd.conf)) {
-       if ( -f $httpdconf ) {
-           push @confpossibilities, $httpdconf;
-       }
+                         /etc/httpd/httpd.conf
+                         /etc/httpd/2.0/conf/httpd2.conf
+                         )) {
+               if ( -f $httpdconf ) {
+                       push @confpossibilities, $httpdconf;
+               }
     }
 
     if ($#confpossibilities==-1) {
-       my $message=getmessage('NoApacheConfFiles');
-       my $choice='';
-       until (-f $realhttpdconf) {
-           $choice=showmessage($message, "free", 1);
-           if (-f $choice) {
-               $realhttpdconf=$choice;
-           } else {
-               showmessage(getmessage('NotAFile', [$choice]),'PressEnter', '', 1);
-           }
-       }
+               my $message=getmessage('NoApacheConfFiles');
+               my $choice='';
+               $realhttpdconf='';
+               until (-f $realhttpdconf) {
+                       $choice=showmessage($message, "free", 1);
+                       if (-f $choice) {
+                       $realhttpdconf=$choice;
+                       } else {
+                       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];
+               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];
+               $realhttpdconf=$confpossibilities[0];
     }
     unless (open (HTTPDCONF, "<$realhttpdconf")) {
        warn RED."Insufficient privileges to open $realhttpdconf for reading.\n";
@@ -1030,25 +1267,35 @@ sub getapacheinfo {
     }
 
     while (<HTTPDCONF>) {
-       if (/^\s*User\s+"?([-\w]+)"?\s*$/) {
-           $httpduser = $1;
-       }
+               if (/^\s*User\s+"?([-\w]+)"?\s*$/) {
+                       $httpduser = $1;
+               }
     }
     close(HTTPDCONF);
 
     unless (defined($httpduser)) {
-       my $message=getmessage('EnterApacheUser', [$etcdir]);
-       until (defined($httpduser) && length($httpduser) && getpwnam($httpduser)) {
-           $httpduser=showmessage($message, "free", '');
-           if (length($httpduser)>0) {
-               unless (getpwnam($httpduser)) {
-                   my $message=getmessage('InvalidUserid', [$httpduser]);
-                   showmessage($message,'PressEnter');
+               my $message;
+               if ($auto_install->{EnterApacheUser}) {
+                       $message = $auto_install->{EnterApacheUser};
+                       print ON_YELLOW.BLACK."auto-setting Apache User to : $message".RESET."\n";
+               } else {
+                       $message=getmessage('EnterApacheUser', [$etcdir]);
+               }
+               until (defined($httpduser) && length($httpduser) && getpwnam($httpduser)) {
+                       if ($auto_install->{EnterApacheUser}) {
+                               $httpduser = $auto_install->{EnterApacheUser};
+                       } else {
+                               $httpduser=showmessage($message, "free", '');
+                       }
+                       if (length($httpduser)>0) {
+                               unless (getpwnam($httpduser)) {
+                                       my $message=getmessage('InvalidUserid', [$httpduser]);
+                                       showmessage($message,'PressEnter');
+                               }
+                       } else {
+                       }
                }
-           } else {
-           }
        }
-    }
 }
 
 
@@ -1076,7 +1323,9 @@ and the installer will leave comments in
 
 NOTE: You will need to add lines to your main httpd.conf to
 include %s/koha-httpd.conf
+(using the Include directive)
 and to make sure it is listening on the right ports
+and host names
 (using the Listen directive).
 
 Press <ENTER> to continue: |;
@@ -1111,21 +1360,38 @@ Enter the Intranet Port [%s]: |;
 
 
 sub getapachevhostinfo {
-
+       my ($auto_install) = @_;
     $svr_admin = "webmaster\@$domainname";
     $servername=`hostname`;
     chomp $servername;
     $opacport=80;
     $intranetport=8080;
 
-    showmessage(getmessage('ApacheConfigIntroduction',[$etcdir,$etcdir]), '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);
+       if ($auto_install->{GetVirtualHostEmail}) {
+               $svr_admin=$auto_install->{GetVirtualHostEmail};
+               print ON_YELLOW.BLACK."auto-setting VirtualHostEmail to : $svr_admin".RESET."\n";
+       } else {
+               showmessage(getmessage('ApacheConfigIntroduction',[$etcdir,$etcdir]), 'PressEnter');
+               $svr_admin=showmessage(getmessage('GetVirtualHostEmail', [$svr_admin]), 'email', $svr_admin);
+       }
+       if ($auto_install->{servername}) {
+               $servername=$auto_install->{servername};
+               print ON_YELLOW.BLACK."auto-setting server name to : $servername".RESET."\n";
+       } else {
+       $servername=showmessage(getmessage('GetServerName', [$servername]), 'free', $servername);
+       }
+       if ($auto_install->{opacport}) {
+               $opacport=$auto_install->{opacport};
+               print ON_YELLOW.BLACK."auto-setting opac port to : $opacport".RESET."\n";
+       } else {
+           $opacport=showmessage(getmessage('GetOpacPort', [$opacport]), 'numerical', $opacport);
+       }
+       if ($auto_install->{intranetport}) {
+               $intranetport=$auto_install->{intranetport};
+               print ON_YELLOW.BLACK."auto-setting intranet port to : $intranetport".RESET."\n";
+       } else {
+           $intranetport=showmessage(getmessage('GetIntranetPort', [$opacport, $intranetport]), 'numerical', $intranetport);
+       }
 
 }
 
@@ -1177,10 +1443,11 @@ configuration.
 Press <ENTER> to continue: |;
 
 sub updateapacheconf {
+       my ($auto_install)=@_;
     my $logfiledir=$kohalogdir;
     my $httpdconf = $etcdir."/koha-httpd.conf";
    
-    showmessage(getmessage('StartUpdateApache'), 'none');
+    showmessage(getmessage('StartUpdateApache'), 'none') unless $auto_install->{NoPressEnter};
        # to be polite about it: I don't think this should touch the main httpd.conf
 
        # QUESTION: Should we warn for includes_module too?
@@ -1218,12 +1485,22 @@ sub updateapacheconf {
        }
        print SITE <<EOP
 
+# Koha 2.2 Apache Virtual Host Config File
+#
+# Please include this file in your apache configuration.
+# The best way to do that depends on your site setup.
+# Some like an Include adding to /etc/apache/httpd.conf
+# and some prefer a symlink to this file from some dir.
+# Please refer to your system manuals.
+
 # Ports to listen to for Koha
 # uncomment these if they aren't already in main httpd.conf
 #$opaclisten
 #$intranetlisten
 
 # NameVirtualHost is used by one of the optional configurations detailed below
+# Please make sure this line is correct before uncommenting.
+# See http://httpd.apache.org/docs/vhosts/ for some guides.
 
 #NameVirtualHost 11.22.33.44
 
@@ -1233,6 +1510,7 @@ sub updateapacheconf {
    DocumentRoot $opacdir/htdocs
    ServerName $servername
    ScriptAlias /cgi-bin/koha/ $opacdir/cgi-bin/
+   Redirect permanent index.html http://$servername\:$opacport/cgi-bin/koha/opac-main.pl
    ErrorLog $logfiledir/opac-error_log
    TransferLog $logfiledir/opac-access_log
    SetEnv PERL5LIB "$intranetdir/modules"
@@ -1246,6 +1524,7 @@ sub updateapacheconf {
    DocumentRoot $intranetdir/htdocs
    ServerName $servername
    ScriptAlias /cgi-bin/koha/ "$intranetdir/cgi-bin/"
+   Redirect permanent index.html http://$servername\:$intranetport/cgi-bin/koha/mainpage.pl
    ErrorLog $logfiledir/koha-error_log
    TransferLog $logfiledir/koha-access_log
    SetEnv PERL5LIB "$intranetdir/modules"
@@ -1283,54 +1562,54 @@ function does not return any values.
 
 =cut
 
-$messages->{'IntranetAuthenticationQuestion'}->{en} =
-   heading('LIBRARIAN AUTHENTICATION') . qq|
-The Librarian site can be password protected using
-Apache's Basic Authorization instead of Koha user details.
-
-This method going to be phased out very soon.  Most users should answer N here.
-
-Would you like to do this (Y/[N]): |;  #'
-
-$messages->{'BasicAuthUsername'}->{en}="Please enter a username for librarian 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', 'n');
-    my $httpdconf = $etcdir."/koha-httpd.conf";
-
-    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, ">$etcdir/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,">>$httpdconf") or warn "Insufficient priveleges to open $realhttpdconf for writing.\n";
-       print SITE <<EOP
-
-<Directory $intranetdir>
-    AuthUserFile $etcdir/kohaintranet.pass
-    AuthType Basic
-    AuthName "Koha Intranet (for librarians only)"
-    Require  valid-user
-</Directory>
-EOP
-    }
-    close(SITE);
-}
+$messages->{'IntranetAuthenticationQuestion'}->{en} =
+   heading('LIBRARIAN AUTHENTICATION') . qq|
+The Librarian site can be password protected using
+Apache's Basic Authorization instead of Koha user details.
+# 
+This method going to be phased out very soon.  Most users should answer N here.
+# 
+# Would you like to do this (Y/[N]): |;        #'
+# 
+$messages->{'BasicAuthUsername'}->{en}="Please enter a username for librarian 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', 'n');
+    my $httpdconf = $etcdir."/koha-httpd.conf";
+# 
+    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, ">$etcdir/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,">>$httpdconf") or warn "Insufficient priveleges to open $realhttpdconf for writing.\n";
+#      print SITE <<EOP
+# 
+<Directory $intranetdir>
+    AuthUserFile $etcdir/kohaintranet.pass
+    AuthType Basic
+    AuthName "Koha Intranet (for librarians only)"
+    Require  valid-user
+</Directory>
+EOP
+    }
+    close(SITE);
+}
 
 
 =item installfiles
@@ -1351,6 +1630,16 @@ Copying files to installation directories:
 
 |;
 
+$messages->{'OldFiles'}->{en} = heading('OLD FILES') . qq|
+Any files from the previous edition of Koha have been
+copied to a dated backup directory alongside the new
+installation. You should move any custom files that you
+want to keep (such as your site templates) into the new
+directories and then move the backup off of the live
+server.
+
+Press ENTER to continue:|;
+
 
 $messages->{'CopyingFiles'}->{en}="Copying %s to %s.\n";
 
@@ -1358,78 +1647,83 @@ $messages->{'CopyingFiles'}->{en}="Copying %s to %s.\n";
 
 sub installfiles {
 
-       #MJR: preserve old files, just in case
+       my ($is_first_install,$auto_install) = @_;
+       # $is_install is set if it's a fresh install and not an upgrade. If it's an upgrade, copy old files.
+       
        sub neatcopy {
                my $desc = shift;
                my $src = shift;
                my $tgt = shift;
-               
-               if (-d $tgt) {
-               print getmessage('CopyingFiles', ["old ".$desc,$tgt.".old"]);
-                       startsysout;
-                       system("mv ".$tgt." ".$tgt.".old");
+               my $auto_install = shift;
+               my $is_first_install = shift;
+               if (!$is_first_install && -e $tgt) {
+               print getmessage('CopyingFiles', ["old ".$desc,$tgt.strftime("%Y%m%d%H%M",localtime())]) unless ($auto_install->{NoPressEnter});
+                       system("mv ".$tgt." ".$tgt.strftime("%Y%m%d%H%M",localtime()));
+                       system("mkdir ".$tgt);   ##New line 
                }
-
-       print getmessage('CopyingFiles', [$desc,$tgt]);
-       startsysout;
-           system("cp -R ".$src." ".$tgt);
+               print getmessage('CopyingFiles', [$desc,$tgt]) unless ($auto_install->{NoPressEnter});
+               system("cp -R ".$src."/* ".$tgt);
        }
 
-    showmessage(getmessage('InstallFiles'),'none');
+#      my ($auto_install) = @_;
+       showmessage(getmessage('InstallFiles'),'none') unless ($auto_install->{NoPressEnter});
 
-    neatcopy("admin templates", 'intranet-html', "$intranetdir/htdocs");
-    neatcopy("admin interface", 'intranet-cgi', "$intranetdir/cgi-bin");
-    neatcopy("main scripts", 'scripts', "$intranetdir/scripts");
-    neatcopy("perl modules", 'modules', "$intranetdir/modules");
-    neatcopy("OPAC templates", 'opac-html', "$opacdir/htdocs");
-    neatcopy("OPAC interface", 'opac-cgi', "$opacdir/cgi-bin");
+       neatcopy("admin templates", 'intranet-html', "$intranetdir/htdocs",$auto_install,$is_first_install);
+       neatcopy("admin interface", 'intranet-cgi', "$intranetdir/cgi-bin",$auto_install,$is_first_install);
+       neatcopy("main scripts", 'scripts', "$intranetdir/scripts",$auto_install,$is_first_install);
+       neatcopy("perl modules", 'modules', "$intranetdir/modules",$auto_install,$is_first_install);
+       neatcopy("OPAC templates", 'opac-html', "$opacdir/htdocs",$auto_install,$is_first_install);
+       neatcopy("OPAC interface", 'opac-cgi', "$opacdir/cgi-bin",$auto_install,$is_first_install);
        startsysout();
-    system("touch $opacdir/cgi-bin/opac");
+       system("touch $opacdir/cgi-bin/opac");
 
        #MJR: is this necessary?
        if ($> == 0) {
-           system("chown -R $httpduser:$httpduser $opacdir $intranetdir");
-    }
+               my $httpdgrp = getgrnam($httpduser);
+               system("chown -R $httpduser:$httpdgrp $opacdir $intranetdir");
+       }
        system("chmod -R a+rx $opacdir $intranetdir");
 
-    # Create /etc/koha.conf
+       # Create /etc/koha.conf
 
-    my $old_umask = umask(027); # make sure koha.conf is never world-readable
-    open(SITES,">$etcdir/koha.conf.tmp") or warn "Couldn't create file at $etcdir. Must have write capability.\n";
-    print SITES qq|
-database=$dbname
+       my $old_umask = umask(027); # make sure koha.conf is never world-readable
+       open(SITES,">$etcdir/koha.conf.tmp") or warn "Couldn't create file at $etcdir. Must have write capability.\n";
+       print SITES qq|
+database=$database
 hostname=$hostname
 user=$user
 pass=$pass
-includes=$opacdir/htdocs/includes
 intranetdir=$intranetdir
 opacdir=$opacdir
 kohalogdir=$kohalogdir
-kohaversion=$kohaversion
+kohaversion=$newversion
 httpduser=$httpduser
 intrahtdocs=$intranetdir/htdocs/intranet-tmpl
 opachtdocs=$opacdir/htdocs/opac-tmpl
 |;
-    close(SITES);
-    umask($old_umask);
+       close(SITES);
+       umask($old_umask);
 
        startsysout();
        #MJR: can't help but this be broken, can we?
-    chmod 0440, "$etcdir/koha.conf.tmp";
+       chmod 0440, "$etcdir/koha.conf.tmp";
        
        #MJR: does this contain any passwords?
-    chmod 0755, "$intranetdir/scripts/z3950daemon/z3950-daemon-launch.sh", "$intranetdir/scripts/z3950daemon/z3950-daemon-shell.sh", "$intranetdir/scripts/z3950daemon/processz3950queue";
+       chmod 0755, "$intranetdir/scripts/z3950daemon/z3950-daemon-launch.sh", "$intranetdir/scripts/z3950daemon/z3950-daemon-shell.sh", "$intranetdir/scripts/z3950daemon/processz3950queue";
 
-       #MJR: generate our own settings, to remove the /home/paul hardwired links
-    open(FILE,">$intranetdir/scripts/z3950daemon/z3950-daemon-options");
-    print FILE "RunAsUser=apache\nKohaZ3950Dir=$intranetdir/scripts/z3950daemon\nKohaModuleDir=$intranetdir/modules\nLogDir=$kohalogdir\nKohaConf=$etcdir/koha.conf";
-    close(FILE);
+       open(FILE,">$intranetdir/scripts/z3950daemon/z3950-daemon-options");
+       print FILE "RunAsUser=$httpduser\nKohaZ3950Dir=$intranetdir/scripts/z3950daemon\nKohaModuleDir=$intranetdir/modules\nLogDir=$kohalogdir\nKohaConf=$etcdir/koha.conf";
+       close(FILE);
 
        if ($> == 0) {
            chown((getpwnam($httpduser)) [2,3], "$etcdir/koha.conf.tmp") or warn "can't chown koha.conf: $!";
-       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: $!";
-       } #MJR: FIXME: Should report that we haven't chown()d.
+               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: $!";
+       } #MJR: report that we haven't chown()d.
+       else {
+               print "Please check permissions in $intranetdir/scripts/z3950daemon\n";
+       }
+       showmessage(getmessage('OldFiles'),'PressEnter') unless ($auto_install->{NoPressEnter} or $is_first_install);
 }
 
 
@@ -1494,55 +1788,35 @@ $messages->{'PrinterQueue'}->{en}="Printer Queue [%s]: ";
 $messages->{'PrinterName'}->{en}="Printer Name [%s]: ";
 
 sub databasesetup {
+       my ($auto_install) = @_;
     $mysqluser = 'root';
     $mysqlpass = '';
+       my $mysqldir = getmysqldir();
 
-    foreach my $mysql (qw(/usr/local/mysql
-                         /opt/mysql
-                         /usr
-                         )) {
-       if ( -d $mysql  && -f "$mysql/bin/mysqladmin") {
-           $mysqldir=$mysql;
-       }
-    }
-    if (!$mysqldir){
-       print "I don't see mysql in the usual places.\n";
-       for (;;) {
-           print "Where have you installed mysql? ";
-           chomp($mysqldir = <STDIN>);
-           last if -f "$mysqldir/bin/mysqladmin";
-       print <<EOP;
-
-I can't find it there either. If you compiled mysql yourself,
-please give the value of --prefix when you ran configure.
-
-The file mysqladmin should be in bin/mysqladmin under the directory that you
-provide here.
-
-EOP
-#'
+       if ($auto_install->{MysqlRootPassword}) {
+               $mysqlpass=$auto_install->{MysqlRootPassword};
+       } else {
+       # we must not put the mysql root password on the command line
+               $mysqlpass=     showmessage(getmessage('MysqlRootPassword'),'silentfree');
        }
-    }
-    # we must not put the mysql root password on the command line
-       $mysqlpass=     showmessage(getmessage('MysqlRootPassword'),'silentfree');
        
-       showmessage(getmessage('CreatingDatabase'),'none');
+       showmessage(getmessage('CreatingDatabase'),'none') unless ($auto_install->{NoPressEnter});
        # set the login up
        setmysqlclipass($mysqlpass);
        # Set up permissions
        startsysout();
-       print system("$mysqldir/bin/mysql -u$mysqluser mysql -e \"insert into user (Host,User,Password) values ('$hostname','$user',password('$pass'))\"\;");
-       system("$mysqldir/bin/mysql -u$mysqluser 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')\"");
+       print system("$mysqldir/bin/mysql -u$mysqluser -e \"insert into user (Host,User,Password) values ('$hostname','$user',password('$pass'))\" mysql\;");
+       system("$mysqldir/bin/mysql -u$mysqluser -e \"insert into db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv, index_priv, alter_priv) values ('%','$database','$user','Y','Y','Y','Y','Y','Y','Y','Y')\" mysql");
        system("$mysqldir/bin/mysqladmin -u$mysqluser reload");
        # Change to admin user login
        setmysqlclipass($pass);
-       my $result=system("$mysqldir/bin/mysqladmin", "-u$user", "create", "$dbname");
+       my $result=system("$mysqldir/bin/mysqladmin", "-u$user", "create", "$database");
        if ($result) {
                showmessage(getmessage('CreatingDatabaseError'),'PressEnter', '', 1);
        } else {
                # Create the database structure
                startsysout();
-               system("$mysqldir/bin/mysql -u$user $dbname < koha.mysql");
+               system("$mysqldir/bin/mysql '-u$user' '$database' < koha.mysql");
        }
 
 }
@@ -1579,15 +1853,17 @@ nothing will be added, and you must create them all yourself.
 Only choose N if you want to use a MARC format not listed here,
 such as DANMARC.  We would like to hear from you if you do.
 
+*** UPGRADE ***
+If you UPGRADE your version from a previous 2.x.x, the right choice here is N (None) to preserve your local MARC setup.
+
 Choose MARC definition [1]: |;
 
 $messages->{'Language'}->{en} = heading('CHOOSE LANGUAGE') . qq|
 This version of koha supports a few languages.
 
   en : default language, all pages available
-  fr : complete translation (except pictures)
-  es : partial librarian site translation (including pictures)
-  pl : complete OPAC and partial librarian translation
+  fr : complete translation
+  es : partial librarian site translation
   zh_TW : partial translation
 
 en is used when a screen is not available in your language
@@ -1598,37 +1874,36 @@ change it from the system preferences screen in the librarian sit.
 Which language do you choose? |;
 
 sub updatedatabase {
+       my ($auto_install) = @_;
     # At this point, $etcdir/koha.conf must exist, for C4::Context
-    $ENV{"KOHA_CONF"}=$etcdir.'/koha.conf.tmp';
+    $ENV{"KOHA_CONF"}=$etcdir.'/koha.conf';
+    if (! -e $ENV{"KOHA_CONF"}) { $ENV{"KOHA_CONF"}=$etcdir.'/koha.conf.tmp'; }
        startsysout();  
-       my $result=system ("perl -I $intranetdir/modules scripts/updater/updatedatabase");
+       setmysqlclipass($pass);
+       my $result=system ("perl -I $intranetdir/modules scripts/updater/updatedatabase -s");
        if ($result) {
                restoremycnf();
                print "Problem updating database...\n";
                exit;
        }
-
-       my $response=showmessage(getmessage('UpdateMarcTables'), 'restrictchar 12N', '1');
-
+       my $response;
+       if ($auto_install->{UpdateMarcTables}) {
+               $response=$auto_install->{UpdateMarcTables};
+               print ON_YELLOW.BLACK."auto-setting UpdateMarcTable to : $response".RESET."\n";
+       } else {
+               $response=showmessage(getmessage('UpdateMarcTables'), 'restrictchar 12Nn', '1');
+       }
        startsysout();
        if ($response eq '1') {
-               system("cat scripts/misc/marc_datas/marc21_en/structure_def.sql | $mysqldir/bin/mysql -u$user $dbname");
+               system("cat scripts/misc/marc_datas/marc21_en/structure_def.sql | $mysqldir/bin/mysql '-u$user' '$database'");
        }
        if ($response eq '2') {
-               system("cat scripts/misc/marc_datas/unimarc_fr/structure_def.sql | $mysqldir/bin/mysql -u$user $dbname");
-               system("cat scripts/misc/lang-datas/fr/stopwords.sql | $mysqldir/bin/mysql -u$user $dbname");
-       }
-
-       $result = system ("perl -I $intranetdir/modules scripts/marc/updatedb2marc.pl");
-       if ($result) {
-               print "Problem updating database to MARC...\n";
-               restoremycnf();
-               exit;
+               system("cat scripts/misc/marc_datas/unimarc_fr/structure_def.sql | $mysqldir/bin/mysql '-u$user' '$database'");
        }
        delete($ENV{"KOHA_CONF"});
 
-       print RESET."\n\nFinished updating of database. Press <ENTER> to continue...";
-       <STDIN>;
+       print RESET."\nFinished updating of database. Press <ENTER> to continue..." unless ($auto_install->{NoPressEnter});
+       <STDIN> unless ($auto_install->{NoPressEnter});
 }
 
 
@@ -1641,60 +1916,146 @@ sample data, install them.
 
 =cut
 
-sub populatedatabase {
-#      my $response=showmessage(getmessage('SampleData'), 'yn', 'n');
-#      if ($response =~/^y/i) {
-#
-# FIXME: These calls are now unsafe and should either be removed
-# or updated to use -u$user and no mysqlpass_quoted
-#
-#              system("gunzip -d < sampledata-1.2.gz | $mysqldir/bin/mysql -u$mysqluser $mysqlpass_quoted $dbname");
-#              system("$mysqldir/bin/mysql -u$mysqluser $mysqlpass_quoted $dbname -e \"insert into branches (branchcode,branchname,issuing) values ('MAIN', 'Main Library', 1)\"");
-#              system("$mysqldir/bin/mysql -u$mysqluser $mysqlpass_quoted $dbname -e \"insert into branchrelations (branchcode,categorycode) values ('MAIN', 'IS')\"");
-#              system("$mysqldir/bin/mysql -u$mysqluser $mysqlpass_quoted $dbname -e \"insert into branchrelations (branchcode,categorycode) values ('MAIN', 'CU')\"");
-#              system("$mysqldir/bin/mysql -u$mysqluser $mysqlpass_quoted $dbname -e \"insert into printers (printername,printqueue,printtype) values ('Circulation Desk Printer', 'lp', 'hp')\"");
-#              showmessage(getmessage('SampleDataInstalled'), 'PressEnter','',1);
-#      } else {
-               my $input;
-               my $response=showmessage(getmessage('AddBranchPrinter'), 'yn', 'y');
+$messages->{'ConfirmFileUpload'}->{en} = qq|
+Confirm loading of this file into Koha  [Y]/N: |;
 
+sub populatedatabase {
+       my ($auto_install) = @_;
+       my $input;
+       my $response;
+       my $branch='MAIN';
+       if ($auto_install->{BranchName}) {
+               $branch=$auto_install->{BranchName};
+               print ON_YELLOW.BLACK."auto-setting a branch : $branch".RESET."\n";
+       } else {
+               $response=showmessage(getmessage('AddBranchPrinter'), 'yn', 'y');
                unless ($response =~/^n/i) {
-               my $branch='Main Library';
-               $branch=showmessage(getmessage('BranchName', [$branch]), 'free', $branch, 1);
-               $branch=~s/[^A-Za-z0-9\s]//g;
-
+                       $branch=showmessage(getmessage('BranchName', [$branch]), 'free', $branch, 1);
+                       $branch=~s/[^A-Za-z0-9\s]//g;
+               }
+       }
+       if ($branch) {
                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);
+               if ($auto_install->{BranchCode}) {
+                       $branchcode=$auto_install->{BranchCode};
+                       print ON_YELLOW.BLACK."auto-setting branch code : $branchcode".RESET."\n";
+               } else {
+                       $branchcode=showmessage(getmessage('BranchCode', [$branchcode]), 'free', $branchcode, 1);
+               }
                $branchcode=~s/[^A-Za-z0-9]//g;
                $branchcode=uc($branchcode);
                $branchcode=substr($branchcode,0,4);
                $branchcode or $branchcode='DEF';
 
                startsysout();
-               system("$mysqldir/bin/mysql -u$user $dbname -e \"insert into branches (branchcode,branchname,issuing) values ('$branchcode', '$branch', 1)\"");
-               system("$mysqldir/bin/mysql -u$user $dbname -e \"insert into branchrelations (branchcode,categorycode) values ('MAIN', 'IS')\"");
-               system("$mysqldir/bin/mysql -u$user $dbname -e \"insert into branchrelations (branchcode,categorycode) values ('MAIN', 'CU')\"");
-
-               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$user' -e \"insert into branches (branchcode,branchname,issuing) values ('$branchcode', '$branch', 1)\" '$database'");
+               system("$mysqldir/bin/mysql '-u$user' -e \"insert into branchrelations (branchcode,categorycode) values ('MAIN', 'IS')\" '$database'");
+               system("$mysqldir/bin/mysql '-u$user' -e \"insert into branchrelations (branchcode,categorycode) values ('MAIN', 'CU')\" '$database'");
+
+               my $printername='lp';
+               my $printerqueue='/dev/lp0';
+               if ($auto_install->{PrinterName}) {
+                       $printername=$auto_install->{PrinterName};
+                       print ON_YELLOW.BLACK."auto-setting a printer : $printername".RESET."\n";
+               } else {
+                       $printername=showmessage(getmessage('PrinterName', [$printername]), 'free', $printername, 1);
+                       $printername=~s/[^A-Za-z0-9\s]//g;
+               }
+               if ($auto_install->{PrinterQueue}) {
+                       $printerqueue=$auto_install->{PrinterQueue};
+                       print ON_YELLOW.BLACK."auto-setting printer queue to : $printerqueue".RESET."\n";
+               } else {
+                       $printerqueue=showmessage(getmessage('PrinterQueue', [$printerqueue]), 'free', $printerqueue, 1);
+                       $printerqueue=~s/[^A-Za-z0-9]//g;
+               }
                startsysout();  
-               system("$mysqldir/bin/mysql -u$user $dbname -e \"insert into printers (printername,printqueue,printtype) values ('$printername', '$printerqueue', '')\"");
-#              }
-       my $language=showmessage(getmessage('Language'), 'free', 'en');
+               system("$mysqldir/bin/mysql '-u$user' -e \"insert into printers (printername,printqueue,printtype) values ('$printername', '$printerqueue', '')\" '$database'");
+       }
+       my $language;
+       if ($auto_install->{Language}) {
+               $language=$auto_install->{Language};
+               print ON_YELLOW.BLACK."auto-setting language to : $language".RESET."\n";
+       } else {
+               $language=showmessage(getmessage('Language'), 'free', 'en');
+       }
        startsysout();  
-       system("$mysqldir/bin/mysql -u$user $dbname -e \"update systempreferences set value='$language' where variable='opaclanguages'\"");
+       system("$mysqldir/bin/mysql '-u$user' -e \"update systempreferences set value='$language' where variable='opaclanguages'\" '$database'");
+       my @dirs;
+       if (-d "scripts/misc/sql-datas") {
+               # ask for directory to look for files to append
+               my @directories;
+               push @directories,"FINISHED";
+               if (-d "scripts/misc/sql-datas") {
+                       opendir D, "scripts/misc/sql-datas";
+                       foreach my $dir (readdir D) {
+                               next if ($dir =~ /^\./);
+                               push @directories, $dir;
+                       }
+               }
+               my $loopend=0;
+               while (not $loopend) {
+                       print heading("SELECT SQL DIRECTORY");
+                       print qq|
+Select a directory. You will see every file included in this directory and be able to choose file(s) to import into Koha
+This is a VERY important feature. By selecting the proper options, you can get a pre-setup Koha, almost ready to be put in production.
+Choose wisely.
+|;
+                       for (my $i=0;$i<=$#directories;$i++) {
+                               print "$i => ".$directories[$i]."\n";
+                       }
+                       my $sqluploaddir =<STDIN>;
+                       if ($sqluploaddir==0) {
+                               $loopend = 1;
+                       } else {
+                               $sqluploaddir = $directories[$sqluploaddir];
+                               # CHECK for any other file to append...
+                               my @sql;
+                               push @sql,"FINISHED";
+                               if (-d "scripts/misc/sql-datas/$sqluploaddir") {
+                                       opendir D, "scripts/misc/sql-datas/$sqluploaddir";
+                                       foreach my $sql (readdir D) {
+                                               next unless ($sql =~ /.txt$/);
+                                               push @sql, $sql;
+                                       }
+                               }
+                               $loopend=0;
+                               while (not $loopend) {
+                                       print heading("SELECT SQL FILE");
+                                       print qq|
+Select a file to append to the Koha DB.
+enter a number. A detailled explanation of the file will be given
+if you confirm, the file will be added to the DB
+|;
+                                       for (my $i=0;$i<=$#sql;$i++) {
+                                               print "$i => ".$sql[$i]."\n";
+                                       }
+                                       my $response =<STDIN>;
+                                       if ($response==0) {
+                                               $loopend = 1;
+                                       } else {
+                                               # show the content of the file
+                                               my $FileToUpload = $sql[$response];
+                                               open FILE,"scripts/misc/sql-datas/$sqluploaddir/$FileToUpload";
+                                               my $content = <FILE>;
+                                               print heading("INSERT $sqluploaddir/$FileToUpload ?")."$content\n";
+                                               # ask confirmation
+                                               $response=showmessage(getmessage('ConfirmFileUpload'), 'yn', 'y');
+                                               # if confirmed, upload the file in the DB
+                                               unless ($response =~/^n/i) {
+                                                       $FileToUpload =~ s/\.txt/\.sql/;
+                                                       system("$mysqldir/bin/mysql '-u$user' '$database' <scripts/misc/sql-datas/$sqluploaddir/$FileToUpload");
+                                               }
+                                       }
+                               }
+                               $loopend=0;
+                       }
+               }
        }
 }
 
-
 =item restartapache
 
     restartapache;
@@ -1702,38 +2063,136 @@ sub populatedatabase {
 Asks the user whether to restart Apache, and restart it if the user
 wants so.
 
-FIXME: If the installer does not know how to restart the Apache
-server (e.g., if the user is not actually using Apache), it still
-asks the question.
-
 =cut
 
 $messages->{'RestartApache'}->{en} = heading('RESTART APACHE') . qq|
-Apache needs to be restarted to load the new configuration for Koha.
-This requires the root password.
+The web server daemon needs to be restarted to load the new configuration for Koha.
+The installer can do this if you are using Apache and give the root password.
 
 Would you like to try to restart Apache now?  [Y]/N: |;
 
 sub restartapache {
+       my ($auto_install)=@_;
+       my $response;
+    $response=showmessage(getmessage('RestartApache'), 'yn', 'y') unless ($auto_install->{NoPressEnter});
+    $response='y' if ($auto_install->{NoPressEnter});
 
-    my $response=showmessage(getmessage('RestartApache'), 'yn', 'y');
+    unless ($response=~/^n/i) {
+               startsysout();
+               # Need to support other init structures here?
+               if (-e "/etc/rc.d/init.d/httpd") {
+                       system('su root -c "/etc/rc.d/init.d/httpd restart"');
+               } elsif (-e "/etc/init.d/apache") {
+                       system('su root -c "/etc/init.d/apache restart"');
+               } elsif (-e "/etc/init.d/apache-ssl") {
+                       system('su root -c "/etc/init.d/apache-ssl restart"');
+               }
+       }
+}
 
+=item backupkoha
 
+   backupkoha;
 
-    unless ($response=~/^n/i) {
-       startsysout();
-       # Need to support other init structures here?
-       if (-e "/etc/rc.d/init.d/httpd") {
-           system('su root -c /etc/rc.d/init.d/httpd restart');
-       } elsif (-e "/etc/init.d/apache") {
-           system('su root -c /etc/init.d/apache restart');
-       } elsif (-e "/etc/init.d/apache-ssl") {
-           system('su root -c /etc/init.d/apache-ssl restart');
+This function attempts to back up all koha's details.
+
+=cut
+
+$messages->{'BackupDir'}->{en} = heading('BACKUP STORAGE').qq|
+The upgrader will now try to backup your old files.
+
+Please specify a directory to store the backup in [%s]: |;
+
+$messages->{'BackupSummary'}->{en} = heading('BACKUP SUMMARY').qq|
+Backed up:
+
+%6d biblio entries
+%6d biblioitems entries
+%6d items entries
+%6d borrowers
+
+File Listing
+---------------------------------------------------------------------
+%s
+---------------------------------------------------------------------
+
+Does this look right? ([Y]/N): |;
+
+#FIXME: rewrite to use Install.pm
+sub backupkoha {
+if (!$ENV{prefix}) { $ENV{prefix} = "/usr/local"; }
+my $backupdir=$ENV{prefix}.'/backups';
+
+my $answer = showmessage(getmessage('BackupDir',[$backupdir]),'free',$backupdir);
+$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 $mysqldir = getmysqldir();
 
+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;
+
+setmysqlclipass($pass); 
+open (MD, "$mysqldir/bin/mysqldump '--user=$user' --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;
+$answer = showmessage(getmessage('BackupSummary',[$bibliocounter, $biblioitemcounter, $itemcounter, $membercounter, $filels]),'yn');
+
+if ($answer=~/^n/i) {
+    print qq|
+
+Aborting.  The database dump is located in:
+
+       $backupdir/Koha.backup_$date
+
+|;
+    exit;
+} else {
+       print "Great! continuing upgrade... \n";
+};
+
+
+
+}
 
 =item finalizeconfigfile
 
@@ -1778,6 +2237,7 @@ sub loadconfigfile {
     my %configfile;
 
        #MJR: reverted to r1.53.  Please call setetcdir().  Do NOT hardcode this.
+       #FIXME: make a dated backup
     open (KC, "<$etcdir/koha.conf");
     while (<KC>) {
      chomp;
@@ -1794,14 +2254,15 @@ sub loadconfigfile {
      }
     }
 
-    $::intranetdir=$configfile{'intranetdir'};
-    $::opacdir=$configfile{'opacdir'};
-    $::kohaversion=$configfile{'kohaversion'};
-    $::kohalogdir=$configfile{'kohalogdir'};
-    $::database=$configfile{'database'};
-    $::hostname=$configfile{'hostname'};
-    $::user=$configfile{'user'};
-    $::pass=$configfile{'pass'};
+       #MJR: Reverted this too. You do not mess with my privates. Please ask for new functions if required.
+    $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)
@@ -1837,10 +2298,10 @@ sub backupmycnf {
 }
 
 sub restoremycnf {
-       if (-e $mycnf) {
+       if (defined $mycnf && -e $mycnf) {
                unlink($mycnf);
        }
-       if (-e $mytmpcnf) {
+       if (defined $mytmpcnf && -e $mytmpcnf) {
                rename $mytmpcnf,$mycnf;
        }
 }
@@ -1849,8 +2310,9 @@ sub restoremycnf {
 
 =head1 SEE ALSO
 
-buildrelease.pl,
+buildrelease.pl
 installer.pl
+koha.upgrade
 
 =cut