works
[metze/samba/wip.git] / selftest / target / Samba4.pm
index d8e066f6f4472d14599388ebef903c2c0bb27297..ecbdf3fd22868e48097e9ca488a6b28f6fe82ccc 100755 (executable)
@@ -217,9 +217,9 @@ sub wait_for_start($$)
                $count++;
        } while ($ret != 0 && $count < 20);
        if ($count == 20) {
-               warn("nbt not reachable after 20 retries\n");
                teardown_env($self, $testenv_vars);
-               return 0;
+               warn("nbt not reachable after 20 retries\n");
+               return -1;
        }
 
        # Ensure we have the first RID Set before we start tests.  This makes the tests more reliable.
@@ -254,10 +254,11 @@ sub wait_for_start($$)
                while (system("$cmd >/dev/null") != 0) {
                        $count++;
                        if ($count > $max_wait) {
+                               teardown_env($self, $testenv_vars);
                                warn("Timed out ($max_wait sec) waiting for working LDAP and a RID Set to be allocated by $testenv_vars->{NETBIOSNAME} PID $testenv_vars->{SAMBA_PID}");
-                               $ret = -1;
-                               last;
+                               return -1;
                        }
+                       print "Waiting for working LDAP...\n";
                        sleep(1);
                }
        }
@@ -278,14 +279,45 @@ sub wait_for_start($$)
                $count++;
        } while ($ret != 0 && $count < 20);
        if ($count == 20) {
-               warn("winbind not reachable after 20 retries\n");
                teardown_env($self, $testenv_vars);
-               return 0;
+               warn("winbind not reachable after 20 retries\n");
+               return -1;
+       }
+
+       # Ensure we registered all our names
+       if ($testenv_vars->{SERVER_ROLE} eq "domain controller") {
+               my $max_wait = 60;
+               print "Waiting for dns_update_cache to be created.\n";
+               $count = 0;
+               while (not -e "$testenv_vars->{PRIVATEDIR}/dns_update_cache") {
+                       $count++;
+                       if ($count > $max_wait) {
+                               teardown_env($self, $testenv_vars);
+                               warn("Timed out ($max_wait sec) waiting for dns_update_cache PID $testenv_vars->{SAMBA_PID}");
+                               return -1;
+                       }
+                       print "Waiting for dns_update_cache to be created...\n";
+                       sleep(1);
+               }
+               print "Waiting for dns_update_cache to be filled.\n";
+               $count = 0;
+               while ((-s "$testenv_vars->{PRIVATEDIR}/dns_update_cache") == 0) {
+                       $count++;
+                       if ($count > $max_wait) {
+                               teardown_env($self, $testenv_vars);
+                               warn("Timed out ($max_wait sec) waiting for dns_update_cache PID $testenv_vars->{SAMBA_PID}");
+                               return -1;
+                       }
+                       print "Waiting for dns_update_cache to be filled...\n";
+                       sleep(1);
+               }
        }
 
        print $self->getlog_env($testenv_vars);
 
-       return $ret
+       print "READY ($testenv_vars->{SAMBA_PID})\n";
+
+       return 0
 }
 
 sub write_ldb_file($$$)
@@ -443,6 +475,25 @@ sub get_dns_hub_env($)
        return undef;
 }
 
+# Returns the environmental variables that we pass to samba-tool commands
+sub get_cmd_env_vars
+{
+       my ($self, $localenv) = @_;
+
+       my $cmd_env = "NSS_WRAPPER_HOSTS='$localenv->{NSS_WRAPPER_HOSTS}' ";
+       $cmd_env .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$localenv->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
+       if (defined($localenv->{RESOLV_WRAPPER_CONF})) {
+               $cmd_env .= "RESOLV_WRAPPER_CONF=\"$localenv->{RESOLV_WRAPPER_CONF}\" ";
+       } else {
+               $cmd_env .= "RESOLV_WRAPPER_HOSTS=\"$localenv->{RESOLV_WRAPPER_HOSTS}\" ";
+       }
+       $cmd_env .= " KRB5_CONFIG=\"$localenv->{KRB5_CONFIG}\" ";
+       $cmd_env .= "KRB5CCNAME=\"$localenv->{KRB5_CCACHE}\" ";
+       $cmd_env .= "RESOLV_CONF=\"$localenv->{RESOLV_CONF}\" ";
+
+       return $cmd_env;
+}
+
 sub setup_namespaces($$:$$)
 {
        my ($self, $localenv, $upn_array, $spn_array) = @_;
@@ -461,16 +512,7 @@ sub setup_namespaces($$:$$)
 
        my $samba_tool =  Samba::bindir_path($self, "samba-tool");
 
-       my $cmd_env = "NSS_WRAPPER_HOSTS='$localenv->{NSS_WRAPPER_HOSTS}' ";
-       $cmd_env .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$localenv->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
-       if (defined($localenv->{RESOLV_WRAPPER_CONF})) {
-               $cmd_env .= "RESOLV_WRAPPER_CONF=\"$localenv->{RESOLV_WRAPPER_CONF}\" ";
-       } else {
-               $cmd_env .= "RESOLV_WRAPPER_HOSTS=\"$localenv->{RESOLV_WRAPPER_HOSTS}\" ";
-       }
-       $cmd_env .= " KRB5_CONFIG=\"$localenv->{KRB5_CONFIG}\" ";
-       $cmd_env .= "KRB5CCNAME=\"$localenv->{KRB5_CCACHE}\" ";
-       $cmd_env .= "RESOLV_CONF=\"$localenv->{RESOLV_CONF}\" ";
+       my $cmd_env = $self->get_cmd_env_vars($localenv);
 
        my $cmd_config = " $localenv->{CONFIGURATION}";
 
@@ -490,9 +532,7 @@ sub setup_trust($$$$$)
        my ($self, $localenv, $remoteenv, $type, $extra_args) = @_;
 
        $localenv->{TRUST_SERVER} = $remoteenv->{SERVER};
-       $localenv->{TRUST_SERVER_IP} = $remoteenv->{SERVER_IP};
-       $localenv->{TRUST_SERVER_IPV6} = $remoteenv->{SERVER_IPV6};
-       $localenv->{TRUST_NETBIOSNAME} = $remoteenv->{NETBIOSNAME};
+
        $localenv->{TRUST_USERNAME} = $remoteenv->{USERNAME};
        $localenv->{TRUST_PASSWORD} = $remoteenv->{PASSWORD};
        $localenv->{TRUST_DOMAIN} = $remoteenv->{DOMAIN};
@@ -502,16 +542,7 @@ sub setup_trust($$$$$)
        my $samba_tool =  Samba::bindir_path($self, "samba-tool");
 
        # setup the trust
-       my $cmd_env = "NSS_WRAPPER_HOSTS='$localenv->{NSS_WRAPPER_HOSTS}' ";
-       $cmd_env .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$localenv->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
-       if (defined($localenv->{RESOLV_WRAPPER_CONF})) {
-               $cmd_env .= "RESOLV_WRAPPER_CONF=\"$localenv->{RESOLV_WRAPPER_CONF}\" ";
-       } else {
-               $cmd_env .= "RESOLV_WRAPPER_HOSTS=\"$localenv->{RESOLV_WRAPPER_HOSTS}\" ";
-       }
-       $cmd_env .= " KRB5_CONFIG=\"$localenv->{KRB5_CONFIG}\" ";
-       $cmd_env .= "KRB5CCNAME=\"$localenv->{KRB5_CCACHE}\" ";
-       $cmd_env .= "RESOLV_CONF=\"$localenv->{RESOLV_CONF}\" ";
+       my $cmd_env = $self->get_cmd_env_vars($localenv);
 
        my $cmd_config = " $localenv->{CONFIGURATION}";
        my $cmd_creds = $cmd_config;
@@ -794,8 +825,6 @@ sub provision_raw_step1($$)
        dreplsrv:periodic_startup_interval = 0
        dsdb:schema update allowed = yes
 
-        prefork children = 4
-
         vfs objects = dfs_samba4 acl_xattr fake_acls xattr_tdb streams_depot
 
         idmap_ldb:use rfc2307=yes
@@ -877,21 +906,30 @@ nogroup:x:65534:nobody
                return undef;
        }
 
+       # Return the environment variables for the new testenv DC.
+       # Note that we have SERVER_X and DC_SERVER_X variables (which have the same
+       # value initially). In a 2 DC setup, $DC_SERVER_X will always be the PDC.
        my $ret = {
                KRB5_CONFIG => $ctx->{krb5_conf},
                KRB5_CCACHE => $ctx->{krb5_ccache},
                MITKDC_CONFIG => $ctx->{mitkdc_conf},
                PIDDIR => $ctx->{piddir},
                SERVER => $ctx->{hostname},
+               DC_SERVER => $ctx->{hostname},
                SERVER_IP => $ctx->{ipv4},
+               DC_SERVER_IP => $ctx->{ipv4},
                SERVER_IPV6 => $ctx->{ipv6},
+               DC_SERVER_IPV6 => $ctx->{ipv6},
                NETBIOSNAME => $ctx->{netbiosname},
+               DC_NETBIOSNAME => $ctx->{netbiosname},
                DOMAIN => $ctx->{domain},
                USERNAME => $ctx->{username},
+               DC_USERNAME => $ctx->{username},
                REALM => $ctx->{realm},
                DNSNAME => $ctx->{dnsname},
                SAMSID => $ctx->{samsid},
                PASSWORD => $ctx->{password},
+               DC_PASSWORD => $ctx->{password},
                LDAPDIR => $ctx->{ldapdir},
                LDAP_INSTANCE => $ctx->{ldap_instance},
                SELFTEST_WINBINDD_SOCKET_DIR => $ctx->{winbindd_socket_dir},
@@ -1235,6 +1273,22 @@ $extra_smbconf_shares
        return $self->provision_raw_step2($ctx, $ret);
 }
 
+# For multi-DC testenvs, we want $DC_SERVER to always be the PDC (i.e. the
+# original DC) in the testenv. $SERVER is always the joined DC that we are
+# actually running the test against
+sub set_pdc_env_vars
+{
+       my ($self, $env, $dcvars) = @_;
+
+       $env->{DC_SERVER} = $dcvars->{DC_SERVER};
+       $env->{DC_SERVER_IP} = $dcvars->{DC_SERVER_IP};
+       $env->{DC_SERVER_IPV6} = $dcvars->{DC_SERVER_IPV6};
+       $env->{DC_SERVERCONFFILE} = $dcvars->{SERVERCONFFILE};
+       $env->{DC_NETBIOSNAME} = $dcvars->{DC_NETBIOSNAME};
+       $env->{DC_USERNAME} = $dcvars->{DC_USERNAME};
+       $env->{DC_PASSWORD} = $dcvars->{DC_PASSWORD};
+}
+
 sub provision_s4member($$$$$)
 {
        my ($self, $prefix, $dcvars, $hostname, $more_conf) = @_;
@@ -1277,16 +1331,7 @@ rpc_server:tcpip = no
        }
 
        my $samba_tool =  Samba::bindir_path($self, "samba-tool");
-       my $cmd = "NSS_WRAPPER_HOSTS='$ret->{NSS_WRAPPER_HOSTS}' ";
-       $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
-       if (defined($ret->{RESOLV_WRAPPER_CONF})) {
-               $cmd .= "RESOLV_WRAPPER_CONF=\"$ret->{RESOLV_WRAPPER_CONF}\" ";
-       } else {
-               $cmd .= "RESOLV_WRAPPER_HOSTS=\"$ret->{RESOLV_WRAPPER_HOSTS}\" ";
-       }
-       $cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" ";
-       $cmd .= "KRB5CCNAME=\"$ret->{KRB5_CCACHE}\" ";
-       $cmd .= "RESOLV_CONF=\"$ret->{RESOLV_CONF}\" ";
+       my $cmd = $self->get_cmd_env_vars($ret);
        $cmd .= "$samba_tool domain join $ret->{CONFIGURATION} $dcvars->{REALM} member";
        $cmd .= " -U$dcvars->{DC_USERNAME}\%$dcvars->{DC_PASSWORD}";
        $cmd .= " --machinepass=machine$ret->{PASSWORD}";
@@ -1296,20 +1341,8 @@ rpc_server:tcpip = no
                return undef;
        }
 
-       $ret->{MEMBER_SERVER} = $ret->{SERVER};
-       $ret->{MEMBER_SERVER_IP} = $ret->{SERVER_IP};
-       $ret->{MEMBER_SERVER_IPV6} = $ret->{SERVER_IPV6};
-       $ret->{MEMBER_NETBIOSNAME} = $ret->{NETBIOSNAME};
-       $ret->{MEMBER_USERNAME} = $ret->{USERNAME};
-       $ret->{MEMBER_PASSWORD} = $ret->{PASSWORD};
-
        $ret->{DOMSID} = $dcvars->{DOMSID};
-       $ret->{DC_SERVER} = $dcvars->{DC_SERVER};
-       $ret->{DC_SERVER_IP} = $dcvars->{DC_SERVER_IP};
-       $ret->{DC_SERVER_IPV6} = $dcvars->{DC_SERVER_IPV6};
-       $ret->{DC_NETBIOSNAME} = $dcvars->{DC_NETBIOSNAME};
-       $ret->{DC_USERNAME} = $dcvars->{DC_USERNAME};
-       $ret->{DC_PASSWORD} = $dcvars->{DC_PASSWORD};
+       $self->set_pdc_env_vars($ret, $dcvars);
 
        return $ret;
 }
@@ -1360,16 +1393,7 @@ sub provision_rpc_proxy($$$)
        my $samba_tool =  Samba::bindir_path($self, "samba-tool");
 
        # The joind runs in the context of the rpc_proxy/member for now
-       my $cmd = "NSS_WRAPPER_HOSTS='$ret->{NSS_WRAPPER_HOSTS}' ";
-       $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
-       if (defined($ret->{RESOLV_WRAPPER_CONF})) {
-               $cmd .= "RESOLV_WRAPPER_CONF=\"$ret->{RESOLV_WRAPPER_CONF}\" ";
-       } else {
-               $cmd .= "RESOLV_WRAPPER_HOSTS=\"$ret->{RESOLV_WRAPPER_HOSTS}\" ";
-       }
-       $cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" ";
-       $cmd .= "KRB5CCNAME=\"$ret->{KRB5_CCACHE}\" ";
-       $cmd .= "RESOLV_CONF=\"$ret->{RESOLV_CONF}\" ";
+       my $cmd = $self->get_cmd_env_vars($ret);
        $cmd .= "$samba_tool domain join $ret->{CONFIGURATION} $dcvars->{REALM} member";
        $cmd .= " -U$dcvars->{DC_USERNAME}\%$dcvars->{DC_PASSWORD}";
        $cmd .= " --machinepass=machine$ret->{PASSWORD}";
@@ -1408,20 +1432,8 @@ sub provision_rpc_proxy($$$)
                return undef;
        }
 
-       $ret->{RPC_PROXY_SERVER} = $ret->{SERVER};
-       $ret->{RPC_PROXY_SERVER_IP} = $ret->{SERVER_IP};
-       $ret->{RPC_PROXY_SERVER_IPV6} = $ret->{SERVER_IPV6};
-       $ret->{RPC_PROXY_NETBIOSNAME} = $ret->{NETBIOSNAME};
-       $ret->{RPC_PROXY_USERNAME} = $ret->{USERNAME};
-       $ret->{RPC_PROXY_PASSWORD} = $ret->{PASSWORD};
-
        $ret->{DOMSID} = $dcvars->{DOMSID};
-       $ret->{DC_SERVER} = $dcvars->{DC_SERVER};
-       $ret->{DC_SERVER_IP} = $dcvars->{DC_SERVER_IP};
-       $ret->{DC_SERVER_IPV6} = $dcvars->{DC_SERVER_IPV6};
-       $ret->{DC_NETBIOSNAME} = $dcvars->{DC_NETBIOSNAME};
-       $ret->{DC_USERNAME} = $dcvars->{DC_USERNAME};
-       $ret->{DC_PASSWORD} = $dcvars->{DC_PASSWORD};
+       $self->set_pdc_env_vars($ret, $dcvars);
 
        return $ret;
 }
@@ -1466,16 +1478,7 @@ sub provision_promoted_dc($$$)
        }
 
        my $samba_tool =  Samba::bindir_path($self, "samba-tool");
-       my $cmd = "NSS_WRAPPER_HOSTS='$ret->{NSS_WRAPPER_HOSTS}' ";
-       $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
-       if (defined($ret->{RESOLV_WRAPPER_CONF})) {
-               $cmd .= "RESOLV_WRAPPER_CONF=\"$ret->{RESOLV_WRAPPER_CONF}\" ";
-       } else {
-               $cmd .= "RESOLV_WRAPPER_HOSTS=\"$ret->{RESOLV_WRAPPER_HOSTS}\" ";
-       }
-       $cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" ";
-       $cmd .= "KRB5CCNAME=\"$ret->{KRB5_CCACHE}\" ";
-       $cmd .= "RESOLV_CONF=\"$ret->{RESOLV_CONF}\" ";
+       my $cmd = $self->get_cmd_env_vars($ret);
        $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}";
@@ -1486,16 +1489,7 @@ sub provision_promoted_dc($$$)
        }
 
        my $samba_tool =  Samba::bindir_path($self, "samba-tool");
-       my $cmd = "NSS_WRAPPER_HOSTS='$ret->{NSS_WRAPPER_HOSTS}' ";
-       $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
-       if (defined($ret->{RESOLV_WRAPPER_CONF})) {
-               $cmd .= "RESOLV_WRAPPER_CONF=\"$ret->{RESOLV_WRAPPER_CONF}\" ";
-       } else {
-               $cmd .= "RESOLV_WRAPPER_HOSTS=\"$ret->{RESOLV_WRAPPER_HOSTS}\" ";
-       }
-       $cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" ";
-       $cmd .= "KRB5CCNAME=\"$ret->{KRB5_CCACHE}\" ";
-       $cmd .= "RESOLV_CONF=\"$ret->{RESOLV_CONF}\" ";
+       my $cmd = $self->get_cmd_env_vars($ret);
        $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} --use-ntvfs --dns-backend=BIND9_DLZ";
@@ -1505,17 +1499,7 @@ sub provision_promoted_dc($$$)
                return undef;
        }
 
-       $ret->{PROMOTED_DC_SERVER} = $ret->{SERVER};
-       $ret->{PROMOTED_DC_SERVER_IP} = $ret->{SERVER_IP};
-       $ret->{PROMOTED_DC_SERVER_IPV6} = $ret->{SERVER_IPV6};
-       $ret->{PROMOTED_DC_NETBIOSNAME} = $ret->{NETBIOSNAME};
-
-       $ret->{DC_SERVER} = $dcvars->{DC_SERVER};
-       $ret->{DC_SERVER_IP} = $dcvars->{DC_SERVER_IP};
-       $ret->{DC_SERVER_IPV6} = $dcvars->{DC_SERVER_IPV6};
-       $ret->{DC_NETBIOSNAME} = $dcvars->{DC_NETBIOSNAME};
-       $ret->{DC_USERNAME} = $dcvars->{DC_USERNAME};
-       $ret->{DC_PASSWORD} = $dcvars->{DC_PASSWORD};
+       $self->set_pdc_env_vars($ret, $dcvars);
 
        return $ret;
 }
@@ -1570,16 +1554,7 @@ sub provision_vampire_dc($$$)
        }
 
        my $samba_tool =  Samba::bindir_path($self, "samba-tool");
-       my $cmd = "NSS_WRAPPER_HOSTS='$ret->{NSS_WRAPPER_HOSTS}' ";
-       $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
-       if (defined($ret->{RESOLV_WRAPPER_CONF})) {
-               $cmd .= "RESOLV_WRAPPER_CONF=\"$ret->{RESOLV_WRAPPER_CONF}\" ";
-       } else {
-               $cmd .= "RESOLV_WRAPPER_HOSTS=\"$ret->{RESOLV_WRAPPER_HOSTS}\" ";
-       }
-       $cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" ";
-       $cmd .= "KRB5CCNAME=\"$ret->{KRB5_CCACHE}\" ";
-       $cmd .= "RESOLV_CONF=\"$ret->{RESOLV_CONF}\" ";
+       my $cmd = $self->get_cmd_env_vars($ret);
        $cmd .= "$samba_tool domain join $ret->{CONFIGURATION} $dcvars->{REALM} DC --realm=$dcvars->{REALM}";
        $cmd .= " -U$dcvars->{DC_USERNAME}\%$dcvars->{DC_PASSWORD} --domain-critical-only";
        $cmd .= " --machinepass=machine$ret->{PASSWORD} --use-ntvfs";
@@ -1590,23 +1565,7 @@ sub provision_vampire_dc($$$)
                return undef;
        }
 
-        if ($fl == "2000") {
-               $ret->{VAMPIRE_2000_DC_SERVER} = $ret->{SERVER};
-               $ret->{VAMPIRE_2000_DC_SERVER_IP} = $ret->{SERVER_IP};
-               $ret->{VAMPIRE_2000_DC_SERVER_IPV6} = $ret->{SERVER_IPV6};
-               $ret->{VAMPIRE_2000_DC_NETBIOSNAME} = $ret->{NETBIOSNAME};
-        } else {
-               $ret->{VAMPIRE_DC_SERVER} = $ret->{SERVER};
-               $ret->{VAMPIRE_DC_SERVER_IP} = $ret->{SERVER_IP};
-               $ret->{VAMPIRE_DC_SERVER_IPV6} = $ret->{SERVER_IPV6};
-               $ret->{VAMPIRE_DC_NETBIOSNAME} = $ret->{NETBIOSNAME};
-        }
-       $ret->{DC_SERVER} = $dcvars->{DC_SERVER};
-       $ret->{DC_SERVER_IP} = $dcvars->{DC_SERVER_IP};
-       $ret->{DC_SERVER_IPV6} = $dcvars->{DC_SERVER_IPV6};
-       $ret->{DC_NETBIOSNAME} = $dcvars->{DC_NETBIOSNAME};
-       $ret->{DC_USERNAME} = $dcvars->{DC_USERNAME};
-       $ret->{DC_PASSWORD} = $dcvars->{DC_PASSWORD};
+       $self->set_pdc_env_vars($ret, $dcvars);
        $ret->{DC_REALM} = $dcvars->{DC_REALM};
 
        return $ret;
@@ -1653,16 +1612,7 @@ sub provision_subdom_dc($$$)
        Samba::mk_mitkdc_conf($ctx, abs_path(Samba::bindir_path($self, "shared")));
 
        my $samba_tool =  Samba::bindir_path($self, "samba-tool");
-       my $cmd = "NSS_WRAPPER_HOSTS='$ret->{NSS_WRAPPER_HOSTS}' ";
-       $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
-       if (defined($ret->{RESOLV_WRAPPER_CONF})) {
-               $cmd .= "RESOLV_WRAPPER_CONF=\"$ret->{RESOLV_WRAPPER_CONF}\" ";
-       } else {
-               $cmd .= "RESOLV_WRAPPER_HOSTS=\"$ret->{RESOLV_WRAPPER_HOSTS}\" ";
-       }
-       $cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" ";
-       $cmd .= "KRB5CCNAME=\"$ret->{KRB5_CCACHE}\" ";
-       $cmd .= "RESOLV_CONF=\"$ret->{RESOLV_CONF}\" ";
+       my $cmd = $self->get_cmd_env_vars($ret);
        $cmd .= "$samba_tool domain join $ret->{CONFIGURATION} $ctx->{dnsname} subdomain ";
        $cmd .= "--parent-domain=$dcvars->{REALM} -U$dcvars->{DC_USERNAME}\@$dcvars->{REALM}\%$dcvars->{DC_PASSWORD}";
        $cmd .= " --machinepass=machine$ret->{PASSWORD} --use-ntvfs";
@@ -1674,16 +1624,8 @@ sub provision_subdom_dc($$$)
        }
 
        $ret->{SUBDOM_DC_SERVER} = $ret->{SERVER};
-       $ret->{SUBDOM_DC_SERVER_IP} = $ret->{SERVER_IP};
-       $ret->{SUBDOM_DC_SERVER_IPV6} = $ret->{SERVER_IPV6};
-       $ret->{SUBDOM_DC_NETBIOSNAME} = $ret->{NETBIOSNAME};
 
-       $ret->{DC_SERVER} = $dcvars->{DC_SERVER};
-       $ret->{DC_SERVER_IP} = $dcvars->{DC_SERVER_IP};
-       $ret->{DC_SERVER_IPV6} = $dcvars->{DC_SERVER_IPV6};
-       $ret->{DC_NETBIOSNAME} = $dcvars->{DC_NETBIOSNAME};
-       $ret->{DC_USERNAME} = $dcvars->{DC_USERNAME};
-       $ret->{DC_PASSWORD} = $dcvars->{DC_PASSWORD};
+       $self->set_pdc_env_vars($ret, $dcvars);
 
        return $ret;
 }
@@ -1732,12 +1674,6 @@ sub provision_ad_dc_ntvfs($$)
                return undef;
        }
        $ret->{NETBIOSALIAS} = "localdc1-a";
-       $ret->{DC_SERVER} = $ret->{SERVER};
-       $ret->{DC_SERVER_IP} = $ret->{SERVER_IP};
-       $ret->{DC_SERVER_IPV6} = $ret->{SERVER_IPV6};
-       $ret->{DC_NETBIOSNAME} = $ret->{NETBIOSNAME};
-       $ret->{DC_USERNAME} = $ret->{USERNAME};
-       $ret->{DC_PASSWORD} = $ret->{PASSWORD};
        $ret->{DC_REALM} = $ret->{REALM};
 
        return $ret;
@@ -1751,6 +1687,7 @@ sub provision_fl2000dc($$)
        my $extra_conf_options = "
        spnego:simulate_w2k=yes
        ntlmssp_server:force_old_spnego=yes
+       server max protocol = NT1
 ";
        my $extra_provision_options = ["--use-ntvfs"];
        # This environment uses plain text secrets
@@ -1778,12 +1715,6 @@ sub provision_fl2000dc($$)
                warn("Unable to add wins configuration");
                return undef;
        }
-       $ret->{DC_SERVER} = $ret->{SERVER};
-       $ret->{DC_SERVER_IP} = $ret->{SERVER_IP};
-       $ret->{DC_SERVER_IPV6} = $ret->{SERVER_IPV6};
-       $ret->{DC_NETBIOSNAME} = $ret->{NETBIOSNAME};
-       $ret->{DC_USERNAME} = $ret->{USERNAME};
-       $ret->{DC_PASSWORD} = $ret->{PASSWORD};
        $ret->{DC_REALM} = $ret->{REALM};
 
        return $ret;
@@ -1799,7 +1730,9 @@ sub provision_fl2003dc($$$)
        my $extra_conf_options = "allow dns updates = nonsecure and secure
        dcesrv:header signing = no
        dcesrv:max auth states = 0
-       dns forwarder = 127.0.0.$swiface1 127.0.0.$swiface2";
+       dns forwarder = 127.0.0.$swiface1 127.0.0.$swiface2
+       server max protocol = SMB2_02
+       ";
        my $extra_provision_options = ["--use-ntvfs"];
        my $ret = $self->provision($prefix,
                                   "domain controller",
@@ -1817,12 +1750,6 @@ sub provision_fl2003dc($$$)
                return undef;
        }
 
-       $ret->{DC_SERVER} = $ret->{SERVER};
-       $ret->{DC_SERVER_IP} = $ret->{SERVER_IP};
-       $ret->{DC_SERVER_IPV6} = $ret->{SERVER_IPV6};
-       $ret->{DC_NETBIOSNAME} = $ret->{NETBIOSNAME};
-       $ret->{DC_USERNAME} = $ret->{USERNAME};
-       $ret->{DC_PASSWORD} = $ret->{PASSWORD};
        $ret->{DNS_FORWARDER1} = "127.0.0.$swiface1";
        $ret->{DNS_FORWARDER2} = "127.0.0.$swiface2";
 
@@ -1855,7 +1782,10 @@ sub provision_fl2008r2dc($$$)
        my ($self, $prefix, $dcvars) = @_;
 
        print "PROVISIONING DC WITH FOREST LEVEL 2008r2...\n";
-        my $extra_conf_options = "ldap server require strong auth = no";
+       my $extra_conf_options = "
+       ldap server require strong auth = no
+       server max protocol = SMB2_10
+       ";
        my $extra_provision_options = ["--use-ntvfs"];
        my $ret = $self->provision($prefix,
                                   "domain controller",
@@ -1877,12 +1807,6 @@ sub provision_fl2008r2dc($$$)
                warn("Unable to add wins configuration");
                return undef;
        }
-       $ret->{DC_SERVER} = $ret->{SERVER};
-       $ret->{DC_SERVER_IP} = $ret->{SERVER_IP};
-       $ret->{DC_SERVER_IPV6} = $ret->{SERVER_IPV6};
-       $ret->{DC_NETBIOSNAME} = $ret->{NETBIOSNAME};
-       $ret->{DC_USERNAME} = $ret->{USERNAME};
-       $ret->{DC_PASSWORD} = $ret->{PASSWORD};
        $ret->{DC_REALM} = $ret->{REALM};
 
        return $ret;
@@ -1941,16 +1865,7 @@ sub provision_rodc($$$)
        }
 
        my $samba_tool =  Samba::bindir_path($self, "samba-tool");
-       my $cmd = "NSS_WRAPPER_HOSTS='$ret->{NSS_WRAPPER_HOSTS}' ";
-       $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
-       if (defined($ret->{RESOLV_WRAPPER_CONF})) {
-               $cmd .= "RESOLV_WRAPPER_CONF=\"$ret->{RESOLV_WRAPPER_CONF}\" ";
-       } else {
-               $cmd .= "RESOLV_WRAPPER_HOSTS=\"$ret->{RESOLV_WRAPPER_HOSTS}\" ";
-       }
-       $cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" ";
-       $cmd .= "KRB5CCNAME=\"$ret->{KRB5_CCACHE}\" ";
-       $cmd .= "RESOLV_CONF=\"$ret->{RESOLV_CONF}\" ";
+       my $cmd = $self->get_cmd_env_vars($ret);
        $cmd .= "$samba_tool domain join $ret->{CONFIGURATION} $dcvars->{REALM} RODC";
        $cmd .= " -U$dcvars->{DC_USERNAME}\%$dcvars->{DC_PASSWORD}";
        $cmd .= " --server=$dcvars->{DC_SERVER} --use-ntvfs";
@@ -1982,17 +1897,7 @@ sub provision_rodc($$$)
        Samba::mk_krb5_conf($ctx);
        Samba::mk_mitkdc_conf($ctx, abs_path(Samba::bindir_path($self, "shared")));
 
-       $ret->{RODC_DC_SERVER} = $ret->{SERVER};
-       $ret->{RODC_DC_SERVER_IP} = $ret->{SERVER_IP};
-       $ret->{RODC_DC_SERVER_IPV6} = $ret->{SERVER_IPV6};
-       $ret->{RODC_DC_NETBIOSNAME} = $ret->{NETBIOSNAME};
-
-       $ret->{DC_SERVER} = $dcvars->{DC_SERVER};
-       $ret->{DC_SERVER_IP} = $dcvars->{DC_SERVER_IP};
-       $ret->{DC_SERVER_IPV6} = $dcvars->{DC_SERVER_IPV6};
-       $ret->{DC_NETBIOSNAME} = $dcvars->{DC_NETBIOSNAME};
-       $ret->{DC_USERNAME} = $dcvars->{DC_USERNAME};
-       $ret->{DC_PASSWORD} = $dcvars->{DC_PASSWORD};
+       $self->set_pdc_env_vars($ret, $dcvars);
 
        return $ret;
 }
@@ -2154,13 +2059,6 @@ sub provision_ad_dc($$$$$$)
                return undef;
        }
 
-       $ret->{DC_SERVER} = $ret->{SERVER};
-       $ret->{DC_SERVER_IP} = $ret->{SERVER_IP};
-       $ret->{DC_SERVER_IPV6} = $ret->{SERVER_IPV6};
-       $ret->{DC_NETBIOSNAME} = $ret->{NETBIOSNAME};
-       $ret->{DC_USERNAME} = $ret->{USERNAME};
-       $ret->{DC_PASSWORD} = $ret->{PASSWORD};
-
        return $ret;
 }
 
@@ -2207,13 +2105,7 @@ sub provision_chgdcpass($$)
                warn("Unable to remove $ret->{PRIVATEDIR}/secrets.tdb added during provision");
                return undef;
        }
-           
-       $ret->{DC_SERVER} = $ret->{SERVER};
-       $ret->{DC_SERVER_IP} = $ret->{SERVER_IP};
-       $ret->{DC_SERVER_IPV6} = $ret->{SERVER_IPV6};
-       $ret->{DC_NETBIOSNAME} = $ret->{NETBIOSNAME};
-       $ret->{DC_USERNAME} = $ret->{USERNAME};
-       $ret->{DC_PASSWORD} = $ret->{PASSWORD};
+
        $ret->{UNACCEPTABLE_PASSWORD} = $unacceptable_password;
 
        return $ret;
@@ -2530,16 +2422,7 @@ sub setup_generic_vampire_dc
                # 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}));
-               my $cmd = "NSS_WRAPPER_HOSTS='$env->{NSS_WRAPPER_HOSTS}' ";
-               $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$env->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
-               if (defined($env->{RESOLV_WRAPPER_CONF})) {
-                       $cmd .= "RESOLV_WRAPPER_CONF=\"$env->{RESOLV_WRAPPER_CONF}\" ";
-               } else {
-                       $cmd .= "RESOLV_WRAPPER_HOSTS=\"$env->{RESOLV_WRAPPER_HOSTS}\" ";
-               }
-               $cmd .= " KRB5_CONFIG=\"$env->{KRB5_CONFIG}\"";
-               $cmd .= "KRB5CCNAME=\"$env->{KRB5_CCACHE}\" ";
-               $cmd .= "RESOLV_CONF=\"$env->{RESOLV_CONF}\" ";
+               my $cmd = $self->get_cmd_env_vars($env);
                $cmd .= " $samba_tool drs replicate $env->{DC_SERVER} $env->{SERVER}";
                $cmd .= " $dc_vars->{CONFIGURATION}";
                $cmd .= " -U$dc_vars->{DC_USERNAME}\%$dc_vars->{DC_PASSWORD}";
@@ -2558,16 +2441,7 @@ sub setup_generic_vampire_dc
 
                # Pull in a full set of changes from the main DC
                my $base_dn = "DC=".join(",DC=", split(/\./, $dc_vars->{REALM}));
-               $cmd = "NSS_WRAPPER_HOSTS='$env->{NSS_WRAPPER_HOSTS}' ";
-               $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$env->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
-               if (defined($env->{RESOLV_WRAPPER_CONF})) {
-                       $cmd .= "RESOLV_WRAPPER_CONF=\"$env->{RESOLV_WRAPPER_CONF}\" ";
-               } else {
-                       $cmd .= "RESOLV_WRAPPER_HOSTS=\"$env->{RESOLV_WRAPPER_HOSTS}\" ";
-               }
-               $cmd .= " KRB5_CONFIG=\"$env->{KRB5_CONFIG}\"";
-               $cmd .= "KRB5CCNAME=\"$env->{KRB5_CCACHE}\" ";
-               $cmd .= "RESOLV_CONF=\"$env->{RESOLV_CONF}\" ";
+               $cmd = $self->get_cmd_env_vars($env);
                $cmd .= " $samba_tool drs replicate $env->{SERVER} $env->{DC_SERVER}";
                $cmd .= " $dc_vars->{CONFIGURATION}";
                $cmd .= " -U$dc_vars->{DC_USERNAME}\%$dc_vars->{DC_PASSWORD}";
@@ -3060,13 +2934,6 @@ sub prepare_dc_testenv
 
        my $env = $self->provision_raw_step1($ctx);
 
-       $env->{DC_SERVER} = $env->{SERVER};
-       $env->{DC_SERVER_IP} = $env->{SERVER_IP};
-       $env->{DC_SERVER_IPV6} = $env->{SERVER_IPV6};
-       $env->{DC_NETBIOSNAME} = $env->{NETBIOSNAME};
-       $env->{DC_USERNAME} = $env->{USERNAME};
-       $env->{DC_PASSWORD} = $env->{PASSWORD};
-
     return ($env, $ctx);
 }
 
@@ -3083,7 +2950,8 @@ sub setup_restoredc
        # we arbitrarily designate the restored DC as having SMBv1 disabled
        my $extra_conf = "
        server min protocol = SMB2
-       client min protocol = SMB2";
+       client min protocol = SMB2
+       prefork children = 1";
 
        my ($env, $ctx) = $self->prepare_dc_testenv($prefix, "restoredc",
                                                    $dcvars->{DOMAIN},
@@ -3126,11 +2994,12 @@ sub setup_renamedc
        # note: dcvars contains the env info for the dependent testenv ('backupfromdc')
        my ($self, $prefix, $dcvars) = @_;
        print "Preparing RENAME DC...\n";
+       my $extra_conf = "prefork children = 1";
 
        my $realm = "renamedom.samba.example.com";
        my ($env, $ctx) = $self->prepare_dc_testenv($prefix, "renamedc",
                                                    "RENAMEDOMAIN", $realm,
-                                                   $dcvars->{PASSWORD}, "");
+                                                   $dcvars->{PASSWORD}, $extra_conf);
 
        # create a backup of the 'backupfromdc' which renames the domain
        my $backupdir = File::Temp->newdir();
@@ -3173,11 +3042,12 @@ sub setup_offlinebackupdc
        # note: dcvars contains the env info for the dependent testenv ('backupfromdc')
        my ($self, $prefix, $dcvars) = @_;
        print "Preparing OFFLINE BACKUP DC...\n";
+       my $extra_conf = "prefork children = 1";
 
        my ($env, $ctx) = $self->prepare_dc_testenv($prefix, "offlinebackupdc",
                                                    $dcvars->{DOMAIN},
                                                    $dcvars->{REALM},
-                                                   $dcvars->{PASSWORD}, "");
+                                                   $dcvars->{PASSWORD}, $extra_conf);
 
        # create an offline backup of the 'backupfromdc' target
        my $backupdir = File::Temp->newdir();
@@ -3217,11 +3087,12 @@ sub setup_labdc
        # note: dcvars contains the env info for the dependent testenv ('backupfromdc')
        my ($self, $prefix, $dcvars) = @_;
        print "Preparing LAB-DOMAIN DC...\n";
+       my $extra_conf = "prefork children = 1";
 
        my ($env, $ctx) = $self->prepare_dc_testenv($prefix, "labdc",
                                                    "LABDOMAIN",
                                                    "labdom.samba.example.com",
-                                                   $dcvars->{PASSWORD}, "");
+                                                   $dcvars->{PASSWORD}, $extra_conf);
 
        # create a backup of the 'backupfromdc' which renames the domain and uses
        # the --no-secrets option to scrub any sensitive info