diff --git a/scripts/mysql_install_db.pl.in b/scripts/mysql_install_db.pl.in index c142d4f..f1f2891 100644 --- a/scripts/mysql_install_db.pl.in +++ b/scripts/mysql_install_db.pl.in @@ -34,13 +34,35 @@ # ############################################################################## -use Fcntl; -use File::Basename; -use File::Copy; -use Getopt::Long; -use Sys::Hostname; -use Data::Dumper; use strict; +use warnings; + +############################################################################## +# Check if all needed modules are available, exit if something is missing. +############################################################################## + +BEGIN { + my @req_mods = ('Fcntl', 'File::Basename', 'File::Copy', 'Getopt::Long', + 'Sys::Hostname', 'Data::Dumper'); + my @missing_mods; + my $req; + foreach $req (@req_mods) { + eval 'require ' . $req; + if ($@) { + push(@missing_mods, $req); + } else { + $req->import(); + } + } + # this avoids the confusing "BEGIN failed--compilation aborted" message + local $SIG{__DIE__} = sub {warn @_; exit 1}; + + if (@missing_mods) { + my $msg = "FATAL ERROR: please install the following Perl modules " . + "before executing $0:\n" . join("\n",@missing_mods)."\n"; + die $msg; + } +} Getopt::Long::Configure("pass_through"); @@ -75,6 +97,8 @@ Usage: $0 [OPTIONS] --help Display this help and exit. --ldata=path The path to the MySQL data directory. Same as --datadir. --no-defaults Don't read default options from any option file. + --keep-my-cnf Don't try to create my.cnf based on template. + Useful for systems with working, updated my.cnf. EOF1 if ( $^O !~ m/^(MSWin32|cygwin)$/ ) { print <<EOF2; @@ -86,6 +110,7 @@ EOF2 print <<EOF3; --rpm For internal use. This option is used by RPM files during the MySQL installation process. + Implies --keep-my-cnf option. --skip-name-resolve Use IP addresses rather than hostnames when creating grant table entries. This option can be useful if your DNS does not work. @@ -149,6 +174,7 @@ sub parse_arguments "skip-name-resolve", "verbose", + "keep-my-cnf", "rpm", "help", "random-passwords", @@ -356,13 +382,19 @@ sub tell_root_password { ############################################################################## sub generate_random_password { - # On (at least) Linux and Solaris, a "random" device is available, use it: - # cat /dev/urandom | LC_ALL=C tr -dc "[:alnum:]" | fold -w 8 | head -1 - # Without LC_ALL, "tr" may not know the "alnum" character class - - # and there are user profiles which do not have this set. - # - my $password = `cat /dev/urandom | LC_ALL=C tr -dc "[:alnum:]" | fold -w 8 | head -1`; - chomp ($password); + # On Linux, Solaris, Max OS X and FreeBSD we have a random device available. + my $randfile = "/dev/urandom"; + open(FD, $randfile) || die "Can't open $randfile for reading: $!"; + my $password = ""; + my $pass_len = 16; + my $c; + while (length($password) < $pass_len) { + $c = getc(FD); + if ($c =~ /\w/) { + $password .= $c; + } + } + close(FD); return $password; } @@ -399,11 +431,16 @@ $basedir= "@prefix@" if ! $basedir; # Default # ---------------------------------------------------------------------- my $print_defaults; +my $keep_my_cnf = 0; if ( $opt->{srcdir} and $opt->{basedir} ) { error($opt,"Specify either --basedir or --srcdir, not both"); } +if ( $opt->{rpm} || $opt->{'keep-my-cnf'} ) +{ + $keep_my_cnf = 1; +} if ( $opt->{srcdir} ) { $opt->{builddir} = $opt->{srcdir} unless $opt->{builddir}; @@ -425,13 +462,18 @@ my $config_file; my $copy_cfg_file; # ---------------------------------------------------------------------- -# This will be the default config file +# This will be the default config file (unless creation is unwanted) # ---------------------------------------------------------------------- $config_file= "$basedir/my.cnf"; my $cfg_template= find_in_basedir($opt,"file","my-default.cnf", "share","share/mysql","support-files"); +# Distros might move files +if ((! -r $cfg_template) && (-r "@pkgdatadir@/my-default.cnf")) { + $cfg_template = "@pkgdatadir@/my-default.cnf"; +} + -e $cfg_template or cannot_find_file("my-default.cnf"); $copy_cfg_file= $config_file; @@ -441,22 +483,21 @@ if (-e $copy_cfg_file) $copy_cfg_file =~ s/my.cnf/my-new.cnf/; # Too early to print warning here, the user may not notice } -open (TEMPL, $cfg_template) or error($opt, "Could not open config template $cfg_template"); -if (open (CFG, "> $copy_cfg_file")) -{ - while (<TEMPL>) - { - # Remove lines beginning with # *** which are template comments - print CFG $_ unless /^# \*\*\*/; + +if ( ! $keep_my_cnf ) { + open (TEMPL, $cfg_template) or error($opt, "Could not open config template $cfg_template"); + if (open (CFG, "> $copy_cfg_file")) { + while (<TEMPL>) { + # Remove lines beginning with # *** which are template comments + print CFG $_ unless /^# \*\*\*/; + } + close CFG; + } else { + warning($opt,"Could not write to config file $copy_cfg_file: $!"); + $failed_write_cfg= 1; } - close CFG; + close TEMPL; } -else -{ - warning($opt,"Could not write to config file $copy_cfg_file: $!"); - $failed_write_cfg= 1; -} -close TEMPL; # ---------------------------------------------------------------------- # Now we can get arguments from the groups [mysqld] and [mysql_install_db] @@ -619,7 +660,7 @@ if ( $opt->{'skip-name-resolve'} and $resolved and $resolved =~ /\s/ ) } # ---------------------------------------------------------------------- -# Create database directories mysql & test +# Create database directory mysql # ---------------------------------------------------------------------- # FIXME The shell variant uses "mkdir -p": @@ -652,7 +693,7 @@ if ($opt_user) } } -foreach my $dir ( $opt->{ldata}, "$opt->{ldata}/mysql", "$opt->{ldata}/test" ) +foreach my $dir ( $opt->{ldata}, "$opt->{ldata}/mysql") { mkdir($dir, 0700) unless -d $dir; if ($opt_user and -w "/") @@ -838,15 +879,26 @@ if ( open(PIPE, "| $mysqld_install_cmd_line") ) " cd mysql-test ; perl mysql-test-run.pl"); } report($opt, - "Please report any problems with the " . '@scriptdir@' . "/mysqlbug script!", - "", "The latest information about MySQL is available on the web at", "", " http://www.mysql.com", "", - "Support MySQL by buying support/licenses at http://shop.mysql.com"); + "Please visit", + "", + " http://bugs.mysql.com/", + "", + "to report bugs. This database is public and can be browsed", + "and searched by anyone. If you log in to the system", + "you can enter new reports."); + - if ($copy_cfg_file eq $config_file and !$failed_write_cfg) + if ($keep_my_cnf) + { + report($opt, + "Note: new default config file not created.", + "Please make sure your config file is current"); + } + elsif ($copy_cfg_file eq $config_file and !$failed_write_cfg) { report($opt, "New default config file was created as $config_file and", @@ -900,9 +952,15 @@ else "http://www.mysql.com", "Please consult the MySQL manual section: 'Problems running mysql_install_db',", "and the manual section that describes problems on your OS.", - "Another information source is the MySQL email archive.", - "Please check all of the above before mailing us!", - "And if you do mail us, you MUST use the " . '@scriptdir@' . "/mysqlbug script!") + "Another information source is our bug database.", + "Please visit", + "", + " http://bugs.mysql.com/", + "", + "to report bugs. This database is public and can be browsed", + "and searched by anyone. If you log in to the system you can", + "enter new reports."); + } ##############################################################################