diff options
author | lpsolit%gmail.com <> | 2006-12-09 20:51:33 +0100 |
---|---|---|
committer | lpsolit%gmail.com <> | 2006-12-09 20:51:33 +0100 |
commit | accd734fd5a4ac2d242997c110c1924844219ba7 (patch) | |
tree | 2f82a2be166e2aea8bf75cc6aaa17374f0d9534a | |
parent | 850da7d0ea8233e343d31f159a9f21c18b0f1390 (diff) | |
download | bugzilla-accd734fd5a4ac2d242997c110c1924844219ba7.tar.gz bugzilla-accd734fd5a4ac2d242997c110c1924844219ba7.tar.xz |
Bug 361252: checksetup.pl should get confirmation from the user before causing dataloss in UTF8 conversion - Patch by Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit a=myk
-rw-r--r-- | Bugzilla.pm | 32 | ||||
-rw-r--r-- | Bugzilla/Config.pm | 2 | ||||
-rw-r--r-- | Bugzilla/Constants.pm | 7 | ||||
-rw-r--r-- | Bugzilla/DB/Mysql.pm | 21 | ||||
-rw-r--r-- | Bugzilla/Install.pm | 2 | ||||
-rw-r--r-- | Bugzilla/Install/Localconfig.pm | 6 | ||||
-rwxr-xr-x | checksetup.pl | 38 |
7 files changed, 75 insertions, 33 deletions
diff --git a/Bugzilla.pm b/Bugzilla.pm index 7c52dd500..32f731859 100644 --- a/Bugzilla.pm +++ b/Bugzilla.pm @@ -327,6 +327,28 @@ sub usage_mode { || Bugzilla::Constants::USAGE_MODE_BROWSER; } +sub installation_mode { + my ($class, $newval) = @_; + ($class->request_cache->{installation_mode} = $newval) if defined $newval; + return $class->request_cache->{installation_mode} + || INSTALLATION_MODE_INTERACTIVE; +} + +sub installation_answers { + my ($class, $filename) = @_; + if ($filename) { + my $s = new Safe; + $s->rdo($filename); + + die "Error reading $filename: $!" if $!; + die "Error evaluating $filename: $@" if $@; + + # Now read the param back out from the sandbox + $class->request_cache->{installation_answers} = $s->varglob('answer'); + } + return $class->request_cache->{installation_answers} || {}; +} + sub switch_to_shadow_db { my $class = shift; @@ -570,6 +592,16 @@ usage mode. C<Bugzilla->usage_mode> will return the current state of this flag. +=item C<installation_mode> + +Determines whether or not installation should be silent. See +L<Bugzilla::Constants> for the C<INSTALLATION_MODE> constants. + +=item C<installation_answers> + +Returns a hashref representing any "answers" file passed to F<checksetup.pl>, +used to automatically answer or skip prompts. + =item C<dbh> The current database handle. See L<DBI>. diff --git a/Bugzilla/Config.pm b/Bugzilla/Config.pm index 0859c5bee..85c9d6dec 100644 --- a/Bugzilla/Config.pm +++ b/Bugzilla/Config.pm @@ -100,7 +100,7 @@ sub SetParam { sub update_params { my ($params) = @_; - my $answer = $params->{answer} || {}; + my $answer = Bugzilla->installation_answers; my $param = read_param_file(); diff --git a/Bugzilla/Constants.pm b/Bugzilla/Constants.pm index 89032c0b0..1b774c64c 100644 --- a/Bugzilla/Constants.pm +++ b/Bugzilla/Constants.pm @@ -127,6 +127,9 @@ use File::Basename; ERROR_MODE_DIE ERROR_MODE_DIE_SOAP_FAULT + INSTALLATION_MODE_INTERACTIVE + INSTALLATION_MODE_NON_INTERACTIVE + DB_MODULE ROOT_USER ON_WINDOWS @@ -349,6 +352,10 @@ use constant ERROR_MODE_WEBPAGE => 0; use constant ERROR_MODE_DIE => 1; use constant ERROR_MODE_DIE_SOAP_FAULT => 2; +# The various modes that checksetup.pl can run in. +use constant INSTALLATION_MODE_INTERACTIVE => 0; +use constant INSTALLATION_MODE_NON_INTERACTIVE => 1; + # Data about what we require for different databases. use constant DB_MODULE => { 'mysql' => {db => 'Bugzilla::DB::Mysql', db_version => '4.1.2', diff --git a/Bugzilla/DB/Mysql.pm b/Bugzilla/DB/Mysql.pm index 4335a1b2f..a8210a972 100644 --- a/Bugzilla/DB/Mysql.pm +++ b/Bugzilla/DB/Mysql.pm @@ -43,6 +43,7 @@ package Bugzilla::DB::Mysql; use strict; +use Bugzilla::Constants; use Bugzilla::Util; use Bugzilla::Error; @@ -349,7 +350,7 @@ sub bz_setup_database { . "If you would like to cancel, press Ctrl-C now..." . " (Waiting 45 seconds...)\n\n"; # Wait 45 seconds for them to respond. - sleep(45); + sleep(45) unless Bugzilla->installation_answers->{NO_PAUSE}; } print "Renaming indexes...\n"; @@ -566,9 +567,23 @@ WARNING: We are about to convert your table storage format to UTF8. This If you ever used a version of Bugzilla before 2.22, we STRONGLY recommend that you stop checksetup.pl NOW and run contrib/recode.pl. - Continuing in 60 seconds... EOT - sleep 60; + + if (!Bugzilla->installation_answers->{NO_PAUSE}) { + if (Bugzilla->installation_mode == + INSTALLATION_MODE_NON_INTERACTIVE) + { + print <<EOT; + Re-run checksetup.pl in interactive mode (without an 'answers' file) + to continue. +EOT + exit; + } + else { + print " Press Enter to continue or Ctrl-C to exit..."; + getc; + } + } print "Converting table storage format to UTF-8. This may take a", " while.\n"; diff --git a/Bugzilla/Install.pm b/Bugzilla/Install.pm index 18f7473ae..c31bb58df 100644 --- a/Bugzilla/Install.pm +++ b/Bugzilla/Install.pm @@ -274,7 +274,7 @@ sub create_admin { return if $admin_count; - my %answer = %{$params->{answer} || {}}; + my %answer = %{Bugzilla->installation_answers}; my $login = $answer{'ADMIN_EMAIL'}; my $password = $answer{'ADMIN_PASSWORD'}; my $full_name = $answer{'ADMIN_REALNAME'}; diff --git a/Bugzilla/Install/Localconfig.pm b/Bugzilla/Install/Localconfig.pm index 9cc8c49cc..ed502d8a7 100644 --- a/Bugzilla/Install/Localconfig.pm +++ b/Bugzilla/Install/Localconfig.pm @@ -275,7 +275,7 @@ sub update_localconfig { my ($params) = @_; my $output = $params->{output} || 0; - my $answer = $params->{answer} || {}; + my $answer = Bugzilla->installation_answers; my $localconfig = read_localconfig('include deprecated'); my @new_vars; @@ -401,7 +401,7 @@ Bugzilla::Install::Localconfig - Functions and variables dealing =head1 SYNOPSIS use Bugzilla::Install::Requirements qw(update_localconfig); - update_localconfig({ output => 1, answer => \%answer }); + update_localconfig({ output => 1 }); =head1 DESCRIPTION @@ -453,7 +453,7 @@ Returns: A hashref of the localconfig variables. If an array (and C<OLD_LOCALCONFIG_VARS> if C<$include_deprecated> is specified). -=item C<update_localconfig({ output =E<gt> 1, answer =E<gt> \%answer })> +=item C<update_localconfig({ output =E<gt> 1 })> Description: Adds any new variables to localconfig that aren't currently defined there. Also optionally prints out diff --git a/checksetup.pl b/checksetup.pl index d2313c92b..eefff4918 100755 --- a/checksetup.pl +++ b/checksetup.pl @@ -58,25 +58,6 @@ use Bugzilla::Install::Requirements; require 5.008001 if ON_WINDOWS; # for CGI 2.93 or higher ###################################################################### -# Subroutines -###################################################################### - -sub read_answers_file { - my %hash; - if ($ARGV[0]) { - my $s = new Safe; - $s->rdo($ARGV[0]); - - die "Error reading $ARGV[0]: $!" if $!; - die "Error evaluating $ARGV[0]: $@" if $@; - - # Now read the param back out from the sandbox - %hash = %{$s->varglob('answer')}; - } - return \%hash; -} - -###################################################################### # Live Code ###################################################################### @@ -89,9 +70,8 @@ pod2usage({-verbose => 1, -exitval => 1}) if $switch{'help'}; # Read in the "answers" file if it exists, for running in # non-interactive mode. -our %answer = %{read_answers_file()}; - -my $silent = scalar(keys %answer) && !$switch{'verbose'}; +my $answers_file = $ARGV[0]; +my $silent = $answers_file && !$switch{'verbose'}; display_version_and_os() unless $silent; # Check required --MODULES-- @@ -132,6 +112,8 @@ require Bugzilla::Field; require Bugzilla::Install; Bugzilla->usage_mode(USAGE_MODE_CMDLINE); +Bugzilla->installation_mode(INSTALLATION_MODE_NON_INTERACTIVE) if $answers_file; +Bugzilla->installation_answers($answers_file); # When we're running at the command line, we need to pick the right # language before ever creating a template object. @@ -142,7 +124,7 @@ $ENV{'HTTP_ACCEPT_LANGUAGE'} ||= setlocale(LC_CTYPE); ########################################################################### print "Reading " . bz_locations()->{'localconfig'} . "...\n" unless $silent; -update_localconfig({ output => !$silent, answer => \%answer }); +update_localconfig({ output => !$silent }); my $lc_hash = Bugzilla->localconfig; ########################################################################### @@ -172,7 +154,7 @@ create_htaccess() if $lc_hash->{'create_htaccess'}; # Remove parameters from the params file that no longer exist in Bugzilla, # and set the defaults for new ones -update_params({ answer => \%answer}); +update_params(); ########################################################################### # Pre-compile --TEMPLATE-- code @@ -229,7 +211,7 @@ Bugzilla::Install::update_settings(); ########################################################################### Bugzilla::Install::make_admin($switch{'make-admin'}) if $switch{'make-admin'}; -Bugzilla::Install::create_admin({ answer => \%answer }); +Bugzilla::Install::create_admin(); ########################################################################### # Create default Product and Classification @@ -471,6 +453,12 @@ The format of that file is as follows: $answer{'SMTP_SERVER'} = 'mail.mydomain.net'; + $answer{'NO_PAUSE'} = 1 + +C<NO_PAUSE> means "never stop and prompt the user to hit Enter to continue, +just go ahead and do things, even if they are potentially dangerous." +Don't set this to 1 unless you know what you are doing. + =head1 SEE ALSO =over |