Merge trift2.:/MySQL/M50/mysql-5.0
into trift2.:/MySQL/M50/push-5.0 configure.in: Auto merged extra/resolveip.c: Auto merged
This commit is contained in:
commit
81ac291104
22
BitKeeper/triggers/post-commit.innodb.pl
Executable file
22
BitKeeper/triggers/post-commit.innodb.pl
Executable file
@ -0,0 +1,22 @@
|
|||||||
|
#! /usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use FindBin;
|
||||||
|
require "$FindBin::Bin/triggers-lib.pl";
|
||||||
|
|
||||||
|
# Don't run unless commit was successful
|
||||||
|
check_status() || exit 0;
|
||||||
|
|
||||||
|
my $cset = latest_cset();
|
||||||
|
|
||||||
|
# Read most recent ChangeSet's changed files. Send merge changes along, since
|
||||||
|
# they'll need to be incorporated in InnoDB's source tree eventually.
|
||||||
|
my $changes = innodb_get_changes('cset', $cset, 'yes')
|
||||||
|
or exit 0;
|
||||||
|
|
||||||
|
innodb_send_changes_email($cset, $changes)
|
||||||
|
or exit 1;
|
||||||
|
|
||||||
|
exit 0;
|
30
BitKeeper/triggers/post-incoming.innodb.pl
Executable file
30
BitKeeper/triggers/post-incoming.innodb.pl
Executable file
@ -0,0 +1,30 @@
|
|||||||
|
#! /usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use FindBin;
|
||||||
|
require "$FindBin::Bin/triggers-lib.pl";
|
||||||
|
|
||||||
|
# Don't run unless push/pull was successful
|
||||||
|
check_status() or exit 0;
|
||||||
|
|
||||||
|
# Don't run if push/pull is in local clones
|
||||||
|
exit 0 if repository_type() eq 'local';
|
||||||
|
|
||||||
|
# For each pushed ChangeSet, check it for InnoDB files and send
|
||||||
|
# diff of entire ChangeSet to InnoDB developers if such changes
|
||||||
|
# exist.
|
||||||
|
|
||||||
|
my $error = 0;
|
||||||
|
|
||||||
|
foreach my $cset (read_bk_csetlist())
|
||||||
|
{
|
||||||
|
my $changes = innodb_get_changes('cset', $cset, 'yes')
|
||||||
|
or next;
|
||||||
|
|
||||||
|
innodb_send_changes_email($cset, $changes)
|
||||||
|
or $error = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
exit ($error == 0 ? 0 : 1);
|
21
BitKeeper/triggers/pre-commit.innodb.pl
Executable file
21
BitKeeper/triggers/pre-commit.innodb.pl
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#! /usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use FindBin;
|
||||||
|
require "$FindBin::Bin/triggers-lib.pl";
|
||||||
|
|
||||||
|
die "$0: Script error: \$BK_PENDING is not set in pre-commit trigger\n"
|
||||||
|
unless defined $ENV{BK_PENDING};
|
||||||
|
|
||||||
|
# Read changed files from $BK_PENDING directly. Do not bother user about
|
||||||
|
# merge changes; they don't have any choice, the merge must be done.
|
||||||
|
my $changes = innodb_get_changes('file', $ENV{BK_PENDING}, undef)
|
||||||
|
or exit 0;
|
||||||
|
|
||||||
|
innodb_inform_and_query_user($changes)
|
||||||
|
or exit 1; # Abort commit
|
||||||
|
|
||||||
|
# OK, continue with commit
|
||||||
|
exit 0;
|
360
BitKeeper/triggers/triggers-lib.pl
Normal file
360
BitKeeper/triggers/triggers-lib.pl
Normal file
@ -0,0 +1,360 @@
|
|||||||
|
# To use this convenience library in a trigger, simply require it at
|
||||||
|
# at the top of the script. For example:
|
||||||
|
#
|
||||||
|
# #! /usr/bin/perl
|
||||||
|
#
|
||||||
|
# use FindBin;
|
||||||
|
# require "$FindBin::Bin/triggers-lib.pl";
|
||||||
|
#
|
||||||
|
# FindBin is needed, because sometimes a trigger is called from the
|
||||||
|
# RESYNC directory, and the trigger dir is ../BitKeeper/triggers
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use Carp;
|
||||||
|
use FindBin;
|
||||||
|
|
||||||
|
|
||||||
|
my $mysql_version = "5.0";
|
||||||
|
|
||||||
|
# These addresses must be kept current in all MySQL versions.
|
||||||
|
# See the wiki page InnoDBandOracle.
|
||||||
|
#my @innodb_to_email = ('dev_innodb_ww@oracle.com');
|
||||||
|
#my @innodb_cc_email = ('dev-innodb@mysql.com');
|
||||||
|
# FIXME: Keep this for testing; remove it once it's been used for a
|
||||||
|
# week or two.
|
||||||
|
my @innodb_to_email = ('tim@mysql.com');
|
||||||
|
my @innodb_cc_email = ();
|
||||||
|
|
||||||
|
# This is for MySQL <= 5.0. Regex which defines the InnoDB files
|
||||||
|
# which should generally not be touched by MySQL developers.
|
||||||
|
my $innodb_files_description = <<EOF;
|
||||||
|
innobase/*
|
||||||
|
mysql-test/t/innodb* (except mysql-test/t/innodb_mysql*)
|
||||||
|
mysql-test/r/innodb* (except mysql-test/r/innodb_mysql*)
|
||||||
|
sql/ha_innodb*
|
||||||
|
EOF
|
||||||
|
my $innodb_files_regex = qr{
|
||||||
|
^
|
||||||
|
(
|
||||||
|
# Case 1: innobase/*
|
||||||
|
innobase/
|
||||||
|
|
|
||||||
|
# Case 2: mysql-test/[tr]/innodb* (except innodb_mysql*)
|
||||||
|
mysql-test/(t|r)/SCCS/s.innodb
|
||||||
|
# The mysql-test/[tr]/innodb_mysql* are OK to edit
|
||||||
|
(?!_mysql)
|
||||||
|
|
|
||||||
|
# Case 3: sql/ha_innodb*
|
||||||
|
sql/SCCS/s.ha_innodb
|
||||||
|
)
|
||||||
|
}x;
|
||||||
|
|
||||||
|
|
||||||
|
# See 'bk help log', and the format of, e.g., $BK_PENDING.
|
||||||
|
# Important: this already contains the terminating newline!
|
||||||
|
my $file_rev_dspec = ':SFILE:|:REV:\n';
|
||||||
|
|
||||||
|
my $bktmp = "$FindBin::Bin/../tmp";
|
||||||
|
|
||||||
|
my $sendmail;
|
||||||
|
foreach ('/usr/sbin/sendmail', 'sendmail') {
|
||||||
|
$sendmail = $_;
|
||||||
|
last if -x $sendmail;
|
||||||
|
}
|
||||||
|
my $from = $ENV{REAL_EMAIL} || $ENV{USER} . '@mysql.com';
|
||||||
|
|
||||||
|
|
||||||
|
# close_or_warn
|
||||||
|
# $fh file handle to be closed
|
||||||
|
# $description description of the file handle
|
||||||
|
# RETURN Return value of close($fh)
|
||||||
|
#
|
||||||
|
# Print a nice warning message if close() isn't successful. See
|
||||||
|
# perldoc perlvar and perldoc -f close for details.
|
||||||
|
|
||||||
|
sub close_or_warn (*$)
|
||||||
|
{
|
||||||
|
my ($fh, $description) = @_;
|
||||||
|
|
||||||
|
my $status = close $fh;
|
||||||
|
if (not $status) {
|
||||||
|
warn "$0: error on close of '$description': ",
|
||||||
|
($! ? "$!" : "exit status " . ($? >> 8)), "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# check_status
|
||||||
|
# $warn If true, warn about bad status
|
||||||
|
# RETURN TRUE, if $BK_STATUS is "OK"; FALSE otherwise
|
||||||
|
#
|
||||||
|
# Also checks the undocumented $BK_COMMIT env variable
|
||||||
|
|
||||||
|
sub check_status
|
||||||
|
{
|
||||||
|
my ($warn) = @_;
|
||||||
|
|
||||||
|
my $status = (grep { defined $_ }
|
||||||
|
$ENV{BK_STATUS}, $ENV{BK_COMMIT}, '<undef>')[0];
|
||||||
|
|
||||||
|
unless ($status eq 'OK')
|
||||||
|
{
|
||||||
|
warn "Bad BK_STATUS '$status'\n" if $warn;
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# repository_location
|
||||||
|
#
|
||||||
|
# RETURN ('HOST', 'ROOT') for the repository being modified
|
||||||
|
|
||||||
|
sub repository_location
|
||||||
|
{
|
||||||
|
if ($ENV{BK_SIDE} eq 'client') {
|
||||||
|
return ($ENV{BK_HOST}, $ENV{BK_ROOT});
|
||||||
|
} else {
|
||||||
|
return ($ENV{BKD_HOST}, $ENV{BKD_ROOT});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# repository_type
|
||||||
|
# RETURN:
|
||||||
|
# 'main' for repo on bk-internal with post-incoming.bugdb trigger
|
||||||
|
# 'team' for repo on bk-internal with post-incoming.queuepush.pl trigger
|
||||||
|
# 'local' otherwise
|
||||||
|
#
|
||||||
|
# This definition may need to be modified if the host name or triggers change.
|
||||||
|
|
||||||
|
sub repository_type
|
||||||
|
{
|
||||||
|
my ($host, $root) = repository_location();
|
||||||
|
|
||||||
|
return 'local'
|
||||||
|
unless uc($host) eq 'BK-INTERNAL.MYSQL.COM'
|
||||||
|
and -e "$root/BitKeeper/triggers/post-incoming.queuepush.pl";
|
||||||
|
|
||||||
|
return 'main' if -e "$root/BitKeeper/triggers/post-incoming.bugdb";
|
||||||
|
|
||||||
|
return 'team';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# latest_cset
|
||||||
|
# RETURN Key for most recent ChangeSet
|
||||||
|
|
||||||
|
sub latest_cset {
|
||||||
|
chomp(my $retval = `bk changes -r+ -k`);
|
||||||
|
return $retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# read_bk_csetlist
|
||||||
|
# RETURN list of cset keys from $BK_CSETLIST file
|
||||||
|
sub read_bk_csetlist
|
||||||
|
{
|
||||||
|
die "$0: script error: \$BK_CSETLIST not set\n"
|
||||||
|
unless defined $ENV{BK_CSETLIST};
|
||||||
|
|
||||||
|
open CSETS, '<', $ENV{BK_CSETLIST}
|
||||||
|
or die "$0: can't read \$BK_CSETLIST='$ENV{BK_CSETLIST}': $!\n";
|
||||||
|
chomp(my @csets = <CSETS>);
|
||||||
|
close_or_warn(CSETS, "\$BK_CSETLIST='$ENV{BK_CSETLIST}'");
|
||||||
|
|
||||||
|
return @csets;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# innodb_get_changes
|
||||||
|
# $type 'file' or 'cset'
|
||||||
|
# $value file name (e.g., $BK_PENDING) or ChangeSet key
|
||||||
|
# $want_merge_changes flag; if false, merge changes will be ignored
|
||||||
|
# RETURN A string describing the InnoDB changes, or undef if no changes
|
||||||
|
#
|
||||||
|
# The return value does *not* include ChangeSet comments, only per-file
|
||||||
|
# comments.
|
||||||
|
|
||||||
|
sub innodb_get_changes
|
||||||
|
{
|
||||||
|
my ($type, $value, $want_merge_changes) = @_;
|
||||||
|
|
||||||
|
if ($type eq 'file')
|
||||||
|
{
|
||||||
|
open CHANGES, '<', $value
|
||||||
|
or die "$0: can't read '$value': $!\n";
|
||||||
|
}
|
||||||
|
elsif ($type eq 'cset')
|
||||||
|
{
|
||||||
|
open CHANGES, '-|', "bk changes -r'$value' -v -d'$file_rev_dspec'"
|
||||||
|
or die "$0: can't exec 'bk changes': $!\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
croak "$0: script error: invalid type '$type'";
|
||||||
|
}
|
||||||
|
|
||||||
|
my @changes = grep { /$innodb_files_regex/ } <CHANGES>;
|
||||||
|
|
||||||
|
close_or_warn(CHANGES, "($type, '$value')");
|
||||||
|
|
||||||
|
return undef unless @changes;
|
||||||
|
|
||||||
|
|
||||||
|
# Set up a pipeline of 'bk log' commands to weed out unwanted deltas. We
|
||||||
|
# never want deltas which contain no actual changes. We may not want deltas
|
||||||
|
# which are merges.
|
||||||
|
|
||||||
|
my @filters;
|
||||||
|
|
||||||
|
# This tests if :LI: (lines inserted) or :LD: (lines deleted) is
|
||||||
|
# non-zero. That is, did this delta change the file contents?
|
||||||
|
push @filters,
|
||||||
|
"bk log -d'"
|
||||||
|
. "\$if(:LI: -gt 0){$file_rev_dspec}"
|
||||||
|
. "\$if(:LI: -eq 0){\$if(:LD: -gt 0){$file_rev_dspec}}"
|
||||||
|
. "' -";
|
||||||
|
|
||||||
|
push @filters, "bk log -d'\$unless(:MERGE:){$file_rev_dspec}' -"
|
||||||
|
unless $want_merge_changes;
|
||||||
|
|
||||||
|
my $tmpname = "$bktmp/ibchanges.txt";
|
||||||
|
my $pipeline = join(' | ', @filters) . " > $tmpname";
|
||||||
|
open TMP, '|-', $pipeline
|
||||||
|
or die "$0: can't exec [[$pipeline]]: $!\n";
|
||||||
|
|
||||||
|
print TMP @changes;
|
||||||
|
close_or_warn(TMP, "| $pipeline");
|
||||||
|
|
||||||
|
# Use bk log to describe the changes
|
||||||
|
open LOG, "bk log - < $tmpname |"
|
||||||
|
or die "$0: can't exec 'bk log - < $tmpname': $!\n";
|
||||||
|
my @log = <LOG>;
|
||||||
|
close_or_warn(LOG, "bk log - < $tmpname |");
|
||||||
|
|
||||||
|
unlink $tmpname;
|
||||||
|
|
||||||
|
return undef unless @log;
|
||||||
|
|
||||||
|
return join('', @log);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Ask user if they really want to commit.
|
||||||
|
# RETURN TRUE = YES, commit; FALSE = NO, do not commit
|
||||||
|
|
||||||
|
sub innodb_inform_and_query_user
|
||||||
|
{
|
||||||
|
my ($description) = @_;
|
||||||
|
|
||||||
|
my $tmpname = "$bktmp/ibquery.txt";
|
||||||
|
|
||||||
|
open MESSAGE, "> $tmpname"
|
||||||
|
or die "$0: can't write message to '$tmpname': $!";
|
||||||
|
|
||||||
|
print MESSAGE <<EOF;
|
||||||
|
This ChangeSet modifies some files which should normally be changed by
|
||||||
|
InnoDB developers only. In general, MySQL developers should not change:
|
||||||
|
|
||||||
|
$innodb_files_description
|
||||||
|
The following InnoDB files were modified:
|
||||||
|
=========================================================
|
||||||
|
$description
|
||||||
|
=========================================================
|
||||||
|
|
||||||
|
If you understand this, you may Commit these changes. The changes
|
||||||
|
will be sent to the InnoDB developers at @{[join ', ', @innodb_to_email]},
|
||||||
|
CC @{[join ', ', @innodb_cc_email]}.
|
||||||
|
EOF
|
||||||
|
|
||||||
|
close_or_warn(MESSAGE, "$tmpname");
|
||||||
|
|
||||||
|
my $status = system('bk', 'prompt', '-w',
|
||||||
|
'-yCommit these changes', '-nDo not Commit', "-f$tmpname");
|
||||||
|
|
||||||
|
unlink $tmpname;
|
||||||
|
|
||||||
|
return ($status == 0 ? 1 : undef);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# innodb_send_changes_email
|
||||||
|
# $cset The ChangeSet key
|
||||||
|
# $description A (maybe brief) description of the changes
|
||||||
|
# RETURN TRUE = Success, e-mail sent; FALSE = Failure
|
||||||
|
#
|
||||||
|
# Sends a complete diff of changes in $cset by e-mail.
|
||||||
|
|
||||||
|
sub innodb_send_changes_email
|
||||||
|
{
|
||||||
|
my ($cset, $description) = @_;
|
||||||
|
|
||||||
|
# FIXME: Much of this is duplicated in the 'post-commit' Bourne shell
|
||||||
|
# trigger
|
||||||
|
|
||||||
|
my $cset_short = `bk changes -r'$cset' -d':P:::I:'`;
|
||||||
|
my $cset_key = `bk changes -r'$cset' -d':KEY:'`;
|
||||||
|
|
||||||
|
my ($host, $bk_root) = repository_location();
|
||||||
|
my $type = repository_type();
|
||||||
|
(my $treename = $bk_root) =~ s,^.*/,,;
|
||||||
|
|
||||||
|
print "Nofifying InnoDB developers at ",
|
||||||
|
(join ', ', @innodb_to_email, @innodb_cc_email), "\n";
|
||||||
|
|
||||||
|
open SENDMAIL, '|-', "$sendmail -t"
|
||||||
|
or die "Can't exec '$sendmail -t': $!\n";
|
||||||
|
|
||||||
|
my @headers;
|
||||||
|
push @headers, "List-ID: <bk.innodb-$mysql_version>";
|
||||||
|
push @headers, "From: $from";
|
||||||
|
push @headers, "To: " . (join ', ', @innodb_to_email);
|
||||||
|
push @headers, "Cc: " . (join ', ', @innodb_cc_email) if @innodb_cc_email;
|
||||||
|
push @headers,
|
||||||
|
"Subject: InnoDB changes in $type $mysql_version tree ($cset_short)";
|
||||||
|
push @headers, "X-CSetKey: <$cset_key>";
|
||||||
|
|
||||||
|
print SENDMAIL map { "$_\n" } @headers, '';
|
||||||
|
|
||||||
|
if ($type eq 'main')
|
||||||
|
{
|
||||||
|
print SENDMAIL <<EOF;
|
||||||
|
Changes pushed to $treename by $ENV{USER} affect the following
|
||||||
|
files. These changes are in a $mysql_version main tree. They
|
||||||
|
will be available publicly within 24 hours.
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
elsif ($type eq 'team')
|
||||||
|
{
|
||||||
|
print SENDMAIL <<EOF;
|
||||||
|
Changes added to $treename by $ENV{USER} affect the
|
||||||
|
following files. These changes are in a $mysql_version team tree.
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print SENDMAIL <<EOF;
|
||||||
|
A local commit by $ENV{USER} affects the following files. These
|
||||||
|
changes are in a clone of a $mysql_version tree.
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
print SENDMAIL "\n";
|
||||||
|
print SENDMAIL qx(bk changes -r'$cset');
|
||||||
|
print SENDMAIL "$description";
|
||||||
|
print SENDMAIL "The complete ChangeSet diffs follow.\n\n";
|
||||||
|
print SENDMAIL qx(bk rset -r'$cset' -ah | bk gnupatch -h -dup -T);
|
||||||
|
|
||||||
|
close_or_warn(SENDMAIL, "$sendmail -t")
|
||||||
|
or return undef;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
@ -27,7 +27,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "rlconf.h"
|
#include "rlconf.h"
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined (BUFSIZ)
|
#if !defined (BUFSIZ)
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (HAVE_STDLIB_H)
|
#if defined (HAVE_STDLIB_H)
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (HAVE_UNISTD_H)
|
#if defined (HAVE_UNISTD_H)
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
#include "rlconf.h"
|
#include "rlconf.h"
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
#define _RLDEFS_H_
|
#define _RLDEFS_H_
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include "config.h"
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "rlstdc.h"
|
#include "rlstdc.h"
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#define _RLWINSIZE_H_
|
#define _RLWINSIZE_H_
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include "config.h"
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Try to find the definitions of `struct winsize' and TIOGCWINSZ */
|
/* Try to find the definitions of `struct winsize' and TIOGCWINSZ */
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#include <config.h>
|
#include "config_readline.h"
|
||||||
#ifdef HAVE_STRING_H
|
#ifdef HAVE_STRING_H
|
||||||
# include <string.h>
|
# include <string.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdio.h> /* Just for NULL. Yuck. */
|
#include <stdio.h> /* Just for NULL. Yuck. */
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#define _RLTCAP_H_
|
#define _RLTCAP_H_
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include "config.h"
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (HAVE_TERMCAP_H)
|
#if defined (HAVE_TERMCAP_H)
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (HAVE_UNISTD_H)
|
#if defined (HAVE_UNISTD_H)
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (HAVE_UNISTD_H)
|
#if defined (HAVE_UNISTD_H)
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
#if defined (VI_MODE)
|
#if defined (VI_MODE)
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
# include <config.h>
|
# include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#define READLINE_LIBRARY
|
#define READLINE_LIBRARY
|
||||||
|
|
||||||
#if defined (HAVE_CONFIG_H)
|
#if defined (HAVE_CONFIG_H)
|
||||||
#include <config.h>
|
#include "config_readline.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -44,6 +44,9 @@ TARGET_LINK_LIBRARIES(my_print_defaults strings mysys debug dbug taocrypt wsock3
|
|||||||
ADD_EXECUTABLE(perror perror.c)
|
ADD_EXECUTABLE(perror perror.c)
|
||||||
TARGET_LINK_LIBRARIES(perror strings mysys debug dbug wsock32)
|
TARGET_LINK_LIBRARIES(perror strings mysys debug dbug wsock32)
|
||||||
|
|
||||||
|
ADD_EXECUTABLE(resolveip resolveip.c)
|
||||||
|
TARGET_LINK_LIBRARIES(resolveip strings mysys debug dbug wsock32)
|
||||||
|
|
||||||
ADD_EXECUTABLE(replace replace.c)
|
ADD_EXECUTABLE(replace replace.c)
|
||||||
TARGET_LINK_LIBRARIES(replace strings mysys debug dbug wsock32)
|
TARGET_LINK_LIBRARIES(replace strings mysys debug dbug wsock32)
|
||||||
|
|
||||||
|
@ -21,13 +21,15 @@
|
|||||||
#include <m_ctype.h>
|
#include <m_ctype.h>
|
||||||
#include <my_sys.h>
|
#include <my_sys.h>
|
||||||
#include <m_string.h>
|
#include <m_string.h>
|
||||||
#include <sys/types.h>
|
#ifndef WIN32
|
||||||
#include <sys/socket.h>
|
# include <sys/types.h>
|
||||||
#ifndef HAVE_BROKEN_NETINET_INCLUDES
|
# include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
# ifndef HAVE_BROKEN_NETINET_INCLUDES
|
||||||
|
# include <netinet/in.h>
|
||||||
|
# endif
|
||||||
|
# include <arpa/inet.h>
|
||||||
|
# include <netdb.h>
|
||||||
#endif
|
#endif
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
#include <my_net.h>
|
#include <my_net.h>
|
||||||
#include <my_getopt.h>
|
#include <my_getopt.h>
|
||||||
|
|
||||||
|
@ -527,6 +527,11 @@ void ProcessOldClientHello(input_buffer& input, SSL& ssl)
|
|||||||
input.read(len, sizeof(len));
|
input.read(len, sizeof(len));
|
||||||
uint16 randomLen;
|
uint16 randomLen;
|
||||||
ato16(len, randomLen);
|
ato16(len, randomLen);
|
||||||
|
if (ch.suite_len_ > MAX_SUITE_SZ || sessionLen > ID_LEN ||
|
||||||
|
randomLen > RAN_LEN) {
|
||||||
|
ssl.SetError(bad_input);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int j = 0;
|
int j = 0;
|
||||||
for (uint16 i = 0; i < ch.suite_len_; i += 3) {
|
for (uint16 i = 0; i < ch.suite_len_; i += 3) {
|
||||||
|
@ -101,6 +101,7 @@ template void ysArrayDelete<unsigned char>(unsigned char*);
|
|||||||
template void ysArrayDelete<char>(char*);
|
template void ysArrayDelete<char>(char*);
|
||||||
|
|
||||||
template int min<int>(int, int);
|
template int min<int>(int, int);
|
||||||
|
template uint16 min<uint16>(uint16, uint16);
|
||||||
template unsigned int min<unsigned int>(unsigned int, unsigned int);
|
template unsigned int min<unsigned int>(unsigned int, unsigned int);
|
||||||
template unsigned long min<unsigned long>(unsigned long, unsigned long);
|
template unsigned long min<unsigned long>(unsigned long, unsigned long);
|
||||||
}
|
}
|
||||||
|
@ -621,6 +621,10 @@ void HandShakeHeader::Process(input_buffer& input, SSL& ssl)
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint len = c24to32(length_);
|
uint len = c24to32(length_);
|
||||||
|
if (len > input.get_remaining()) {
|
||||||
|
ssl.SetError(bad_input);
|
||||||
|
return;
|
||||||
|
}
|
||||||
hashHandShake(ssl, input, len);
|
hashHandShake(ssl, input, len);
|
||||||
|
|
||||||
hs->set_length(len);
|
hs->set_length(len);
|
||||||
@ -1391,10 +1395,15 @@ input_buffer& operator>>(input_buffer& input, ClientHello& hello)
|
|||||||
|
|
||||||
// Suites
|
// Suites
|
||||||
byte tmp[2];
|
byte tmp[2];
|
||||||
|
uint16 len;
|
||||||
tmp[0] = input[AUTO];
|
tmp[0] = input[AUTO];
|
||||||
tmp[1] = input[AUTO];
|
tmp[1] = input[AUTO];
|
||||||
ato16(tmp, hello.suite_len_);
|
ato16(tmp, len);
|
||||||
|
|
||||||
|
hello.suite_len_ = min(len, static_cast<uint16>(MAX_SUITE_SZ));
|
||||||
input.read(hello.cipher_suites_, hello.suite_len_);
|
input.read(hello.cipher_suites_, hello.suite_len_);
|
||||||
|
if (len > hello.suite_len_) // ignore extra suites
|
||||||
|
input.set_current(input.get_current() + len - hello.suite_len_);
|
||||||
|
|
||||||
// Compression
|
// Compression
|
||||||
hello.comp_len_ = input[AUTO];
|
hello.comp_len_ = input[AUTO];
|
||||||
|
@ -40,3 +40,44 @@ ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/scripts/mysql_fix_privilege_tabl
|
|||||||
ADD_CUSTOM_TARGET(GenFixPrivs
|
ADD_CUSTOM_TARGET(GenFixPrivs
|
||||||
ALL
|
ALL
|
||||||
DEPENDS ${PROJECT_SOURCE_DIR}/scripts/mysql_fix_privilege_tables_sql.c)
|
DEPENDS ${PROJECT_SOURCE_DIR}/scripts/mysql_fix_privilege_tables_sql.c)
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# Replace some variables @foo@ in the .in/.sh file, and write the new script
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
SET(CFLAGS "-D_WINDOWS ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
|
||||||
|
SET(prefix "${CMAKE_INSTALL_PREFIX}/MySQL Server ${MYSQL_BASE_VERSION}")
|
||||||
|
SET(sysconfdir ${prefix})
|
||||||
|
SET(bindir ${prefix}/bin)
|
||||||
|
SET(libexecdir ${prefix}/bin)
|
||||||
|
SET(scriptdir ${prefix}/bin)
|
||||||
|
SET(datadir ${prefix}/share)
|
||||||
|
SET(pkgdatadir ${prefix}/share)
|
||||||
|
SET(localstatedir ${prefix}/data)
|
||||||
|
|
||||||
|
CONFIGURE_FILE(mysql_config.pl.in
|
||||||
|
scripts/mysql_config.pl ESCAPE_QUOTES @ONLY)
|
||||||
|
|
||||||
|
CONFIGURE_FILE(mysql_convert_table_format.sh
|
||||||
|
scripts/mysql_convert_table_format.pl ESCAPE_QUOTES @ONLY)
|
||||||
|
|
||||||
|
CONFIGURE_FILE(mysql_explain_log.sh
|
||||||
|
scripts/mysql_explain_log.pl ESCAPE_QUOTES @ONLY)
|
||||||
|
|
||||||
|
CONFIGURE_FILE(mysql_install_db.pl.in
|
||||||
|
scripts/mysql_install_db.pl ESCAPE_QUOTES @ONLY)
|
||||||
|
|
||||||
|
CONFIGURE_FILE(mysql_secure_installation.pl.in
|
||||||
|
scripts/mysql_secure_installation.pl ESCAPE_QUOTES @ONLY)
|
||||||
|
|
||||||
|
CONFIGURE_FILE(mysql_tableinfo.sh
|
||||||
|
scripts/mysql_tableinfo.pl ESCAPE_QUOTES @ONLY)
|
||||||
|
|
||||||
|
CONFIGURE_FILE(mysqld_multi.sh
|
||||||
|
scripts/mysqld_multi.pl ESCAPE_QUOTES @ONLY)
|
||||||
|
|
||||||
|
CONFIGURE_FILE(mysqldumpslow.sh
|
||||||
|
scripts/mysqldumpslow.pl ESCAPE_QUOTES @ONLY)
|
||||||
|
|
||||||
|
CONFIGURE_FILE(mysqlhotcopy.sh
|
||||||
|
scripts/mysqlhotcopy.pl ESCAPE_QUOTES @ONLY)
|
||||||
|
@ -48,11 +48,14 @@ EXTRA_SCRIPTS = make_binary_distribution.sh \
|
|||||||
make_win_src_distribution_old.sh \
|
make_win_src_distribution_old.sh \
|
||||||
msql2mysql.sh \
|
msql2mysql.sh \
|
||||||
mysql_config.sh \
|
mysql_config.sh \
|
||||||
|
mysql_config.pl.in \
|
||||||
mysql_fix_privilege_tables.sh \
|
mysql_fix_privilege_tables.sh \
|
||||||
mysql_fix_extensions.sh \
|
mysql_fix_extensions.sh \
|
||||||
mysql_install_db.sh \
|
mysql_install_db.sh \
|
||||||
|
mysql_install_db.pl.in \
|
||||||
mysql_setpermission.sh \
|
mysql_setpermission.sh \
|
||||||
mysql_secure_installation.sh \
|
mysql_secure_installation.sh \
|
||||||
|
mysql_secure_installation.pl.in \
|
||||||
mysql_zap.sh \
|
mysql_zap.sh \
|
||||||
mysqlaccess.sh \
|
mysqlaccess.sh \
|
||||||
mysqlbug.sh \
|
mysqlbug.sh \
|
||||||
|
@ -400,11 +400,13 @@ BASE=$BASE2
|
|||||||
#
|
#
|
||||||
|
|
||||||
if [ x"@GXX@" = x"yes" ] ; then
|
if [ x"@GXX@" = x"yes" ] ; then
|
||||||
gcclib=`@CC@ @CFLAGS@ --print-libgcc-file`
|
gcclib=`@CC@ @CFLAGS@ --print-libgcc-file 2>/dev/null` || true
|
||||||
if [ $? -ne 0 ] ; then
|
if [ -z "$gcclib" ] ; then
|
||||||
echo "Warning: Couldn't find libgcc.a!"
|
echo "Warning: Compiler doesn't tell libgcc.a!"
|
||||||
else
|
elif [ -f "$gcclib" ] ; then
|
||||||
$CP $gcclib $BASE/lib/libmygcc.a
|
$CP $gcclib $BASE/lib/libmygcc.a
|
||||||
|
else
|
||||||
|
echo "Warning: Compiler result '$gcclib' not found / no file!"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -327,35 +327,34 @@ if [ -d mysql-test/extra ] ; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
# Copy what could be usable in the "scripts" directory. Currently
|
# Copy what could be usable in the "scripts" directory
|
||||||
# only SQL files, others are Bourne shell scripts or Perl scripts
|
|
||||||
# not really usable on Windows.
|
|
||||||
#
|
|
||||||
# But to be nice to the few Cygwin users we might have in 5.0 we
|
|
||||||
# continue to copy the stuff, but don't include it in the WiX install.
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
mysql_scripts="\
|
||||||
|
mysql_config.pl \
|
||||||
|
mysql_convert_table_format.pl \
|
||||||
|
mysql_explain_log.pl \
|
||||||
|
mysql_install_db.pl \
|
||||||
|
mysql_secure_installation.pl \
|
||||||
|
mysql_tableinfo.pl \
|
||||||
|
mysqld_multi.pl \
|
||||||
|
mysqldumpslow.pl \
|
||||||
|
mysqlhotcopy.pl \
|
||||||
|
"
|
||||||
|
|
||||||
mkdir -p $DESTDIR/scripts
|
mkdir -p $DESTDIR/scripts
|
||||||
|
|
||||||
# Uncomment and remove the for loop in 5.1
|
for i in $mysql_scripts
|
||||||
#cp scripts/*.sql $DESTDIR/scripts/
|
do
|
||||||
|
cp scripts/$i $DESTDIR/scripts/$i
|
||||||
for i in `cd scripts && ls`; do \
|
|
||||||
if echo $i | grep -q '\.sh'; then \
|
|
||||||
cp scripts/$i $DESTDIR/scripts/`echo $i | sed -e 's/\.sh$//'`; \
|
|
||||||
elif [ -d scripts/$i -o $i = Makefile.am -o $i = Makefile.in -o -e scripts/$i.sh ] ; then \
|
|
||||||
: ; \
|
|
||||||
else \
|
|
||||||
cp scripts/$i $DESTDIR/scripts/$i; \
|
|
||||||
fi; \
|
|
||||||
done
|
done
|
||||||
|
|
||||||
cp -pR sql/share $DESTDIR/
|
cp -pR sql/share $DESTDIR/
|
||||||
cp -pR sql-bench $DESTDIR/
|
cp -pR sql-bench $DESTDIR/
|
||||||
rm -f $DESTDIR/sql-bench/*.sh $DESTDIR/sql-bench/Makefile*
|
rm -f $DESTDIR/sql-bench/*.sh $DESTDIR/sql-bench/Makefile*
|
||||||
|
|
||||||
# The SQL initialisation code is really expected to be in "share"
|
# The SQL initialisation code is to be in "share"
|
||||||
mv $DESTDIR/scripts/*.sql $DESTDIR/share/ || true
|
cp scripts/*.sql $DESTDIR/share/
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
# Clean up from possibly copied SCCS directories
|
# Clean up from possibly copied SCCS directories
|
||||||
|
285
scripts/mysql_config.pl.in
Normal file
285
scripts/mysql_config.pl.in
Normal file
@ -0,0 +1,285 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
# -*- cperl -*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2007 MySQL AB
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; version 2 of the License.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# This script reports various configuration settings that may be needed
|
||||||
|
# when using the MySQL client library.
|
||||||
|
#
|
||||||
|
# This script try to match the shell script version as close as possible,
|
||||||
|
# but in addition being compatible with ActiveState Perl on Windows.
|
||||||
|
#
|
||||||
|
# All unrecognized arguments to this script are passed to mysqld.
|
||||||
|
#
|
||||||
|
# NOTE: This script will only be used on Windows until solved how to
|
||||||
|
# handle @LIBS@ and other strings inserted that might contain
|
||||||
|
# several arguments, possibly with spaces in them.
|
||||||
|
#
|
||||||
|
# NOTE: This script was deliberately written to be as close to the shell
|
||||||
|
# script as possible, to make the maintenance of both in parallel
|
||||||
|
# easier.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
use File::Basename;
|
||||||
|
use Getopt::Long;
|
||||||
|
use Cwd;
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
my @exclude_cflags =
|
||||||
|
qw/DDBUG_OFF DSAFEMALLOC USAFEMALLOC DSAFE_MUTEX
|
||||||
|
DPEDANTIC_SAFEMALLOC DUNIV_MUST_NOT_INLINE DFORCE_INIT_OF_VARS
|
||||||
|
DEXTRA_DEBUG DHAVE_purify O O[0-9] xO[0-9] W[-A-Za-z]*
|
||||||
|
Xa xstrconst xc99=none
|
||||||
|
unroll2 ip mp restrict/;
|
||||||
|
|
||||||
|
my @exclude_libs = qw/lmtmalloc static-libcxa i-static static-intel/;
|
||||||
|
|
||||||
|
my $cwd = cwd();
|
||||||
|
my $basedir;
|
||||||
|
|
||||||
|
my $socket = '@MYSQL_UNIX_ADDR@';
|
||||||
|
my $version = '@VERSION@';
|
||||||
|
|
||||||
|
sub which
|
||||||
|
{
|
||||||
|
my $file = shift;
|
||||||
|
|
||||||
|
my $IFS = $^O eq "MSWin32" ? ";" : ":";
|
||||||
|
|
||||||
|
foreach my $dir ( split($IFS, $ENV{PATH}) )
|
||||||
|
{
|
||||||
|
if ( -f "$dir/$file" or -f "$dir/$file.exe" )
|
||||||
|
{
|
||||||
|
return "$dir/$file";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print STDERR "which: no $file in ($ENV{PATH})\n";
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# If we can find the given directory relatively to where mysql_config is
|
||||||
|
# we should use this instead of the incompiled one.
|
||||||
|
# This is to ensure that this script also works with the binary MySQL
|
||||||
|
# version
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
sub fix_path
|
||||||
|
{
|
||||||
|
my $default = shift;
|
||||||
|
my @dirs = @_;
|
||||||
|
|
||||||
|
foreach my $dirname ( @dirs )
|
||||||
|
{
|
||||||
|
my $path = "$basedir/$dirname";
|
||||||
|
if ( -d $path )
|
||||||
|
{
|
||||||
|
return $path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_full_path
|
||||||
|
{
|
||||||
|
my $file = shift;
|
||||||
|
|
||||||
|
# if the file is a symlink, try to resolve it
|
||||||
|
if ( $^O ne "MSWin32" and -l $file )
|
||||||
|
{
|
||||||
|
$file = readlink($file);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $file =~ m,^/, )
|
||||||
|
{
|
||||||
|
# Do nothing, absolute path
|
||||||
|
}
|
||||||
|
elsif ( $file =~ m,/, )
|
||||||
|
{
|
||||||
|
# Make absolute, and remove "/./" in path
|
||||||
|
$file = "$cwd/$file";
|
||||||
|
$file =~ s,/\./,/,g;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
# Find in PATH
|
||||||
|
$file = which($file);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Form a command line that can handle spaces in paths and arguments
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
sub quote_options {
|
||||||
|
my @cmd;
|
||||||
|
foreach my $opt ( @_ )
|
||||||
|
{
|
||||||
|
next unless $opt; # If undefined or empty, just skip
|
||||||
|
push(@cmd, "\"$opt\""); # Quote argument
|
||||||
|
}
|
||||||
|
return join(" ", @cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Main program
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
my $me = get_full_path($0);
|
||||||
|
$basedir = dirname(dirname($me)); # Remove "/bin/mysql_config" part
|
||||||
|
|
||||||
|
my $ldata = '@localstatedir@';
|
||||||
|
my $execdir = '@libexecdir@';
|
||||||
|
my $bindir = '@bindir@';
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# If installed, search for the compiled in directory first (might be "lib64")
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
my $pkglibdir = fix_path('@pkglibdir@',"libmysql/relwithdebinfo",
|
||||||
|
"libmysql/release","libmysql/debug","lib/mysql","lib");
|
||||||
|
|
||||||
|
my $pkgincludedir = fix_path('@pkgincludedir@', "include/mysql", "include");
|
||||||
|
|
||||||
|
# Assume no argument with space in it
|
||||||
|
my @ldflags = split(" ",'@LDFLAGS@');
|
||||||
|
|
||||||
|
my $port;
|
||||||
|
if ( '@MYSQL_TCP_PORT_DEFAULT@' == 0 ) {
|
||||||
|
$port = 0;
|
||||||
|
} else {
|
||||||
|
$port = '@MYSQL_TCP_PORT@';
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# Create options
|
||||||
|
# We intentionally add a space to the beginning and end of lib strings, simplifies replace later
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
my (@lib_opts,@lib_r_opts,@lib_e_opts);
|
||||||
|
if ( $^O eq "MSWin32" )
|
||||||
|
{
|
||||||
|
my $linkpath = "$pkglibdir";
|
||||||
|
# user32 is only needed for debug or embedded
|
||||||
|
my @winlibs = ("wsock32.lib","advapi32.lib","user32.lib");
|
||||||
|
@lib_opts = ("$linkpath/mysqlclient.lib",@winlibs);
|
||||||
|
@lib_r_opts = @lib_opts;
|
||||||
|
@lib_e_opts = ("$linkpath/mysqlserver.lib",@winlibs);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
my $linkpath = "-L$pkglibdir";
|
||||||
|
@lib_opts = ($linkpath,"-lmysqlclient");
|
||||||
|
@lib_r_opts = ($linkpath,"-lmysqlclient_r");
|
||||||
|
@lib_e_opts = ($linkpath,"-lmysqld");
|
||||||
|
}
|
||||||
|
|
||||||
|
my $flags;
|
||||||
|
$flags->{libs} =
|
||||||
|
[@ldflags,@lib_opts,'@ZLIB_DEPS@','@NON_THREADED_LIBS@','@openssl_libs@','@STATIC_NSS_FLAGS@'];
|
||||||
|
$flags->{libs_r} =
|
||||||
|
[@ldflags,@lib_r_opts,'@ZLIB_DEPS@','@LIBS@','@openssl_libs@'];
|
||||||
|
$flags->{embedded_libs} =
|
||||||
|
[@ldflags,@lib_e_opts,'@ZLIB_DEPS@','@LIBS@','@WRAPLIBS@','@innodb_system_libs@','@openssl_libs@'];
|
||||||
|
|
||||||
|
$flags->{include} = ["-I$pkgincludedir"];
|
||||||
|
$flags->{cflags} = [@{$flags->{include}},split(" ",'@CFLAGS@')];
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# Remove some options that a client doesn't have to care about
|
||||||
|
# FIXME until we have a --cxxflags, we need to remove -Xa
|
||||||
|
# and -xstrconst to make --cflags usable for Sun Forte C++
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
my $filter = join("|", @exclude_cflags);
|
||||||
|
my @tmp = @{$flags->{cflags}}; # Copy the flag list
|
||||||
|
$flags->{cflags} = []; # Clear it
|
||||||
|
foreach my $cflag ( @tmp )
|
||||||
|
{
|
||||||
|
push(@{$flags->{cflags}}, $cflag) unless $cflag =~ m/^($filter)$/o;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Same for --libs(_r)
|
||||||
|
$filter = join("|", @exclude_libs);
|
||||||
|
foreach my $lib_type ( "libs","libs_r","embedded_libs" )
|
||||||
|
{
|
||||||
|
my @tmp = @{$flags->{$lib_type}}; # Copy the flag list
|
||||||
|
$flags->{$lib_type} = []; # Clear it
|
||||||
|
foreach my $lib ( @tmp )
|
||||||
|
{
|
||||||
|
push(@{$flags->{$lib_type}}, $lib) unless $lib =~ m/^($filter)$/o;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $include = quote_options(@{$flags->{include}});
|
||||||
|
my $cflags = quote_options(@{$flags->{cflags}});
|
||||||
|
my $libs = quote_options(@{$flags->{libs}});
|
||||||
|
my $libs_r = quote_options(@{$flags->{libs_r}});
|
||||||
|
my $embedded_libs = quote_options(@{$flags->{embedded_libs}});
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Usage information, output if no option is given
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
sub usage
|
||||||
|
{
|
||||||
|
print <<EOF;
|
||||||
|
Usage: $0 [OPTIONS]
|
||||||
|
Options:
|
||||||
|
--cflags [$cflags]
|
||||||
|
--include [$include]
|
||||||
|
--libs [$libs]
|
||||||
|
--libs_r [$libs_r]
|
||||||
|
--socket [$socket]
|
||||||
|
--port [$port]
|
||||||
|
--version [$version]
|
||||||
|
--libmysqld-libs [$embedded_libs]
|
||||||
|
EOF
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ARGV or usage();
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Get options and output the values
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
GetOptions(
|
||||||
|
"cflags" => sub { print "$cflags\n" },
|
||||||
|
"include" => sub { print "$include\n" },
|
||||||
|
"libs" => sub { print "$libs\n" },
|
||||||
|
"libs_r" => sub { print "$libs_r\n" },
|
||||||
|
"socket" => sub { print "$socket\n" },
|
||||||
|
"port" => sub { print "$port\n" },
|
||||||
|
"version" => sub { print "$version\n" },
|
||||||
|
"embedded-libs|embedded|libmysqld-libs" =>
|
||||||
|
sub { print "$embedded_libs\n" },
|
||||||
|
) or usage();
|
||||||
|
|
||||||
|
exit 0
|
@ -1,4 +1,4 @@
|
|||||||
#!@PERL@
|
#!/usr/bin/perl
|
||||||
# Copyright (C) 2000-2002 MySQL AB
|
# Copyright (C) 2000-2002 MySQL AB
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#!@PERL@
|
#!/usr/bin/perl
|
||||||
# Copyright (C) 2001-2003, 2006 MySQL AB
|
# Copyright (C) 2001-2003, 2006 MySQL AB
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
612
scripts/mysql_install_db.pl.in
Normal file
612
scripts/mysql_install_db.pl.in
Normal file
@ -0,0 +1,612 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
# -*- cperl -*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2007 MySQL AB
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; version 2 of the License.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# This scripts creates the MySQL Server system tables.
|
||||||
|
#
|
||||||
|
# This script try to match the shell script version as close as possible,
|
||||||
|
# but in addition being compatible with ActiveState Perl on Windows.
|
||||||
|
#
|
||||||
|
# All unrecognized arguments to this script are passed to mysqld.
|
||||||
|
#
|
||||||
|
# NOTE: This script in 5.0 doesn't really match the shell script
|
||||||
|
# version 100%, it is more close to the 5.1 version.
|
||||||
|
#
|
||||||
|
# NOTE: This script was deliberately written to be as close to the shell
|
||||||
|
# script as possible, to make the maintenance of both in parallel
|
||||||
|
# easier.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
use File::Basename;
|
||||||
|
use Getopt::Long;
|
||||||
|
use Sys::Hostname;
|
||||||
|
use Data::Dumper;
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
Getopt::Long::Configure("pass_through");
|
||||||
|
|
||||||
|
my @args; # Argument list filled in
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Usage information
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
sub usage
|
||||||
|
{
|
||||||
|
print <<EOF;
|
||||||
|
Usage: $0 [OPTIONS]
|
||||||
|
--basedir=path The path to the MySQL installation directory.
|
||||||
|
--builddir=path If using --srcdir with out-of-directory builds, you
|
||||||
|
will need to set this to the location of the build
|
||||||
|
directory where built files reside.
|
||||||
|
--cross-bootstrap For internal use. Used when building the MySQL system
|
||||||
|
tables on a different host than the target.
|
||||||
|
--datadir=path The path to the MySQL data directory.
|
||||||
|
--force Causes mysql_install_db to run even if DNS does not
|
||||||
|
work. In that case, grant table entries that normally
|
||||||
|
use hostnames will use IP addresses.
|
||||||
|
--ldata=path The path to the MySQL data directory. Same as --datadir.
|
||||||
|
--rpm For internal use. This option is used by RPM files
|
||||||
|
during the MySQL installation process.
|
||||||
|
--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.
|
||||||
|
--srcdir=path The path to the MySQL source directory. This option
|
||||||
|
uses the compiled binaries and support files within the
|
||||||
|
source tree, useful for if you don't want to install
|
||||||
|
MySQL yet and just want to create the system tables.
|
||||||
|
--user=user_name The login username to use for running mysqld. Files
|
||||||
|
and directories created by mysqld will be owned by this
|
||||||
|
user. You must be root to use this option. By default
|
||||||
|
mysqld runs using your current login name and files and
|
||||||
|
directories that it creates will be owned by you.
|
||||||
|
|
||||||
|
All other options are passed to the mysqld program
|
||||||
|
|
||||||
|
EOF
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Parse an argument list
|
||||||
|
#
|
||||||
|
# We only need to pass arguments through to the server if we don't
|
||||||
|
# handle them here. So, we collect unrecognized options (passed on
|
||||||
|
# the command line) into the args variable.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
sub parse_arguments
|
||||||
|
{
|
||||||
|
my $opt = shift;
|
||||||
|
|
||||||
|
my @saved_ARGV = @ARGV;
|
||||||
|
@ARGV = @_; # Set ARGV so GetOptions works
|
||||||
|
|
||||||
|
my $pick_args;
|
||||||
|
if (@ARGV and $ARGV[0] eq 'PICK-ARGS-FROM-ARGV')
|
||||||
|
{
|
||||||
|
$pick_args = 1;
|
||||||
|
shift @ARGV;
|
||||||
|
}
|
||||||
|
|
||||||
|
GetOptions(
|
||||||
|
$opt,
|
||||||
|
"force",
|
||||||
|
"basedir=s",
|
||||||
|
"builddir=s", # FIXME not documented
|
||||||
|
"srcdir=s",
|
||||||
|
"ldata|datadir=s",
|
||||||
|
|
||||||
|
# Note that the user will be passed to mysqld so that it runs
|
||||||
|
# as 'user' (crucial e.g. if log-bin=/some_other_path/
|
||||||
|
# where a chown of datadir won't help)
|
||||||
|
"user=s",
|
||||||
|
|
||||||
|
"skip-name-resolve",
|
||||||
|
"verbose",
|
||||||
|
"rpm",
|
||||||
|
"help",
|
||||||
|
"defaults-file|defaults-extra-file|no-defaults:s",
|
||||||
|
|
||||||
|
# Used when building the MySQL system tables on a different host than
|
||||||
|
# the target. The platform-independent files that are created in
|
||||||
|
# --datadir on the host can be copied to the target system.
|
||||||
|
#
|
||||||
|
# The most common use for this feature is in the Windows installer
|
||||||
|
# which will take the files from datadir and include them as part of
|
||||||
|
# the install package. See top-level 'dist-hook' make target.
|
||||||
|
#
|
||||||
|
# --windows is a deprecated alias
|
||||||
|
"cross-bootstrap|windows", # FIXME undocumented, even needed?
|
||||||
|
) or usage();
|
||||||
|
|
||||||
|
usage() if $opt->{help};
|
||||||
|
|
||||||
|
@args = @ARGV if $pick_args;
|
||||||
|
|
||||||
|
@ARGV = @saved_ARGV; # Set back ARGV
|
||||||
|
}
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Try to find a specific file within --basedir which can either be a binary
|
||||||
|
# release or installed source directory and return the path.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
sub find_in_basedir
|
||||||
|
{
|
||||||
|
my $opt = shift;
|
||||||
|
my $mode = shift; # "dir" or "file"
|
||||||
|
my $files = shift;
|
||||||
|
|
||||||
|
foreach my $file ( @{ref($files) ? $files : [$files]} )
|
||||||
|
{
|
||||||
|
foreach my $dir ( @_ )
|
||||||
|
{
|
||||||
|
foreach my $part ( "$file","$file.exe","release/$file.exe",
|
||||||
|
"debug/$file.exe","relwithdebinfo/$file.exe" )
|
||||||
|
{
|
||||||
|
my $path = "$opt->{basedir}/$dir/$part";
|
||||||
|
if ( -f $path )
|
||||||
|
{
|
||||||
|
return $mode eq "dir" ? dirname($path) : $path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Just a function to write out an error report
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
sub cannot_find_file
|
||||||
|
{
|
||||||
|
my $file = shift;
|
||||||
|
|
||||||
|
print "FATAL ERROR: Could not find $file\n";
|
||||||
|
print "\n";
|
||||||
|
print "If you compiled from source, you need to run 'make install' to\n";
|
||||||
|
print "copy the software into the correct location ready for operation.\n";
|
||||||
|
print "\n";
|
||||||
|
print "If you are using a binary release, you must either be at the top\n";
|
||||||
|
print "level of the extracted archive, or pass the --basedir option\n";
|
||||||
|
print "pointing to that location.\n";
|
||||||
|
print "\n";
|
||||||
|
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Form a command line that can handle spaces in paths and arguments
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
# FIXME this backslash escaping needed if using '"..."' ?
|
||||||
|
# This regexp makes sure that any special chars are quoted,
|
||||||
|
# so the arg gets passed exactly to the server.
|
||||||
|
# XXX: This is broken; true fix requires using eval and proper
|
||||||
|
# quoting of every single arg ($opt->{basedir}, $opt->{ldata}, etc.)
|
||||||
|
# join(" ", map {s/([^\w\_\.\-])/\\$1/g}
|
||||||
|
|
||||||
|
sub quote_options {
|
||||||
|
my @cmd;
|
||||||
|
foreach my $opt ( @_ )
|
||||||
|
{
|
||||||
|
next unless $opt; # If undefined or empty, just skip
|
||||||
|
push(@cmd, "\"$opt\""); # Quote argument
|
||||||
|
}
|
||||||
|
return join(" ", @cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Ok, let's go. We first need to parse arguments which are required by
|
||||||
|
# my_print_defaults so that we can execute it first, then later re-parse
|
||||||
|
# the command line to add any extra bits that we need.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
my $opt = {};
|
||||||
|
parse_arguments($opt, 'PICK-ARGS-FROM-ARGV', @ARGV);
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# We can now find my_print_defaults. This script supports:
|
||||||
|
#
|
||||||
|
# --srcdir=path pointing to compiled source tree
|
||||||
|
# --basedir=path pointing to installed binary location
|
||||||
|
#
|
||||||
|
# or default to compiled-in locations.
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
my $print_defaults;
|
||||||
|
|
||||||
|
if ( $opt->{srcdir} and $opt->{basedir} )
|
||||||
|
{
|
||||||
|
error("Specify either --basedir or --srcdir, not both");
|
||||||
|
}
|
||||||
|
if ( $opt->{srcdir} )
|
||||||
|
{
|
||||||
|
$opt->{builddir} = $opt->{srcdir} unless $opt->{builddir};
|
||||||
|
$print_defaults = "$opt->{builddir}/extra/my_print_defaults";
|
||||||
|
}
|
||||||
|
elsif ( $opt->{basedir} )
|
||||||
|
{
|
||||||
|
$print_defaults = find_in_basedir($opt,"file","my_print_defaults","bin","extra");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$print_defaults='@bindir@/my_print_defaults';
|
||||||
|
}
|
||||||
|
|
||||||
|
-x $print_defaults or -f "$print_defaults.exe"
|
||||||
|
or cannot_find_file($print_defaults);
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# Now we can get arguments from the groups [mysqld] and [mysql_install_db]
|
||||||
|
# in the my.cfg file, then re-run to merge with command line arguments.
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
my @default_options;
|
||||||
|
my $cmd = quote_options($print_defaults,$opt->{'defaults-file'},
|
||||||
|
"mysqld","mysql_install_db");
|
||||||
|
open(PIPE, "$cmd |") or error($opt,"can't run $cmd: $!");
|
||||||
|
while ( <PIPE> )
|
||||||
|
{
|
||||||
|
chomp;
|
||||||
|
next unless /\S/;
|
||||||
|
push(@default_options, $_);
|
||||||
|
}
|
||||||
|
close PIPE;
|
||||||
|
$opt = {}; # Reset the arguments FIXME ?
|
||||||
|
parse_arguments($opt, @default_options);
|
||||||
|
parse_arguments($opt, 'PICK-ARGS-FROM-ARGV', @ARGV);
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# Configure paths to support files
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
# FIXME $extra_bindir is not used
|
||||||
|
my ($bindir,$extra_bindir,$mysqld,$pkgdatadir,$mysqld_opt,$scriptdir);
|
||||||
|
|
||||||
|
if ( $opt->{srcdir} )
|
||||||
|
{
|
||||||
|
$opt->{basedir} = $opt->{builddir};
|
||||||
|
$bindir = "$opt->{basedir}/client";
|
||||||
|
$extra_bindir = "$opt->{basedir}/extra";
|
||||||
|
$mysqld = "$opt->{basedir}/sql/mysqld";
|
||||||
|
$mysqld_opt = "--language=$opt->{srcdir}/sql/share/english";
|
||||||
|
$pkgdatadir = "$opt->{srcdir}/scripts";
|
||||||
|
$scriptdir = "$opt->{srcdir}/scripts";
|
||||||
|
}
|
||||||
|
elsif ( $opt->{basedir} )
|
||||||
|
{
|
||||||
|
$bindir = "$opt->{basedir}/bin";
|
||||||
|
$extra_bindir = $bindir;
|
||||||
|
$mysqld = find_in_basedir($opt,"file",["mysqld-nt","mysqld"],
|
||||||
|
"libexec","sbin","bin") || # ,"sql"
|
||||||
|
find_in_basedir($opt,"file","mysqld-nt",
|
||||||
|
"bin"); # ,"sql"
|
||||||
|
$pkgdatadir = find_in_basedir($opt,"dir","fill_help_tables.sql",
|
||||||
|
"share","share/mysql"); # ,"scripts"
|
||||||
|
$scriptdir = "$opt->{basedir}/scripts";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$opt->{basedir} = '@prefix@';
|
||||||
|
$bindir = '@bindir@';
|
||||||
|
$extra_bindir = $bindir;
|
||||||
|
$mysqld = '@libexecdir@/mysqld';
|
||||||
|
$pkgdatadir = '@pkgdatadir@';
|
||||||
|
$scriptdir = '@scriptdir@';
|
||||||
|
}
|
||||||
|
|
||||||
|
unless ( $opt->{ldata} )
|
||||||
|
{
|
||||||
|
$opt->{ldata} = '@localstatedir@';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $opt->{srcdir} )
|
||||||
|
{
|
||||||
|
$pkgdatadir = "$opt->{srcdir}/scripts";
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# Set up paths to SQL scripts required for bootstrap
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
my $fill_help_tables = "$pkgdatadir/fill_help_tables.sql";
|
||||||
|
my $create_system_tables = "$pkgdatadir/mysql_system_tables.sql";
|
||||||
|
my $fill_system_tables = "$pkgdatadir/mysql_system_tables_data.sql";
|
||||||
|
|
||||||
|
foreach my $f ( $fill_help_tables,$create_system_tables,$fill_system_tables )
|
||||||
|
{
|
||||||
|
-f $f or cannot_find_file($f);
|
||||||
|
}
|
||||||
|
|
||||||
|
-x $mysqld or -f "$mysqld.exe" or cannot_find_file($mysqld);
|
||||||
|
# Try to determine the hostname
|
||||||
|
my $hostname = hostname();
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# Check if hostname is valid
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
my $resolved;
|
||||||
|
if ( !$opt->{'cross-bootstrap'} and !$opt->{rpm} and !$opt->{force} )
|
||||||
|
{
|
||||||
|
my $resolveip;
|
||||||
|
|
||||||
|
$resolved = `$resolveip $hostname 2>&1`;
|
||||||
|
if ( $? != 0 )
|
||||||
|
{
|
||||||
|
$resolved=`$resolveip localhost 2>&1`;
|
||||||
|
if ( $? != 0 )
|
||||||
|
{
|
||||||
|
error($opt,
|
||||||
|
"Neither host '$hostname' nor 'localhost' could be looked up with",
|
||||||
|
"$bindir/resolveip",
|
||||||
|
"Please configure the 'hostname' command to return a correct",
|
||||||
|
"hostname.",
|
||||||
|
"If you want to solve this at a later stage, restart this script",
|
||||||
|
"with the --force option");
|
||||||
|
}
|
||||||
|
warning($opt,
|
||||||
|
"The host '$hostname' could not be looked up with resolveip.",
|
||||||
|
"This probably means that your libc libraries are not 100 % compatible",
|
||||||
|
"with this binary MySQL version. The MySQL daemon, mysqld, should work",
|
||||||
|
"normally with the exception that host name resolving will not work.",
|
||||||
|
"This means that you should use IP addresses instead of hostnames",
|
||||||
|
"when specifying MySQL privileges !");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# FIXME what does this really mean....
|
||||||
|
if ( $opt->{'skip-name-resolve'} and $resolved and $resolved =~ /\s/ )
|
||||||
|
{
|
||||||
|
$hostname = (split(' ', $resolved))[5];
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# Create database directories mysql & test
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
foreach my $dir ( $opt->{ldata}, "$opt->{ldata}/mysql", "$opt->{ldata}/test" )
|
||||||
|
{
|
||||||
|
# FIXME not really the same as original "mkdir -p", but ok?
|
||||||
|
mkdir($dir, 0700) unless -d $dir;
|
||||||
|
chown($opt->{user}, $dir) if -w "/" and !$opt->{user};
|
||||||
|
}
|
||||||
|
|
||||||
|
push(@args, "--user=$opt->{user}") if $opt->{user};
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# Configure mysqld command line
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
# FIXME use --init-file instead of --bootstrap ?!
|
||||||
|
|
||||||
|
my $mysqld_bootstrap = $ENV{MYSQLD_BOOTSTRAP} || $mysqld;
|
||||||
|
my $mysqld_install_cmd_line = quote_options($mysqld_bootstrap,
|
||||||
|
$opt->{'defaults-file'},
|
||||||
|
$mysqld_opt,
|
||||||
|
"--bootstrap",
|
||||||
|
"--basedir=$opt->{basedir}",
|
||||||
|
"--datadir=$opt->{ldata}",
|
||||||
|
"--skip-innodb",
|
||||||
|
"--skip-bdb",
|
||||||
|
"--skip-ndbcluster",
|
||||||
|
"--max_allowed_packet=8M",
|
||||||
|
"--net_buffer_length=16K",
|
||||||
|
@args,
|
||||||
|
);
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# Create the system and help tables by passing them to "mysqld --bootstrap"
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
report_verbose_wait($opt,"Installing MySQL system tables...");
|
||||||
|
|
||||||
|
open(SQL, $create_system_tables)
|
||||||
|
or error($opt,"can't open $create_system_tables for reading: $!");
|
||||||
|
# FIXME > /dev/null ?
|
||||||
|
if ( open(PIPE, "| $mysqld_install_cmd_line") )
|
||||||
|
{
|
||||||
|
print PIPE "use mysql;\n";
|
||||||
|
while ( <SQL> )
|
||||||
|
{
|
||||||
|
# When doing a "cross bootstrap" install, no reference to the current
|
||||||
|
# host should be added to the system tables. So we filter out any
|
||||||
|
# lines which contain the current host name.
|
||||||
|
next if $opt->{'cross-bootstrap'} and /\@current_hostname/;
|
||||||
|
|
||||||
|
print PIPE $_;
|
||||||
|
}
|
||||||
|
close PIPE;
|
||||||
|
close SQL;
|
||||||
|
|
||||||
|
report_verbose($opt,"OK");
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
# Pipe fill_help_tables.sql to "mysqld --bootstrap"
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
report_verbose_wait($opt,"Filling help tables...");
|
||||||
|
open(SQL, $fill_help_tables)
|
||||||
|
or error($opt,"can't open $fill_help_tables for reading: $!");
|
||||||
|
# FIXME > /dev/null ?
|
||||||
|
if ( open(PIPE, "| $mysqld_install_cmd_line") )
|
||||||
|
{
|
||||||
|
print PIPE "use mysql;\n";
|
||||||
|
while ( <SQL> )
|
||||||
|
{
|
||||||
|
print PIPE $_;
|
||||||
|
}
|
||||||
|
close PIPE;
|
||||||
|
close SQL;
|
||||||
|
|
||||||
|
report_verbose($opt,"OK");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
warning($opt,"HELP FILES ARE NOT COMPLETELY INSTALLED!",
|
||||||
|
"The \"HELP\" command might not work properly");
|
||||||
|
}
|
||||||
|
|
||||||
|
report_verbose($opt,"To start mysqld at boot time you have to copy",
|
||||||
|
"support-files/mysql.server to the right place " .
|
||||||
|
"for your system");
|
||||||
|
|
||||||
|
if ( !$opt->{'cross-bootstrap'} )
|
||||||
|
{
|
||||||
|
# This is not a true installation on a running system. The end user must
|
||||||
|
# set a password after installing the data files on the real host system.
|
||||||
|
# At this point, there is no end user, so it does not make sense to print
|
||||||
|
# this reminder.
|
||||||
|
report($opt,
|
||||||
|
"PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !",
|
||||||
|
"To do so, start the server, then issue the following commands:",
|
||||||
|
"",
|
||||||
|
" $bindir/mysqladmin -u root password 'new-password'",
|
||||||
|
" $bindir/mysqladmin -u root -h $hostname password 'new-password'",
|
||||||
|
"",
|
||||||
|
"Alternatively you can run:",
|
||||||
|
"",
|
||||||
|
" $bindir/mysql_secure_installation",
|
||||||
|
"",
|
||||||
|
"which will also give you the option of removing the test",
|
||||||
|
"databases and anonymous user created by default. This is",
|
||||||
|
"strongly recommended for production servers.",
|
||||||
|
"",
|
||||||
|
"See the manual for more instructions.");
|
||||||
|
|
||||||
|
if ( !$opt->{rpm} )
|
||||||
|
{
|
||||||
|
report($opt,
|
||||||
|
"You can start the MySQL daemon with:",
|
||||||
|
"",
|
||||||
|
" cd " . '@prefix@' . " ; $bindir/mysqld_safe &",
|
||||||
|
"",
|
||||||
|
"You can test the MySQL daemon with mysql-test-run.pl",
|
||||||
|
"",
|
||||||
|
" 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");
|
||||||
|
}
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error($opt,
|
||||||
|
"Installation of system tables failed!",
|
||||||
|
"",
|
||||||
|
"Examine the logs in $opt->{ldata} for more information.",
|
||||||
|
"You can try to start the mysqld daemon with:",
|
||||||
|
"$mysqld --skip-grant &",
|
||||||
|
"and use the command line tool",
|
||||||
|
"$bindir/mysql to connect to the mysql",
|
||||||
|
"database and look at the grant tables:",
|
||||||
|
"",
|
||||||
|
"shell> $bindir/mysql -u root mysql",
|
||||||
|
"mysql> show tables",
|
||||||
|
"",
|
||||||
|
"Try 'mysqld --help' if you have problems with paths. Using --log",
|
||||||
|
"gives you a log in $opt->{ldata} that may be helpful.",
|
||||||
|
"",
|
||||||
|
"The latest information about MySQL is available on the web at",
|
||||||
|
"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!")
|
||||||
|
}
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Misc
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
sub report_verbose
|
||||||
|
{
|
||||||
|
my $opt = shift;
|
||||||
|
my $text = shift;
|
||||||
|
|
||||||
|
report_verbose_wait($opt, $text, @_);
|
||||||
|
print "\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub report_verbose_wait
|
||||||
|
{
|
||||||
|
my $opt = shift;
|
||||||
|
my $text = shift;
|
||||||
|
|
||||||
|
if ( $opt->{verbose} or (!$opt->{rpm} and !$opt->{'cross-bootstrap'}) )
|
||||||
|
{
|
||||||
|
print "$text";
|
||||||
|
map {print "\n$_"} @_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub report
|
||||||
|
{
|
||||||
|
my $opt = shift;
|
||||||
|
my $text = shift;
|
||||||
|
|
||||||
|
print "$text\n";
|
||||||
|
map {print "$_\n"} @_;
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub error
|
||||||
|
{
|
||||||
|
my $opt = shift;
|
||||||
|
my $text = shift;
|
||||||
|
|
||||||
|
print "FATAL ERROR: $text\n";
|
||||||
|
map {print "$_\n"} @_;
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub warning
|
||||||
|
{
|
||||||
|
my $opt = shift;
|
||||||
|
my $text = shift;
|
||||||
|
|
||||||
|
print "WARNING: $text\n";
|
||||||
|
map {print "$_\n"} @_;
|
||||||
|
print "\n";
|
||||||
|
}
|
352
scripts/mysql_secure_installation.pl.in
Executable file
352
scripts/mysql_secure_installation.pl.in
Executable file
@ -0,0 +1,352 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
# -*- cperl -*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2002 MySQL AB and Jeremy Cole
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; version 2 of the License.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
use Fcntl;
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
my $config = ".my.cnf.$$";
|
||||||
|
my $command = ".mysql.$$";
|
||||||
|
my $hadpass = 0;
|
||||||
|
|
||||||
|
# FIXME
|
||||||
|
# trap "interrupt" 2
|
||||||
|
|
||||||
|
my $rootpass = "";
|
||||||
|
|
||||||
|
sub echo_on {
|
||||||
|
if ($^O eq 'MSWin32') {
|
||||||
|
ReadMode('normal');
|
||||||
|
} else {
|
||||||
|
system("stty echo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub echo_off {
|
||||||
|
if ($^O eq 'MSWin32') {
|
||||||
|
ReadMode('noecho');
|
||||||
|
} else {
|
||||||
|
system("stty -echo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub write_file {
|
||||||
|
my $file = shift;
|
||||||
|
-f $file or die "ERROR: file is missing \"$file\": $!";
|
||||||
|
open(FILE, ">$file") or die "ERROR: can't write to file \"$file\": $!";
|
||||||
|
foreach my $line ( @_ ) {
|
||||||
|
print FILE $line, "\n"; # Add EOL char
|
||||||
|
}
|
||||||
|
close FILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub prepare {
|
||||||
|
foreach my $file ( $config, $command ) {
|
||||||
|
next if -f $file; # Already exists
|
||||||
|
local *FILE;
|
||||||
|
sysopen(FILE, $file, O_CREAT, 0600)
|
||||||
|
or die "ERROR: can't create $file: $!";
|
||||||
|
close FILE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub do_query {
|
||||||
|
my $query = shift;
|
||||||
|
write_file($command, $query);
|
||||||
|
system("mysql --defaults-file=$config < $command");
|
||||||
|
return $?;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub make_config {
|
||||||
|
my $password = shift;
|
||||||
|
|
||||||
|
write_file($config,
|
||||||
|
"# mysql_secure_installation config file",
|
||||||
|
"[mysql]",
|
||||||
|
"user=root",
|
||||||
|
"password=$rootpass");
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_root_password {
|
||||||
|
my $status = 1;
|
||||||
|
while ( $status == 1 ) {
|
||||||
|
echo_off();
|
||||||
|
print "Enter current password for root (enter for none): ";
|
||||||
|
my $password = <STDIN>;
|
||||||
|
echo_on();
|
||||||
|
if ( $password ) {
|
||||||
|
$hadpass = 1;
|
||||||
|
} else {
|
||||||
|
$hadpass = 0;
|
||||||
|
}
|
||||||
|
$rootpass = $password;
|
||||||
|
make_config($rootpass);
|
||||||
|
do_query("");
|
||||||
|
$status = $?;
|
||||||
|
}
|
||||||
|
print "OK, successfully used password, moving on...\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub set_root_password {
|
||||||
|
echo_off();
|
||||||
|
print "New password: ";
|
||||||
|
my $password1 = <STDIN>;
|
||||||
|
print "\nRe-enter new password: ";
|
||||||
|
my $password2 = <STDIN>;
|
||||||
|
print "\n";
|
||||||
|
echo_on();
|
||||||
|
|
||||||
|
if ( $password1 eq $password2 ) {
|
||||||
|
print "Sorry, passwords do not match.\n\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !$password1 ) {
|
||||||
|
print "Sorry, you can't use an empty password here.\n\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
do_query("UPDATE mysql.user SET Password=PASSWORD('$password1') WHERE User='root';");
|
||||||
|
if ( $? == 0 ) {
|
||||||
|
print "Password updated successfully!\n";
|
||||||
|
print "Reloading privilege tables..\n";
|
||||||
|
if ( !reload_privilege_tables() ) {
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
|
$rootpass = $password1;
|
||||||
|
make_config($rootpass);
|
||||||
|
} else {
|
||||||
|
print "Password update failed!\n";
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub remove_anonymous_users {
|
||||||
|
do_query("DELETE FROM mysql.user WHERE User='';");
|
||||||
|
if ( $? == 0 ) {
|
||||||
|
print " ... Success!\n";
|
||||||
|
} else {
|
||||||
|
print " ... Failed!\n";
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub remove_remote_root {
|
||||||
|
do_query("DELETE FROM mysql.user WHERE User='root' AND Host!='localhost';");
|
||||||
|
if ( $? == 0 ) {
|
||||||
|
print " ... Success!\n";
|
||||||
|
} else {
|
||||||
|
print " ... Failed!\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub remove_test_database {
|
||||||
|
print " - Dropping test database...\n";
|
||||||
|
do_query("DROP DATABASE test;");
|
||||||
|
if ( $? == 0 ) {
|
||||||
|
print " ... Success!\n";
|
||||||
|
} else {
|
||||||
|
print " ... Failed! Not critical, keep moving...\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
print " - Removing privileges on test database...\n";
|
||||||
|
do_query("DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'");
|
||||||
|
if ( $? == 0 ) {
|
||||||
|
print " ... Success!\n";
|
||||||
|
} else {
|
||||||
|
print " ... Failed! Not critical, keep moving...\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub reload_privilege_tables {
|
||||||
|
do_query("FLUSH PRIVILEGES;");
|
||||||
|
if ( $? == 0 ) {
|
||||||
|
print " ... Success!\n";
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
print " ... Failed!\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub interrupt {
|
||||||
|
print "\nAborting!\n\n";
|
||||||
|
cleanup();
|
||||||
|
echo_on();
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub cleanup {
|
||||||
|
print "Cleaning up...\n";
|
||||||
|
unlink($config,$command);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# The actual script starts here
|
||||||
|
|
||||||
|
prepare();
|
||||||
|
|
||||||
|
print <<HERE;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
|
||||||
|
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
|
||||||
|
|
||||||
|
In order to log into MySQL to secure it, we'll need the current
|
||||||
|
password for the root user. If you've just installed MySQL, and
|
||||||
|
you haven't set the root password yet, the password will be blank,
|
||||||
|
so you should just press enter here.
|
||||||
|
|
||||||
|
HERE
|
||||||
|
|
||||||
|
get_root_password();
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Set the root password
|
||||||
|
#
|
||||||
|
|
||||||
|
print "Setting the root password ensures that nobody can log into the MySQL\n";
|
||||||
|
print "root user without the proper authorisation.\n\n";
|
||||||
|
|
||||||
|
if ( $hadpass == 0 ) {
|
||||||
|
print "Set root password? [Y/n] ";
|
||||||
|
} else {
|
||||||
|
print "You already have a root password set, so you can safely answer 'n'.\n\n";
|
||||||
|
print "Change the root password? [Y/n] ";
|
||||||
|
}
|
||||||
|
|
||||||
|
my $reply = <STDIN>;
|
||||||
|
if ( $reply =~ /n/i ) {
|
||||||
|
print " ... skipping.\n";
|
||||||
|
} else {
|
||||||
|
my $status = 1;
|
||||||
|
while ( $status == 1 ) {
|
||||||
|
set_root_password();
|
||||||
|
$status = $?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Remove anonymous users
|
||||||
|
#
|
||||||
|
|
||||||
|
print <<HERE;
|
||||||
|
By default, a MySQL installation has an anonymous user, allowing anyone
|
||||||
|
to log into MySQL without having to have a user account created for
|
||||||
|
them. This is intended only for testing, and to make the installation
|
||||||
|
go a bit smoother. You should remove them before moving into a
|
||||||
|
production environment.
|
||||||
|
|
||||||
|
HERE
|
||||||
|
|
||||||
|
print "Remove anonymous users? [Y/n] ";
|
||||||
|
$reply = <STDIN>;
|
||||||
|
if ( $reply =~ /n/i ) {
|
||||||
|
print " ... skipping.\n";
|
||||||
|
} else {
|
||||||
|
remove_anonymous_users();
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Disallow remote root login
|
||||||
|
#
|
||||||
|
|
||||||
|
print <<HERE;
|
||||||
|
Normally, root should only be allowed to connect from 'localhost'. This
|
||||||
|
ensures that someone cannot guess at the root password from the network.
|
||||||
|
|
||||||
|
HERE
|
||||||
|
|
||||||
|
print "Disallow root login remotely? [Y/n] ";
|
||||||
|
$reply = <STDIN>;
|
||||||
|
if ( $reply =~ /n/i ) {
|
||||||
|
print " ... skipping.\n";
|
||||||
|
} else {
|
||||||
|
remove_remote_root();
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Remove test database
|
||||||
|
#
|
||||||
|
|
||||||
|
print <<HERE;
|
||||||
|
By default, MySQL comes with a database named 'test' that anyone can
|
||||||
|
access. This is also intended only for testing, and should be removed
|
||||||
|
before moving into a production environment.
|
||||||
|
|
||||||
|
HERE
|
||||||
|
|
||||||
|
print "Remove test database and access to it? [Y/n] ";
|
||||||
|
$reply = <STDIN>;
|
||||||
|
if ( $reply =~ /n/i ) {
|
||||||
|
print " ... skipping.\n";
|
||||||
|
} else {
|
||||||
|
remove_test_database();
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Reload privilege tables
|
||||||
|
#
|
||||||
|
|
||||||
|
print <<HERE;
|
||||||
|
Reloading the privilege tables will ensure that all changes made so far
|
||||||
|
will take effect immediately.
|
||||||
|
|
||||||
|
HERE
|
||||||
|
|
||||||
|
print "Reload privilege tables now? [Y/n] ";
|
||||||
|
$reply = <STDIN>;
|
||||||
|
if ( $reply =~ /n/i ) {
|
||||||
|
print " ... skipping.\n";
|
||||||
|
} else {
|
||||||
|
reload_privilege_tables();
|
||||||
|
}
|
||||||
|
print "\n";
|
||||||
|
|
||||||
|
cleanup();
|
||||||
|
|
||||||
|
print <<HERE;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
All done! If you've completed all of the above steps, your MySQL
|
||||||
|
installation should now be secure.
|
||||||
|
|
||||||
|
Thanks for using MySQL!
|
||||||
|
|
||||||
|
|
||||||
|
HERE
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
#!@PERL@ -w
|
#!/usr/bin/perl
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use Getopt::Long;
|
use Getopt::Long;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#!@PERL@
|
#!/usr/bin/perl
|
||||||
|
|
||||||
use Getopt::Long;
|
use Getopt::Long;
|
||||||
use POSIX qw(strftime);
|
use POSIX qw(strftime);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#!@PERL@
|
#!/usr/bin/perl
|
||||||
# mysqldumpslow - parse and summarize the MySQL slow query log
|
# mysqldumpslow - parse and summarize the MySQL slow query log
|
||||||
|
|
||||||
# Original version by Tim Bunce, sometime in 2000.
|
# Original version by Tim Bunce, sometime in 2000.
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#!@PERL@ -w
|
#!/usr/bin/perl
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use Getopt::Long;
|
use Getopt::Long;
|
||||||
|
@ -6339,7 +6339,9 @@ void
|
|||||||
innodb_export_status(void)
|
innodb_export_status(void)
|
||||||
/*======================*/
|
/*======================*/
|
||||||
{
|
{
|
||||||
|
if (innodb_inited) {
|
||||||
srv_export_innodb_status();
|
srv_export_innodb_status();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
Loading…
x
Reference in New Issue
Block a user