my $smbdpid = read_pid($envvars, "smbd");
my $nmbdpid = read_pid($envvars, "nmbd");
my $winbinddpid = read_pid($envvars, "winbindd");
+ my $ctdbdpid = read_pid($envvars, "ctdbd");
$self->stop_sig_term($smbdpid);
$self->stop_sig_term($nmbdpid);
$self->stop_sig_term($winbinddpid);
+ $self->stop_sig_term($ctdbdpid);
sleep(2);
$self->stop_sig_kill($smbdpid);
$self->stop_sig_kill($nmbdpid);
$self->stop_sig_kill($winbinddpid);
+ $self->stop_sig_kill($ctdbdpid);
return 0;
}
my $title = "$name LOG of: $envvars->{NETBIOSNAME}\n";
my $out = $title;
+ unless (exists($envvars->{$name."_TEST_LOG"})) {
+ die "getlog_env_app: \$envvars->{".$name."_TEST_LOG} not set\n";
+ }
+
open(LOG, "<".$envvars->{$name."_TEST_LOG"});
seek(LOG, $envvars->{$name."_TEST_LOG_POS"}, SEEK_SET);
return $ret;
}
+sub getlog_env_ctdb($$)
+{
+ my ($self, $envvars) = @_;
+ my $ret = "";
+
+ $ret .= $self->getlog_env_app($envvars, "CTDBD");
+}
+
sub check_env($$)
{
my ($self, $envvars) = @_;
}
}
return $self->setup_member("$path/member", $self->{vars}->{s3dc});
+ } elsif ($envname eq "clusteredmember") {
+ if (not defined($self->{vars}->{s3dc})) {
+ if (not defined($self->setup_s3dc("$path/s3dc"))) {
+ return undef;
+ }
+ }
+ return $self->setup_clusteredmember("$path/clusteredmember",
+ $self->{vars}->{s3dc},
+ "$path/ctdb");
} else {
return undef;
}
return $ret;
}
+sub setup_clusteredmember($$$$)
+{
+ my ($self, $prefix, $s3dcvars, $ctdbprefix) = @_;
+ my $public_if = 8;
+
+ my $ctdb_vars = $self->setup_ctdb($ctdbprefix, $public_if);
+
+ $ctdb_vars or return undef;
+
+ print "PROVISIONING CLUSTEREDMEMBER...";
+
+ my $member_options = "
+ security = domain
+ server signing = on
+ clustering = yes
+ ctdbd socket = $ctdb_vars->{SOCKET_FILE}
+";
+ my $ret = $self->provision($prefix,
+ "LOCALMEMBER3CLUSTERED",
+ $public_if,
+ "localmember3pass",
+ $member_options);
+
+ $ret or return undef;
+
+ my $net = Samba::bindir_path($self, "net");
+ my $cmd = "";
+ $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
+ $cmd .= "$net join $ret->{CONFIGURATION} $s3dcvars->{DOMAIN} member";
+ $cmd .= " -U$s3dcvars->{USERNAME}\%$s3dcvars->{PASSWORD}";
+
+ if (system($cmd) != 0) {
+ warn("Join failed\n$cmd");
+ return undef;
+ }
+
+ $self->check_or_start($ret, "yes", "yes", "yes");
+
+ if (not $self->wait_for_start($ret)) {
+ return undef;
+ }
+
+ $ret->{DC_SERVER} = $s3dcvars->{SERVER};
+ $ret->{DC_SERVER_IP} = $s3dcvars->{SERVER_IP};
+ $ret->{DC_NETBIOSNAME} = $s3dcvars->{NETBIOSNAME};
+ $ret->{DC_USERNAME} = $s3dcvars->{USERNAME};
+ $ret->{DC_PASSWORD} = $s3dcvars->{PASSWORD};
+
+ $ret->{CTDB_SOCKET_FILE} = $ctdb_vars->{SOCKET_FILE};
+
+ return $ret;
+}
+
sub setup_admember($$$$)
{
my ($self, $prefix, $dcvars, $iface) = @_;
return $pid;
}
-sub check_or_start($$$$$) {
+sub check_or_start($$$$) {
my ($self, $env_vars, $nmbd, $winbindd, $smbd) = @_;
unlink($env_vars->{NMBD_TEST_LOG});
return 1;
}
+
+##
+## provision and start of ctdb
+##
+
+sub setup_ctdb($$)
+{
+ my ($self, $prefix, $public_if) = @_;
+
+ print "PROVISIONING CTDB...";
+
+ # Give it a high ip that is (hopfully) not used elsewhere.
+ # What is the mechanism here?
+ my $private_if = 100;
+
+ my $vars = $self->provision_ctdb($prefix, $public_if, $private_if);
+
+ $vars or return undef;
+
+ $self->check_or_start_ctdb($vars);
+
+ if (not $self->wait_for_start_ctdb($vars)) {
+ return undef;
+ }
+
+ # TODO $vars->... ?
+
+ $self->{vars}->{ctdb} = $vars;
+
+ return $vars;
+}
+
+sub check_or_start_ctdb($$) {
+ my ($self, $env_vars) = @_;
+
+ unlink($env_vars->{CTDB_TEST_LOG});
+ print "STARTING CTDB...";
+ my $pid = fork();
+ if ($pid == 0) {
+ open STDOUT, ">$env_vars->{CTDB_TEST_LOG}";
+ open STDERR, '>&STDOUT';
+
+ my @preargs = (Samba::bindir_path($self, "timelimit"), $self->{server_maxtime});
+ if(defined($ENV{CTDBD_VALGRIND})) {
+ @preargs = split(/ /, $ENV{CTDBD_VALGRIND});
+ }
+
+ exec(@preargs, "$env_vars->{BINDIR}/ctdbd",
+ "--socket=$env_vars->{SOCKET_FILE}",
+ "--reclock=$env_vars->{RECLOCK_FILE}",
+ "--nlist=$env_vars->{NODES_FILE}",
+ "--nopublicipcheck",
+ "--public-addresses=$env_vars->{PUBLIC_ADDRESSES_FILE}",
+ "--event-script-dir=$env_vars->{EVENT_SCRIPT_DIR}",
+ "--logfile=$env_vars->{LOG_FILE}",
+ "-d $env_vars->{DEBUG_LEVEL}",
+ "--dbdir=$env_vars->{DB_DIR}",
+ "--dbdir-persistent=$env_vars->{DB_DIR_PERSISTENT}",
+ "--dbdir-state=$env_vars->{DB_DIR_STATE}",
+ ) or die("Unable to start ctdbd: $!");
+ }
+ write_pid($env_vars, "ctdbd", $pid);
+ print "DONE\n";
+
+ return 0;
+}
+
+sub provision_ctdb($$$$$)
+{
+ my ($self, $prefix, $priviface, $pubiface, $no_delete_prefix) = @_;
+
+ my %ret = ();
+
+ my $internal_ip = "127.0.0.$priviface";
+ my $public_ip = "127.0.0.$pubiface";
+
+ my @dirs = ();
+
+ my $prefix_abs = abs_path($prefix);
+
+ my $bindir = "$prefix_abs/bin";
+ push @dirs, $bindir;
+
+ my $var_dir = "$prefix_abs/var";
+ push @dirs, $var_dir;
+
+ my $reclock_file = "$var_dir/reck.lock";
+ my $socket_file = "$var_dir/ctdb.socket";
+ my $log_file = "$var_dir/log.ctdb";
+
+ my $db_dir = "$var_dir/ctdb";
+ push @dirs, $db_dir;
+
+ my $db_dir_persistent = "$db_dir/persistent";
+ push @dirs, $db_dir_persistent;
+
+ my $db_dir_state = "$db_dir/state";
+ push @dirs, $db_dir_state;
+
+ my $ctdb_dir = "$prefix_abs/etc/ctdb";
+ push @dirs, $ctdb_dir;
+
+ my $nodes_file = "$ctdb_dir/nodes";
+ my $public_addresses_file = "$ctdb_dir/public_addresses";
+
+ my $event_script_dir = "$ctdb_dir/events.d";
+ push @dirs, $event_script_dir;
+
+ #
+ # check / create directories:
+ #
+ die ("prefix_abs = ''") if $prefix_abs eq "";
+ die ("prefix_abs = '/'") if $prefix_abs eq "/";
+
+ mkdir ($prefix_abs, 0777);
+ print "CREATE CTDB TEST ENVIRONMENT in '$prefix_abs'...";
+
+ if (not defined($no_delete_prefix) or not $no_delete_prefix) {
+ system("rm -rf $prefix_abs/*");
+ }
+
+ mkdir($_, 0777) foreach(@dirs);
+
+ # - setup nodes
+ unless (open(NODES, ">$nodes_file")) {
+ warn("Unable to open nodesfile '$nodes_file'");
+ return undef;
+ }
+ print NODES "$internal_ip";
+ close(NODES);
+
+ # - setup public-addresses
+ unless(open(PUBLIC_ADDR, ">$public_addresses_file")) {
+ warn("Unable to open public addresses file '$public_addresses_file'");
+ return undef;
+ }
+ print PUBLIC_ADDR "$public_addresses_file/128 lo";
+ close(PUBLIC_ADDR);
+
+
+ $ret{CTDBD_TEST_LOG} = "$prefix/ctdbd_test.log";
+ $ret{CTDBD_TEST_LOG_POS} = 0;
+
+ $ret{NODES_FILE} = $nodes_file;
+ $ret{PUBLIC_ADDRESSES_FILE} = $public_addresses_file;
+ $ret{RECLOCK_FILE} = $reclock_file;
+ $ret{SOCKET_FILE} = $socket_file;
+ $ret{DB_DIR} = $db_dir;
+ $ret{DB_DIR_PERSISTENT} = $db_dir_persistent;
+ $ret{DB_DIR_STATE} = $db_dir_state;
+ $ret{LOG_FILE} = $log_file;
+ $ret{EVENT_SCRIPT_DIR} = $event_script_dir;
+ $ret{PUBLIC_INTERFACE} = "lo";
+ $ret{DEBUG_LEVEL} = 0;
+
+ $ret{BINDIR} = $bindir;
+
+ return \%ret;
+}
+
+sub wait_for_start_ctdb($$)
+{
+ my ($self, $envvars) = @_;
+
+ print "wait for ctdbd\n";
+
+ sleep(5);
+
+ # TODO
+
+ # - run ctdb status...
+
+ print $self->getlog_env_ctdb($envvars);
+
+ return 1;
+}
+
1;