3
# Copyright (C) 2006,2007,2008,2009 Giuseppe Maxia
4
# Contacts: http://datacharmer.org
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation; version 2 of the License
10
# This program is distributed in the hope that it will be useful,
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
# GNU General Public License for more details.
15
# You should have received a copy of the GNU General Public License
16
# along with this program; if not, write to the Free Software
17
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
use English qw( -no_match_vars );
23
use Getopt::Long qw(:config no_ignore_case );
25
use MySQL::Sandbox::Scripts;
27
my $DEBUG = $MySQL::Sandbox::DEBUG;
30
custom_base_port => $MySQL::Sandbox::default_base_port{custom},
31
group_directory => 'multi_cmsb',
35
#$install_dir = $PROGRAM_NAME;
36
#$install_dir =~ s{/\w+(\.pl)?$}{};
37
#eval "use lib q($install_dir)";
38
#eval "use MySandbox";
39
#eval "use MyScripts";
41
my $msb = MySQL::Sandbox->new();
43
my %parse_options = %{ MySQL::Sandbox::Scripts::parse_options_many() };
44
$msb->parse_options(\%parse_options);
46
my %options = map { $_ , $parse_options{$_}{'value'}} keys %parse_options ;
49
map { $parse_options{$_}{parse}, \$options{$_} }
50
grep { $parse_options{$_}{parse}} keys %parse_options
51
) or $msb->get_help();
53
$msb->get_help() if $options{'help'};
55
unless ($options{server_version}) {
56
$options{server_version} = join(':', @ARGV);
57
@ARGV > 0 or $msb->get_help('server version required');
60
my $replication_port = 0;
63
my @versions= split /[,:;]/, $options{server_version};
65
for my $ver (@versions) {
67
$temp_path =~ s{.*/}{};
68
if ( $temp_path =~ /(\d+)\.(\d+)\.(\d+)/ ) {
69
$base_version[$counter] = "$1$2$3";
70
$dashed_version[$counter] = "$1_$2_$3";
71
$base_version[$counter] =~ s/^0+//;
75
$msb->get_help("No recognizable version pattern in $options{server_version}\n");
81
if ( $options{group_directory}) {
82
$group_directory = "$options{upper_directory}/$options{group_directory}";
85
$group_directory = "$options{upper_directory}/"
86
. make_group_dir( $defaults{group_directory}, \@dashed_version);
89
if ( -d $group_directory ) {
90
system "$group_directory/clear_all";
93
print "creating replication directory $group_directory\n" if $options{verbose};
94
mkdir $group_directory
97
for my $dir ( 1 .. @versions ) {
98
if ( -d "$group_directory/node$dir" ) {
99
system "rm -rf $group_directory/node$dir"
100
and die "unable to clean $group_directory/node$dir\n";
104
for my $ver_counter (0 .. $#versions) {
106
if ( $options{sandbox_base_port}) {
107
$replication_port = $options{sandbox_base_port};
110
$replication_port = $defaults{custom_base_port} + $base_version[$ver_counter];
113
my $additional_node_options = $ENV{NODE_OPTIONS} || '';
114
$additional_node_options .= q{ };
115
my $node = $ver_counter + 1;
116
my $node_port = $replication_port+ $node;
117
print "installing node $node\n";
118
my $install_node = qx(
119
make_sandbox $versions[$ver_counter] \\
120
--datadir_from=script \\
121
--upper_directory=$group_directory \\
122
--sandbox_directory=node$node \\
124
--prompt_prefix=node$node \\
125
--sandbox_port=$node_port \\
126
-c server-id=10$node \\
127
-c log-bin=mysql-bin $additional_node_options
129
print $install_node if $options{verbose};
131
print "error installing node $node\n";
132
print "$install_node\n";
138
my $current_dir = $ENV{PWD};
140
chdir $group_directory;
142
for my $cmd ( qw(start stop clear send_kill) ) {
143
my $cmd_fname = $cmd . '_all';
144
$msb->write_to($cmd_fname, '>', '#!/bin/sh');
145
for my $node (1 .. @versions ) {
146
$msb->write_to ($cmd_fname, '>>', qq(echo 'executing "$cmd" on node $node'));
147
$msb->write_to ($cmd_fname, '>>', "$group_directory/node$node/$cmd");
149
chmod 0755, $cmd_fname;
152
$msb->write_to('use_all', '>', '#!/bin/sh');
153
my $node_list = join(' ', (1 .. @versions ) );
155
$msb->write_to('use_all', '>>', 'if [ "$1" == "" ]');
156
$msb->write_to('use_all', '>>', 'then');
157
$msb->write_to('use_all', '>>', ' echo "syntax: $0 command"');
158
$msb->write_to('use_all', '>>', ' exit 1');
159
$msb->write_to('use_all', '>>', 'fi');
160
$msb->write_to('use_all', '>>', '');
161
$msb->write_to('use_all', '>>', 'for SNUM in ' . $node_list);
162
$msb->write_to('use_all', '>>', 'do ' );
163
$msb->write_to('use_all', '>>', ' echo "# server: $SNUM " ' );
164
$msb->write_to('use_all', '>>', ' echo "$@" | ' . $group_directory . '/node$SNUM/use $MYCLIENT_OPTIONS ');
165
$msb->write_to('use_all', '>>', 'done ' );
166
chmod 0755, 'use_all';
168
for my $node (1 .. @versions ) {
169
$msb->write_to("n$node", '>', "#!/bin/sh");
170
$msb->write_to("n$node", '>', qq($group_directory/node$node/use "\$@"));
171
chmod 0755, "n$node";
175
print "group directory installed on $group_directory\n";
178
my ($base_dir, $dashed) = @_;
179
my @copy_dashed = @$dashed;
181
if (@copy_dashed > 3) {
182
$suffix = join('-', map { s/(\d+_\d+).*/$1/; $_ } @copy_dashed );
185
$suffix = join('-', @$dashed);
187
return $base_dir . '_' . $suffix;