From 2908bbe06a3905007864c6caeaa77fb46cc442ef Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Fri, 6 Jul 2012 15:39:09 +1000 Subject: s4-selftest: Test samba-tool domain dcpromo This needs a new environment to test it properly. This requires a raise in the number of socket wrapper interfaces. Andrew Bartlett --- lib/socket_wrapper/socket_wrapper.c | 2 +- selftest/target/Samba.pm | 1 + selftest/target/Samba4.pm | 131 +++++++++++++++++++++++++++++++++++- source4/selftest/tests.py | 3 +- 4 files changed, 134 insertions(+), 3 deletions(-) diff --git a/lib/socket_wrapper/socket_wrapper.c b/lib/socket_wrapper/socket_wrapper.c index 2c24ab7924..44d21fb3e1 100644 --- a/lib/socket_wrapper/socket_wrapper.c +++ b/lib/socket_wrapper/socket_wrapper.c @@ -154,7 +154,7 @@ /* This limit is to avoid broadcast sendto() needing to stat too many * files. It may be raised (with a performance cost) to up to 254 * without changing the format above */ -#define MAX_WRAPPED_INTERFACES 32 +#define MAX_WRAPPED_INTERFACES 40 #ifdef HAVE_IPV6 /* diff --git a/selftest/target/Samba.pm b/selftest/target/Samba.pm index 72f26a5edd..ec6fc483d3 100644 --- a/selftest/target/Samba.pm +++ b/selftest/target/Samba.pm @@ -161,6 +161,7 @@ sub get_interface($) $interfaces{"plugindc"} = 30; $interfaces{"localsubdc"} = 31; $interfaces{"chgdcpass"} = 32; + $interfaces{"promotedvdc"} = 33; # update lib/socket_wrapper/socket_wrapper.c # #define MAX_WRAPPED_INTERFACES 32 diff --git a/selftest/target/Samba4.pm b/selftest/target/Samba4.pm index f472bb5ef3..b1998a6029 100644 --- a/selftest/target/Samba4.pm +++ b/selftest/target/Samba4.pm @@ -966,6 +966,78 @@ sub provision_rpc_proxy($$$) return $ret; } +sub provision_promoted_vampire_dc($$$) +{ + my ($self, $prefix, $dcvars) = @_; + print "PROVISIONING VAMPIRE DC..."; + + # We do this so that we don't run the provision. That's the job of 'net vampire'. + my $ctx = $self->provision_raw_prepare($prefix, "domain controller", + "promotedvdc", + "SAMBADOMAIN", + "samba.example.com", + "2008", + $dcvars->{PASSWORD}, + $dcvars->{SERVER_IP}); + + $ctx->{smb_conf_extra_options} = " + max xmit = 32K + server max protocol = SMB2 + +[sysvol] + path = $ctx->{statedir}/sysvol + read only = yes + +[netlogon] + path = $ctx->{statedir}/sysvol/$ctx->{dnsname}/scripts + read only = no + +"; + + my $ret = $self->provision_raw_step1($ctx); + unless ($ret) { + return undef; + } + + my $samba_tool = Samba::bindir_path($self, "samba-tool"); + my $cmd = ""; + $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" "; + $cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" "; + $cmd .= "$samba_tool domain join $ret->{CONFIGURATION} $dcvars->{REALM} MEMBER --realm=$dcvars->{REALM}"; + $cmd .= " -U$dcvars->{DC_USERNAME}\%$dcvars->{DC_PASSWORD}"; + $cmd .= " --machinepass=machine$ret->{password}"; + + unless (system($cmd) == 0) { + warn("Join failed\n$cmd"); + return undef; + } + + my $samba_tool = Samba::bindir_path($self, "samba-tool"); + my $cmd = ""; + $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" "; + $cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" "; + $cmd .= "$samba_tool domain dcpromo $ret->{CONFIGURATION} $dcvars->{REALM} DC --realm=$dcvars->{REALM}"; + $cmd .= " -U$dcvars->{DC_USERNAME}\%$dcvars->{DC_PASSWORD}"; + $cmd .= " --machinepass=machine$ret->{password}"; + + unless (system($cmd) == 0) { + warn("Join failed\n$cmd"); + return undef; + } + + $ret->{PROMOTED_VAMPIRE_DC_SERVER} = $ret->{SERVER}; + $ret->{PROMOTED_VAMPIRE_DC_SERVER_IP} = $ret->{SERVER_IP}; + $ret->{PROMOTED_VAMPIRE_DC_NETBIOSNAME} = $ret->{NETBIOSNAME}; + + $ret->{DC_SERVER} = $dcvars->{DC_SERVER}; + $ret->{DC_SERVER_IP} = $dcvars->{DC_SERVER_IP}; + $ret->{DC_NETBIOSNAME} = $dcvars->{DC_NETBIOSNAME}; + $ret->{DC_USERNAME} = $dcvars->{DC_USERNAME}; + $ret->{DC_PASSWORD} = $dcvars->{DC_PASSWORD}; + + return $ret; +} + sub provision_vampire_dc($$$) { my ($self, $prefix, $dcvars) = @_; @@ -1486,6 +1558,11 @@ sub setup_env($$$) $self->setup_dc("$path/dc"); } return $self->setup_vampire_dc("$path/vampire_dc", $self->{vars}->{dc}); + } elsif ($envname eq "promoted_vampire_dc") { + if (not defined($self->{vars}->{dc})) { + $self->setup_dc("$path/dc"); + } + return $self->setup_promoted_vampire_dc("$path/promoted_vampire_dc", $self->{vars}->{dc}); } elsif ($envname eq "subdom_dc") { if (not defined($self->{vars}->{dc})) { $self->setup_dc("$path/dc"); @@ -1659,7 +1736,59 @@ sub setup_vampire_dc($$$) my $base_dn = "DC=".join(",DC=", split(/\./, $dc_vars->{REALM})); $cmd = "SOCKET_WRAPPER_DEFAULT_IFACE=\"$env->{SOCKET_WRAPPER_DEFAULT_IFACE}\""; $cmd .= " KRB5_CONFIG=\"$env->{KRB5_CONFIG}\""; - $cmd .= " $samba_tool drs replicate $env->{DC_SERVER} $env->{VAMPIRE_DC_SERVER}"; + $cmd .= " $samba_tool drs replicate $env->{DC_SERVER} $env->{SERVER}"; + $cmd .= " $dc_vars->{CONFIGURATION}"; + $cmd .= " -U$dc_vars->{DC_USERNAME}\%$dc_vars->{DC_PASSWORD}"; + # replicate Configuration NC + my $cmd_repl = "$cmd \"CN=Configuration,$base_dn\""; + unless(system($cmd_repl) == 0) { + warn("Failed to replicate\n$cmd_repl"); + return undef; + } + # replicate Default NC + $cmd_repl = "$cmd \"$base_dn\""; + unless(system($cmd_repl) == 0) { + warn("Failed to replicate\n$cmd_repl"); + return undef; + } + } + + return $env; +} + +sub setup_promoted_vampire_dc($$$) +{ + my ($self, $path, $dc_vars) = @_; + + my $env = $self->provision_promoted_vampire_dc($path, $dc_vars); + + if (defined $env) { + $self->check_or_start($env, "single"); + + $self->wait_for_start($env); + + $self->{vars}->{promoted_vampire_dc} = $env; + + # force replicated DC to update repsTo/repsFrom + # for vampired partitions + my $samba_tool = Samba::bindir_path($self, "samba-tool"); + my $cmd = ""; + $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$env->{SOCKET_WRAPPER_DEFAULT_IFACE}\""; + $cmd .= " KRB5_CONFIG=\"$env->{KRB5_CONFIG}\""; + $cmd .= " $samba_tool drs kcc $env->{DC_SERVER}"; + $cmd .= " $env->{CONFIGURATION}"; + $cmd .= " -U$dc_vars->{DC_USERNAME}\%$dc_vars->{DC_PASSWORD}"; + unless (system($cmd) == 0) { + warn("Failed to exec kcc\n$cmd"); + return undef; + } + + # as 'vampired' dc may add data in its local replica + # we need to synchronize data between DCs + my $base_dn = "DC=".join(",DC=", split(/\./, $dc_vars->{REALM})); + $cmd = "SOCKET_WRAPPER_DEFAULT_IFACE=\"$env->{SOCKET_WRAPPER_DEFAULT_IFACE}\""; + $cmd .= " KRB5_CONFIG=\"$env->{KRB5_CONFIG}\""; + $cmd .= " $samba_tool drs replicate $env->{DC_SERVER} $env->{SERVER}"; $cmd .= " $dc_vars->{CONFIGURATION}"; $cmd .= " -U$dc_vars->{DC_USERNAME}\%$dc_vars->{DC_PASSWORD}"; # replicate Configuration NC diff --git a/source4/selftest/tests.py b/source4/selftest/tests.py index 97030ba57e..10b176ef93 100755 --- a/source4/selftest/tests.py +++ b/source4/selftest/tests.py @@ -524,7 +524,8 @@ plantestsuite("samba4.blackbox.provision-backend", "none", ["PYTHON=%s" % python plantestsuite("samba4.blackbox.renamedc.sh", "none", ["PYTHON=%s" % python, os.path.join(bbdir, "renamedc.sh"), '$PREFIX/provision']) # Demote the vampire DC, it must be the last test on the VAMPIRE DC -plantestsuite("samba4.blackbox.samba_tool_demote(vampire_dc)", "vampire_dc", [os.path.join(samba4srcdir, "utils/tests/test_demote.sh"), '$SERVER', '$SERVER_IP', '$USERNAME', '$PASSWORD', '$DOMAIN', '$DC_SERVER', '$PREFIX/vampire_dc', smbclient]) +for env in ['vampire_dc', 'promoted_vampire_dc']: + plantestsuite("samba4.blackbox.samba_tool_demote(%s)" % env, env, [os.path.join(samba4srcdir, "utils/tests/test_demote.sh"), '$SERVER', '$SERVER_IP', '$USERNAME', '$PASSWORD', '$DOMAIN', '$DC_SERVER', '$PREFIX/%s' % env, smbclient]) # check the databases are all OK. PLEASE LEAVE THIS AS THE LAST TEST for env in ["dc", "fl2000dc", "fl2003dc", "fl2008r2dc"]: plantestsuite("samba4.blackbox.dbcheck(%s)" % env, env + ":local" , ["PYTHON=%s" % python, os.path.join(bbdir, "dbcheck.sh"), '$PREFIX/provision', configuration]) -- cgit