~mathiaz/ubuntu/lucid/mysql-dfsg-5.1/zap-bug-552053

« back to all changes in this revision

Viewing changes to mysql-test/lib/My/ConfigFactory.pm

  • Committer: Bazaar Package Importer
  • Author(s): Mathias Gug
  • Date: 2009-06-25 12:55:45 UTC
  • mfrom: (1.1.2 upstream) (0.1.3 experimental)
  • Revision ID: james.westby@ubuntu.com-20090625125545-m8ogs96zzsri74xe
Tags: 5.1.34-1ubuntu1
* Merge from debian experimental (and 5.0 from main), remaining changes:
  - debian/mysql-server-5.1.config:
    + ask for MySQL root password at priority high instead of medium so
      that the password prompt is seen on a default install. (LP: #319843)
    + don't ask for root password when upgrading from a 5.0 install.
  - debian/control:
    + Make libmysqlclient16-dev a transitional package depending on
      libmysqlclient-dev.
    + Make libmysqlclient-dev conflict with libmysqlclient15-dev.
    + Don't build mysql-server, mysql-client, mysql-common and
      libmysqlclient15-dev binary packages since they're still provided
      by mysql-dfsg-5.0.
    + Make mysql-{client,server}-5.1 packages conflict and
      replace mysql-{client,server}-5.0, but not provide
      mysql-{client,server}.
    + Depend on a specific version of mysql-common rather than the src
      version of mysql-dfsg-5.1 since mysql-common is currently part of
      mysql-dfsg-5.0.
    + Lower mailx from a Recommends to a Suggests to avoid pulling in
      a full MTA on all installs of mysql-server. (LP: #259477)
  - debian/rules:
    + added -fno-strict-aliasing to CFLAGS to get around mysql testsuite
      build failures.
    + install mysql-test and sql-bench to /usr/share/mysql/ rather than
      /usr/.
  - debian/additions/debian-start.inc.sh: support ANSI mode (LP: #310211)
  - Add AppArmor profile:
    - debian/apparmor-profile: apparmor profile.
    - debian/rules, debian/mysql-server-5.0.files: install apparmor profile.
    - debian/mysql-server-5.0.dirs: add etc/apparmor.d/force-complain
    - debian/mysql-server-5.0.postrm: remove symlink in force-complain/ on
      purge.
    - debian/mysql-server-5.1.README.Debian: add apparmor documentation.
    - debian/additions/my.cnf: Add warning about apparmor. (LP: #201799)
    - debian/mysql-server-5.1.postinst: reload apparmor profiles.
  - debian/additions/my.cnf: remove language option. Error message files are
    located in a different directory in MySQL 5.0. Setting the language
    option to use /usr/share/mysql/english breaks 5.0. Both 5.0 and 5.1
    use a default value that works. (LP: #316974)
  - debian/mysql-server-5.1.mysql.init:
    + Clearly indicate that we do not support running multiple instances
      of mysqld by duplicating the init script.
      (closes: #314785, #324834, #435165, #444216)
    + Properly parameterize all existing references to the mysql config
      file (/etc/mysql/my.cnf).
  - debian/mysql-server-5.0.postinst: Clear out the second password
    when setting up mysql. (LP: #344816)
  - mysql-server-core-5.1 package for files needed by Akonadi:
    + debian/control: create mysql-server-core-5.1 package.
    + debian/mysql-server-core-5.1.files, debian/mysql-server-5.1.files:
      move core mysqld files to mysql-server-core-5.1 package.
  - Don't package sql-bench and mysql-test file.
* Dropped changes:
  - debian/patches/92_ssl_test_cert.dpatch: certificate expiration in
    test suite (LP: #323755). Included upstream.
* Dropped from 5.0:
  - apparmor profile:
    - debian/control: Recommends apparmor >= 2.1+1075-0ubuntu6. All version
      of apparmor-profile (>hardy) are higher than this version.
    - debian/mysql-server-5.0.preinst: create symlink for force-complain/
      on pre-feisty upgrades, upgrades where apparmor-profiles profile is
      unchanged (ie non-enforcing) and upgrades where the profile
      doesn't exist. Support for pre-hardy upgrades is no longer needed.
* debian/mysql-server-5.1.postinst: fix debian-sys-maint user creation.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- cperl -*-
 
2
package My::ConfigFactory;
 
3
 
 
4
use strict;
 
5
use warnings;
 
6
use Carp;
 
7
 
 
8
use My::Config;
 
9
use My::Find;
 
10
 
 
11
use File::Basename;
 
12
 
 
13
 
 
14
#
 
15
# Rules to run first of all
 
16
#
 
17
my @pre_rules=
 
18
(
 
19
);
 
20
 
 
21
 
 
22
my @share_locations= ("share/mysql", "sql/share", "share");
 
23
 
 
24
 
 
25
sub get_basedir {
 
26
  my ($self, $group)= @_;
 
27
  my $basedir= $group->if_exist('basedir') ||
 
28
    $self->{ARGS}->{basedir};
 
29
  return $basedir;
 
30
}
 
31
 
 
32
 
 
33
sub fix_charset_dir {
 
34
  my ($self, $config, $group_name, $group)= @_;
 
35
  return my_find_dir($self->get_basedir($group),
 
36
                     \@share_locations, "charsets");
 
37
}
 
38
 
 
39
sub fix_language {
 
40
  my ($self, $config, $group_name, $group)= @_;
 
41
  return my_find_dir($self->get_basedir($group),
 
42
                     \@share_locations, "english");
 
43
}
 
44
 
 
45
sub fix_datadir {
 
46
  my ($self, $config, $group_name)= @_;
 
47
  my $vardir= $self->{ARGS}->{vardir};
 
48
  return "$vardir/$group_name/data";
 
49
}
 
50
 
 
51
sub fix_pidfile {
 
52
  my ($self, $config, $group_name, $group)= @_;
 
53
  my $vardir= $self->{ARGS}->{vardir};
 
54
  return "$vardir/run/$group_name.pid";
 
55
}
 
56
 
 
57
sub fix_port {
 
58
  my ($self, $config, $group_name, $group)= @_;
 
59
  my $hostname= $group->value('#host');
 
60
  return $self->{HOSTS}->{$hostname}++;
 
61
}
 
62
 
 
63
sub fix_host {
 
64
  my ($self)= @_;
 
65
  # Get next host from HOSTS array
 
66
  my @hosts= keys(%{$self->{HOSTS}});;
 
67
  my $host_no= $self->{NEXT_HOST}++ % @hosts;
 
68
  return $hosts[$host_no];
 
69
}
 
70
 
 
71
sub is_unique {
 
72
  my ($config, $name, $value)= @_;
 
73
 
 
74
  foreach my $group ( $config->groups() ) {
 
75
    if ($group->option($name)) {
 
76
      if ($group->value($name) eq $value){
 
77
        return 0;
 
78
      }
 
79
    }
 
80
  }
 
81
  return 1;
 
82
}
 
83
 
 
84
sub fix_server_id {
 
85
  my ($self, $config, $group_name, $group)= @_;
 
86
#define in the order that mysqlds are listed in my.cnf 
 
87
 
 
88
  my $server_id= $group->if_exist('server-id');
 
89
  if (defined $server_id){
 
90
    if (!is_unique($config, 'server-id', $server_id)) {
 
91
      croak "The server-id($server_id) for '$group_name' is not unique";
 
92
    }
 
93
    return $server_id;
 
94
  }
 
95
 
 
96
  do {
 
97
    $server_id= $self->{SERVER_ID}++;
 
98
  } while(!is_unique($config, 'server-id', $server_id));
 
99
 
 
100
  #print "$group_name: server_id: $server_id\n";
 
101
  return $server_id;
 
102
}
 
103
 
 
104
sub fix_socket {
 
105
  my ($self, $config, $group_name, $group)= @_;
 
106
  # Put socket file in tmpdir
 
107
  my $dir= $self->{ARGS}->{tmpdir};
 
108
  return "$dir/$group_name.sock";
 
109
}
 
110
 
 
111
sub fix_tmpdir {
 
112
  my ($self, $config, $group_name, $group)= @_;
 
113
  my $dir= $self->{ARGS}->{tmpdir};
 
114
  return "$dir/$group_name";
 
115
}
 
116
 
 
117
sub fix_log_error {
 
118
  my ($self, $config, $group_name, $group)= @_;
 
119
  my $dir= $self->{ARGS}->{vardir};
 
120
  return "$dir/log/$group_name.err";
 
121
}
 
122
 
 
123
sub fix_log {
 
124
  my ($self, $config, $group_name, $group)= @_;
 
125
  my $dir= dirname($group->value('datadir'));
 
126
  return "$dir/mysqld.log";
 
127
}
 
128
 
 
129
sub fix_log_slow_queries {
 
130
  my ($self, $config, $group_name, $group)= @_;
 
131
  my $dir= dirname($group->value('datadir'));
 
132
  return "$dir/mysqld-slow.log";
 
133
}
 
134
 
 
135
sub fix_secure_file_priv {
 
136
  my ($self)= @_;
 
137
  my $vardir= $self->{ARGS}->{vardir};
 
138
  # By default, prevent the started mysqld to access files outside of vardir
 
139
  return $vardir;
 
140
}
 
141
 
 
142
sub fix_std_data {
 
143
  my ($self, $config, $group_name, $group)= @_;
 
144
  my $basedir= $self->get_basedir($group);
 
145
  return "$basedir/mysql-test/std_data";
 
146
}
 
147
 
 
148
sub ssl_supported {
 
149
  my ($self)= @_;
 
150
  return $self->{ARGS}->{ssl};
 
151
}
 
152
 
 
153
sub fix_skip_ssl {
 
154
  return if !ssl_supported(@_);
 
155
  # Add skip-ssl if ssl is supported to avoid
 
156
  # that mysqltest connects with SSL by default
 
157
  return 1;
 
158
}
 
159
 
 
160
sub fix_ssl_ca {
 
161
  return if !ssl_supported(@_);
 
162
  my $std_data= fix_std_data(@_);
 
163
  return "$std_data/cacert.pem"
 
164
}
 
165
 
 
166
sub fix_ssl_server_cert {
 
167
  return if !ssl_supported(@_);
 
168
  my $std_data= fix_std_data(@_);
 
169
  return "$std_data/server-cert.pem"
 
170
}
 
171
 
 
172
sub fix_ssl_client_cert {
 
173
  return if !ssl_supported(@_);
 
174
  my $std_data= fix_std_data(@_);
 
175
  return "$std_data/client-cert.pem"
 
176
}
 
177
 
 
178
sub fix_ssl_server_key {
 
179
  return if !ssl_supported(@_);
 
180
  my $std_data= fix_std_data(@_);
 
181
  return "$std_data/server-key.pem"
 
182
}
 
183
 
 
184
sub fix_ssl_client_key {
 
185
  return if !ssl_supported(@_);
 
186
  my $std_data= fix_std_data(@_);
 
187
  return "$std_data/client-key.pem"
 
188
}
 
189
 
 
190
 
 
191
#
 
192
# Rules to run for each mysqld in the config
 
193
#  - will be run in order listed here
 
194
#
 
195
my @mysqld_rules=
 
196
  (
 
197
 { 'basedir' => sub { return shift->{ARGS}->{basedir}; } },
 
198
 { 'tmpdir' => \&fix_tmpdir },
 
199
 { 'character-sets-dir' => \&fix_charset_dir },
 
200
 { 'language' => \&fix_language },
 
201
 { 'datadir' => \&fix_datadir },
 
202
 { 'pid-file' => \&fix_pidfile },
 
203
 { '#host' => \&fix_host },
 
204
 { 'port' => \&fix_port },
 
205
 { 'socket' => \&fix_socket },
 
206
 { '#log-error' => \&fix_log_error },
 
207
 { 'log' => \&fix_log },
 
208
 { 'log-slow-queries' => \&fix_log_slow_queries },
 
209
 { '#user' => sub { return shift->{ARGS}->{user} || ""; } },
 
210
 { '#password' => sub { return shift->{ARGS}->{password} || ""; } },
 
211
 { 'server-id' => \&fix_server_id, },
 
212
 # By default, prevent the started mysqld to access files outside of vardir
 
213
 { 'secure-file-priv' => sub { return shift->{ARGS}->{vardir}; } },
 
214
 { 'ssl-ca' => \&fix_ssl_ca },
 
215
 { 'ssl-cert' => \&fix_ssl_server_cert },
 
216
 { 'ssl-key' => \&fix_ssl_server_key },
 
217
  );
 
218
 
 
219
 
 
220
sub fix_ndb_mgmd_port {
 
221
  my ($self, $config, $group_name, $group)= @_;
 
222
  my $hostname= $group->value('HostName');
 
223
  return $self->{HOSTS}->{$hostname}++;
 
224
}
 
225
 
 
226
 
 
227
sub fix_cluster_dir {
 
228
  my ($self, $config, $group_name, $group)= @_;
 
229
  my $vardir= $self->{ARGS}->{vardir};
 
230
  my (undef, $process_type, $idx, $suffix)= split(/\./, $group_name);
 
231
  return "$vardir/mysql_cluster.$suffix/$process_type.$idx";
 
232
}
 
233
 
 
234
 
 
235
sub fix_cluster_backup_dir {
 
236
  my ($self, $config, $group_name, $group)= @_;
 
237
  my $vardir= $self->{ARGS}->{vardir};
 
238
  my (undef, $process_type, $idx, $suffix)= split(/\./, $group_name);
 
239
  return "$vardir/mysql_cluster.$suffix/";
 
240
}
 
241
 
 
242
 
 
243
#
 
244
# Rules to run for each ndb_mgmd in the config
 
245
#  - will be run in order listed here
 
246
#
 
247
my @ndb_mgmd_rules=
 
248
(
 
249
 { 'PortNumber' => \&fix_ndb_mgmd_port },
 
250
 { 'DataDir' => \&fix_cluster_dir },
 
251
);
 
252
 
 
253
 
 
254
#
 
255
# Rules to run for each ndbd in the config
 
256
#  - will be run in order listed here
 
257
#
 
258
my @ndbd_rules=
 
259
(
 
260
 { 'HostName' => \&fix_host },
 
261
 { 'DataDir' => \&fix_cluster_dir },
 
262
 { 'BackupDataDir' => \&fix_cluster_backup_dir },
 
263
);
 
264
 
 
265
 
 
266
#
 
267
# Rules to run for each cluster_config section
 
268
#  - will be run in order listed here
 
269
#
 
270
my @cluster_config_rules=
 
271
(
 
272
 { 'ndb_mgmd' => \&fix_host },
 
273
 { 'ndbd' => \&fix_host },
 
274
 { 'mysqld' => \&fix_host },
 
275
 { 'ndbapi' => \&fix_host },
 
276
);
 
277
 
 
278
 
 
279
#
 
280
# Rules to run for [client] section
 
281
#  - will be run in order listed here
 
282
#
 
283
my @client_rules=
 
284
(
 
285
);
 
286
 
 
287
 
 
288
#
 
289
# Rules to run for [mysqltest] section
 
290
#  - will be run in order listed here
 
291
#
 
292
my @mysqltest_rules=
 
293
(
 
294
 { 'ssl-ca' => \&fix_ssl_ca },
 
295
 { 'ssl-cert' => \&fix_ssl_client_cert },
 
296
 { 'ssl-key' => \&fix_ssl_client_key },
 
297
 { 'skip-ssl' => \&fix_skip_ssl },
 
298
);
 
299
 
 
300
 
 
301
#
 
302
# Rules to run for [mysqlbinlog] section
 
303
#  - will be run in order listed here
 
304
#
 
305
my @mysqlbinlog_rules=
 
306
(
 
307
 { 'character-sets-dir' => \&fix_charset_dir },
 
308
);
 
309
 
 
310
 
 
311
#
 
312
# Rules to run for [mysql_upgrade] section
 
313
#  - will be run in order listed here
 
314
#
 
315
my @mysql_upgrade_rules=
 
316
(
 
317
 { 'tmpdir' => sub { return shift->{ARGS}->{tmpdir}; } },
 
318
);
 
319
 
 
320
 
 
321
#
 
322
# Generate a [client.<suffix>] group to be
 
323
# used for connecting to [mysqld.<suffix>]
 
324
#
 
325
sub post_check_client_group {
 
326
  my ($self, $config, $client_group_name, $mysqld_group_name)= @_;
 
327
 
 
328
  #  Settings needed for client, copied from its "mysqld"
 
329
  my %client_needs=
 
330
    (
 
331
     port       => 'port',
 
332
     socket     => 'socket',
 
333
     host       => '#host',
 
334
     user       => '#user',
 
335
     password   => '#password',
 
336
    );
 
337
 
 
338
  my $group_to_copy_from= $config->group($mysqld_group_name);
 
339
  while (my ($name_to, $name_from)= each( %client_needs )) {
 
340
    my $option= $group_to_copy_from->option($name_from);
 
341
 
 
342
    if (! defined $option){
 
343
      #print $config;
 
344
      croak "Could not get value for '$name_from'";
 
345
    }
 
346
    $config->insert($client_group_name, $name_to, $option->value())
 
347
  }
 
348
}
 
349
 
 
350
 
 
351
sub post_check_client_groups {
 
352
 my ($self, $config)= @_;
 
353
 
 
354
 my $first_mysqld= $config->first_like('mysqld.');
 
355
 
 
356
 return unless $first_mysqld;
 
357
 
 
358
 # Always generate [client] pointing to the first
 
359
 # [mysqld.<suffix>]
 
360
 $self->post_check_client_group($config,
 
361
                                'client',
 
362
                                $first_mysqld->name());
 
363
 
 
364
 # Then generate [client.<suffix>] for each [mysqld.<suffix>]
 
365
 foreach my $mysqld ( $config->like('mysqld.') ) {
 
366
   $self->post_check_client_group($config,
 
367
                                  'client'.$mysqld->after('mysqld'),
 
368
                                  $mysqld->name())
 
369
 }
 
370
 
 
371
}
 
372
 
 
373
 
 
374
#
 
375
# Generate [embedded] by copying the values
 
376
# needed from the default [mysqld] section
 
377
# and from first [mysqld.<suffix>]
 
378
#
 
379
sub post_check_embedded_group {
 
380
  my ($self, $config)= @_;
 
381
 
 
382
  return unless $self->{ARGS}->{embedded};
 
383
 
 
384
  my $mysqld= $config->group('mysqld') or
 
385
    croak "Can't run with embedded, config has no default mysqld section";
 
386
 
 
387
  my $first_mysqld= $config->first_like('mysqld.') or
 
388
    croak "Can't run with embedded, config has no mysqld";
 
389
 
 
390
  my @no_copy =
 
391
    (
 
392
     '#log-error', # Embedded server writes stderr to mysqltest's log file
 
393
     'slave-net-timeout', # Embedded server are not build with replication
 
394
    );
 
395
 
 
396
  foreach my $option ( $mysqld->options(), $first_mysqld->options() ) {
 
397
    # Don't copy options whose name is in "no_copy" list
 
398
    next if grep ( $option->name() eq $_, @no_copy);
 
399
 
 
400
    $config->insert('embedded', $option->name(), $option->value())
 
401
  }
 
402
 
 
403
}
 
404
 
 
405
 
 
406
sub resolve_at_variable {
 
407
  my ($self, $config, $group, $option)= @_;
 
408
 
 
409
  # Split the options value on last .
 
410
  my @parts= split(/\./, $option->value());
 
411
  my $option_name= pop(@parts);
 
412
  my $group_name=  join('.', @parts);
 
413
 
 
414
  $group_name =~ s/^\@//; # Remove at
 
415
 
 
416
  my $from_group= $config->group($group_name)
 
417
    or croak "There is no group named '$group_name' that ",
 
418
      "can be used to resolve '$option_name'";
 
419
 
 
420
  my $from= $from_group->value($option_name);
 
421
  $config->insert($group->name(), $option->name(), $from)
 
422
}
 
423
 
 
424
 
 
425
sub post_fix_resolve_at_variables {
 
426
  my ($self, $config)= @_;
 
427
 
 
428
  foreach my $group ( $config->groups() ) {
 
429
    foreach my $option ( $group->options()) {
 
430
      next unless defined $option->value();
 
431
 
 
432
      $self->resolve_at_variable($config, $group, $option)
 
433
        if ($option->value() =~ /^\@/);
 
434
    }
 
435
  }
 
436
}
 
437
 
 
438
sub post_fix_mysql_cluster_section {
 
439
  my ($self, $config)= @_;
 
440
 
 
441
  # Add a [mysl_cluster.<suffix>] section for each
 
442
  # defined [cluster_config.<suffix>] section
 
443
  foreach my $group ( $config->like('cluster_config\.\w*$') )
 
444
  {
 
445
    my @urls;
 
446
    # Generate ndb_connectstring for this cluster
 
447
    foreach my $ndb_mgmd ( $config->like('cluster_config.ndb_mgmd.')) {
 
448
      if ($ndb_mgmd->suffix() eq $group->suffix()) {
 
449
        my $host= $ndb_mgmd->value('HostName');
 
450
        my $port= $ndb_mgmd->value('PortNumber');
 
451
        push(@urls, "$host:$port");
 
452
      }
 
453
    }
 
454
    croak "Could not generate valid ndb_connectstring for '$group'"
 
455
      unless @urls > 0;
 
456
    my $ndb_connectstring= join(";", @urls);
 
457
 
 
458
    # Add ndb_connectstring to [mysql_cluster.<suffix>]
 
459
    $config->insert('mysql_cluster'.$group->suffix(),
 
460
                    'ndb_connectstring', $ndb_connectstring);
 
461
 
 
462
    # Add ndb_connectstring to each mysqld connected to this
 
463
    # cluster
 
464
    foreach my $mysqld ( $config->like('cluster_config.mysqld.')) {
 
465
      if ($mysqld->suffix() eq $group->suffix()) {
 
466
        my $after= $mysqld->after('cluster_config.mysqld');
 
467
        $config->insert("mysqld$after",
 
468
                        'ndb_connectstring', $ndb_connectstring);
 
469
      }
 
470
    }
 
471
  }
 
472
}
 
473
 
 
474
#
 
475
# Rules to run last of all
 
476
#
 
477
my @post_rules=
 
478
(
 
479
 \&post_check_client_groups,
 
480
 \&post_fix_mysql_cluster_section,
 
481
 \&post_fix_resolve_at_variables,
 
482
 \&post_check_embedded_group,
 
483
);
 
484
 
 
485
 
 
486
sub run_rules_for_group {
 
487
  my ($self, $config, $group, @rules)= @_;
 
488
  foreach my $hash ( @rules ) {
 
489
    while (my ($option, $rule)= each( %{$hash} )) {
 
490
      # Only run this rule if the value is not already defined
 
491
      if (!$config->exists($group->name(), $option)) {
 
492
        my $value;
 
493
        if (ref $rule eq "CODE") {
 
494
          # Call the rule function
 
495
          $value= &$rule($self, $config, $group->name(),
 
496
                         $config->group($group->name()));
 
497
        } else {
 
498
          $value= $rule;
 
499
        }
 
500
        if (defined $value) {
 
501
          $config->insert($group->name(), $option, $value, 1);
 
502
        }
 
503
      }
 
504
    }
 
505
  }
 
506
}
 
507
 
 
508
 
 
509
sub run_section_rules {
 
510
  my ($self, $config, $name, @rules)= @_;
 
511
 
 
512
  foreach my $group ( $config->like($name) ) {
 
513
    $self->run_rules_for_group($config, $group, @rules);
 
514
  }
 
515
}
 
516
 
 
517
 
 
518
sub run_generate_sections_from_cluster_config {
 
519
  my ($self, $config)= @_;
 
520
 
 
521
  my @options= ('ndb_mgmd', 'ndbd',
 
522
                'mysqld', 'ndbapi');
 
523
 
 
524
  foreach my $group ( $config->like('cluster_config\.\w*$') ) {
 
525
 
 
526
    # Keep track of current index per process type
 
527
    my %idxes;
 
528
    map { $idxes{$_}= 1; } @options;
 
529
 
 
530
    foreach my $option_name ( @options ) {
 
531
      my $value= $group->value($option_name);
 
532
      my @hosts= split(/,/, $value, -1); # -1 => return also empty strings
 
533
 
 
534
      # Add at least one host
 
535
      push(@hosts, undef) unless scalar(@hosts);
 
536
 
 
537
      # Assign hosts unless already fixed
 
538
      @hosts= map { $self->fix_host() unless $_; } @hosts;
 
539
 
 
540
      # Write the hosts value back
 
541
      $group->insert($option_name, join(",", @hosts));
 
542
 
 
543
      # Generate sections for each host
 
544
      foreach my $host ( @hosts ){
 
545
        my $idx= $idxes{$option_name}++;
 
546
 
 
547
        my $suffix= $group->suffix();
 
548
        # Generate a section for ndb_mgmd to read
 
549
        $config->insert("cluster_config.$option_name.$idx$suffix",
 
550
                        "HostName", $host);
 
551
 
 
552
        if ($option_name eq 'mysqld'){
 
553
          my $datadir=
 
554
            $self->fix_cluster_dir($config,
 
555
                                   "cluster_config.mysqld.$idx$suffix",
 
556
                                   $group);
 
557
          $config->insert("mysqld.$idx$suffix",
 
558
                          'datadir', "$datadir/data");
 
559
        }
 
560
      }
 
561
    }
 
562
  }
 
563
}
 
564
 
 
565
 
 
566
sub new_config {
 
567
  my ($class, $args)= @_;
 
568
 
 
569
  my @required_args= ('basedir', 'baseport', 'vardir', 'template_path');
 
570
 
 
571
  foreach my $required ( @required_args ) {
 
572
    croak "you must pass '$required'" unless defined $args->{$required};
 
573
  }
 
574
 
 
575
  # Fill in hosts/port hash
 
576
  my $hosts= {};
 
577
  my $baseport= $args->{baseport};
 
578
  $args->{hosts}= [ 'localhost' ] unless exists($args->{hosts});
 
579
  foreach my $host ( @{$args->{hosts}} ) {
 
580
     $hosts->{$host}= $baseport;
 
581
  }
 
582
 
 
583
  # Open the config template
 
584
  my $config= My::Config->new($args->{'template_path'});
 
585
  my $extra_template_path= $args->{'extra_template_path'};
 
586
  if ($extra_template_path){
 
587
    $config->append(My::Config->new($extra_template_path));
 
588
  }
 
589
  my $self= bless {
 
590
                   CONFIG       => $config,
 
591
                   ARGS         => $args,
 
592
                   HOSTS        => $hosts,
 
593
                   NEXT_HOST    => 0,
 
594
                   SERVER_ID    => 1,
 
595
                  }, $class;
 
596
 
 
597
 
 
598
  {
 
599
    # Run pre rules
 
600
    foreach my $rule ( @pre_rules ) {
 
601
      &$rule($self, $config);
 
602
    }
 
603
  }
 
604
 
 
605
 
 
606
  $self->run_section_rules($config,
 
607
                           'cluster_config\.\w*$',
 
608
                           @cluster_config_rules);
 
609
  $self->run_generate_sections_from_cluster_config($config);
 
610
 
 
611
  $self->run_section_rules($config,
 
612
                           'cluster_config.ndb_mgmd.',
 
613
                           @ndb_mgmd_rules);
 
614
  $self->run_section_rules($config,
 
615
                           'cluster_config.ndbd',
 
616
                           @ndbd_rules);
 
617
 
 
618
  $self->run_section_rules($config,
 
619
                           'mysqld.',
 
620
                           @mysqld_rules);
 
621
 
 
622
  # [mysqlbinlog] need additional settings
 
623
  $self->run_rules_for_group($config,
 
624
                             $config->insert('mysqlbinlog'),
 
625
                             @mysqlbinlog_rules);
 
626
 
 
627
  # [mysql_upgrade] need additional settings
 
628
  $self->run_rules_for_group($config,
 
629
                             $config->insert('mysql_upgrade'),
 
630
                             @mysql_upgrade_rules);
 
631
 
 
632
  # Additional rules required for [client]
 
633
  $self->run_rules_for_group($config,
 
634
                             $config->insert('client'),
 
635
                             @client_rules);
 
636
 
 
637
 
 
638
  # Additional rules required for [mysqltest]
 
639
  $self->run_rules_for_group($config,
 
640
                             $config->insert('mysqltest'),
 
641
                             @mysqltest_rules);
 
642
 
 
643
  {
 
644
    # Run post rules
 
645
    foreach my $rule ( @post_rules ) {
 
646
      &$rule($self, $config);
 
647
    }
 
648
  }
 
649
 
 
650
  return $config;
 
651
}
 
652
 
 
653
 
 
654
1;
 
655