pyldb: avoid segfault when adding an element with no name
[kai/samba-autobuild/.git] / selftest / target / Samba4.pm
index 46b04e2668ba52a134b72fb99b782be9a2723cc5..6f4a31d357af22aa247a35ecf08f5ea752c7db5d 100755 (executable)
@@ -333,12 +333,13 @@ sub write_ldb_file($$$)
 sub add_wins_config($$)
 {
        my ($self, $privatedir) = @_;
+       my $client_ip = Samba::get_ipv4_addr("client");
 
        return $self->write_ldb_file("$privatedir/wins_config.ldb", "
 dn: name=TORTURE_11,CN=PARTNERS
 objectClass: wreplPartner
 name: TORTURE_11
-address: 127.0.0.11
+address: $client_ip
 pullInterval: 0
 pushChangeCount: 0
 type: 0x3
@@ -385,25 +386,19 @@ sub setup_dns_hub_internal($$$)
                warn("Unable to clean up");
        }
 
-       my $swiface = Samba::get_interface($hostname);
-
        my $env = undef;
-       $env->{prefix} = $prefix;
-       $env->{prefix_abs} = $prefix_abs;
-
-       $env->{hostname} = $hostname;
-       $env->{swiface} = $swiface;
+       $env->{NETBIOSNAME} = $hostname;
 
-       $env->{ipv4} = "127.0.0.$swiface";
-       $env->{ipv6} = sprintf("fd00:0000:0000:0000:0000:0000:5357:5f%02x", $swiface);
+       $env->{SERVER_IP} = Samba::get_ipv4_addr($hostname);
+       $env->{SERVER_IPV6} = Samba::get_ipv6_addr($hostname);
 
        $env->{DNS_HUB_LOG} = "$prefix_abs/dns_hub.log";
 
        $env->{RESOLV_CONF} = "$prefix_abs/resolv.conf";
 
        open(RESOLV_CONF, ">$env->{RESOLV_CONF}");
-       print RESOLV_CONF "nameserver $env->{ipv4}\n";
-       print RESOLV_CONF "nameserver $env->{ipv6}\n";
+       print RESOLV_CONF "nameserver $env->{SERVER_IP}\n";
+       print RESOLV_CONF "nameserver $env->{SERVER_IPV6}\n";
        close(RESOLV_CONF);
 
        # use a pipe for stdin in the child processes. This allows
@@ -420,6 +415,7 @@ sub setup_dns_hub_internal($$$)
                open STDOUT, "| tee $env->{DNS_HUB_LOG} 1>&2";
                open STDERR, '>&STDOUT';
 
+               my $swiface = Samba::get_interface($hostname);
                SocketWrapper::set_default_iface($swiface);
                my $pcap_file = "$ENV{SOCKET_WRAPPER_PCAP_DIR}/env-$hostname$.pcap";
                SocketWrapper::setup_pcap($pcap_file);
@@ -435,7 +431,8 @@ sub setup_dns_hub_internal($$$)
                }
                $ENV{MAKE_TEST_BINARY} = "$self->{srcdir}/selftest/target/dns_hub.py";
                push (@args, "$self->{server_maxtime}");
-               push (@args, "$env->{ipv4}");
+               push (@args, "$env->{SERVER_IP}");
+               push (@args, Samba::realm_to_ip_mappings());
                close($env->{STDIN_PIPE});
                open STDIN, ">&", $STDIN_READER or die "can't dup STDIN_READER to STDIN: $!";
 
@@ -443,7 +440,7 @@ sub setup_dns_hub_internal($$$)
                        or die("Unable to start $ENV{MAKE_TEST_BINARY}: $!");
        }
        $env->{SAMBA_PID} = $pid;
-       $env->{KRB5_CONFIG} = "${prefix_abs}/no_krb5.conf";
+       $env->{KRB5_CONFIG} = "$prefix_abs/no_krb5.conf";
        close($STDIN_READER);
 
        print "DONE\n";
@@ -673,9 +670,8 @@ sub provision_raw_prepare($$$$$$$$$$$$)
 
        $ctx->{tlsdir} = "$ctx->{privatedir}/tls";
 
-       $ctx->{ipv4} = "127.0.0.$swiface";
-       $ctx->{ipv6} = sprintf("fd00:0000:0000:0000:0000:0000:5357:5f%02x", $swiface);
-       $ctx->{interfaces} = "$ctx->{ipv4}/8 $ctx->{ipv6}/64";
+       $ctx->{ipv4} = Samba::get_ipv4_addr($hostname);
+       $ctx->{ipv6} = Samba::get_ipv6_addr($hostname);
 
        push(@{$ctx->{directories}}, $ctx->{privatedir});
        push(@{$ctx->{directories}}, $ctx->{binddnsdir});
@@ -783,6 +779,8 @@ sub provision_raw_step1($$)
                $services = "+smb -s3fs";
        }
 
+       my $interfaces = Samba::get_interfaces_config($ctx->{netbiosname});
+
        print CONFFILE "
 [global]
        netbios name = $ctx->{netbiosname}
@@ -799,7 +797,7 @@ sub provision_raw_step1($$)
        winbindd socket directory = $ctx->{winbindd_socket_dir}
        ntp signd socket directory = $ctx->{ntp_signd_socket_dir}
        winbind separator = /
-       interfaces = $ctx->{interfaces}
+       interfaces = $interfaces
        tls dh params file = $ctx->{tlsdir}/dhparms.pem
        tls crlfile = ${crlfile}
        tls verify peer = no_check
@@ -832,6 +830,7 @@ sub provision_raw_step1($$)
        winbind enum groups = yes
 
         rpc server port:netlogon = 1026
+       include system krb5 conf = no
 
 ";
 
@@ -999,6 +998,7 @@ sub provision_raw_step2($$$)
        $ldbmodify .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" ";
        $ldbmodify .= "KRB5CCNAME=\"$ret->{KRB5_CCACHE}\" ";
        $ldbmodify .= Samba::bindir_path($self, "ldbmodify");
+       $ldbmodify .=  " --configfile=$ctx->{smb_conf}";
        my $base_dn = "DC=".join(",DC=", split(/\./, $ctx->{realm}));
 
        if ($ctx->{server_role} ne "domain controller") {
@@ -1099,7 +1099,7 @@ servicePrincipalName: http/testupnspn.$ctx->{dnsname}
        $ldbmodify .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" ";
        $ldbmodify .= "KRB5CCNAME=\"$ret->{KRB5_CCACHE}\" ";
        $ldbmodify .= Samba::bindir_path($self, "ldbmodify");
-
+       $ldbmodify .=  " --configfile=$ctx->{smb_conf}";
        my $base_dn = "DC=".join(",DC=", split(/\./, $ctx->{realm}));
        my $user_dn = "cn=jane,cn=users,$base_dn";
 
@@ -1722,14 +1722,14 @@ sub provision_fl2000dc($$)
 sub provision_fl2003dc($$$)
 {
        my ($self, $prefix, $dcvars) = @_;
-       my $swiface1 = Samba::get_interface("fakednsforwarder1");
-       my $swiface2 = Samba::get_interface("fakednsforwarder2");
+       my $ip_addr1 = Samba::get_ipv4_addr("fakednsforwarder1");
+       my $ip_addr2 = Samba::get_ipv4_addr("fakednsforwarder2");
 
        print "PROVISIONING DC WITH FOREST LEVEL 2003...\n";
        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 = $ip_addr1 $ip_addr2";
        my $extra_provision_options = ["--use-ntvfs"];
        my $ret = $self->provision($prefix,
                                   "domain controller",
@@ -1747,8 +1747,8 @@ sub provision_fl2003dc($$$)
                return undef;
        }
 
-       $ret->{DNS_FORWARDER1} = "127.0.0.$swiface1";
-       $ret->{DNS_FORWARDER2} = "127.0.0.$swiface2";
+       $ret->{DNS_FORWARDER1} = $ip_addr1;
+       $ret->{DNS_FORWARDER2} = $ip_addr2;
 
        my @samba_tool_options;
        push (@samba_tool_options, Samba::bindir_path($self, "samba-tool"));
@@ -2263,10 +2263,20 @@ sub check_env($$)
 
        # aliases in order to split autbuild tasks
        fl2008dc             => ["ad_dc_ntvfs"],
+       ad_dc_default        => ["ad_dc_ntvfs"],
+       ad_dc_slowtests      => ["ad_dc_ntvfs"],
+       ad_dc_backup         => ["ad_dc"],
+
+       schema_dc      => ["dns_hub"],
+       schema_pair_dc => ["schema_dc"],
 
        none                 => [],
 );
 
+%Samba4::ENV_DEPS_POST = (
+       schema_dc => ["schema_pair_dc"],
+);
+
 sub return_alias_env
 {
        my ($self, $path, $env) = @_;
@@ -2281,6 +2291,24 @@ sub setup_fl2008dc
        return $self->return_alias_env($path, $dep_env)
 }
 
+sub setup_ad_dc_default
+{
+       my ($self, $path, $dep_env) = @_;
+       return $self->return_alias_env($path, $dep_env)
+}
+
+sub setup_ad_dc_slowtests
+{
+       my ($self, $path, $dep_env) = @_;
+       return $self->return_alias_env($path, $dep_env)
+}
+
+sub setup_ad_dc_backup
+{
+       my ($self, $path, $dep_env) = @_;
+       return $self->return_alias_env($path, $dep_env)
+}
+
 sub setup_s4member
 {
        my ($self, $path, $dc_vars) = @_;
@@ -2762,6 +2790,101 @@ sub setup_proclimitdc
        return $env;
 }
 
+# Used to test a live upgrade of the schema on a 2 DC network.
+sub setup_schema_dc
+{
+       my ($self, $path) = @_;
+
+       # provision the PDC using an older base schema
+       my $provision_args = ["--base-schema=2008_R2", "--backend-store=mdb"];
+
+       my $env = $self->provision_ad_dc($path, "liveupgrade1dc", "SCHEMADOMAIN",
+                                        "schema.samba.example.com",
+                                        "drs: max link sync = 2",
+                                        $provision_args);
+       unless ($env) {
+               return undef;
+       }
+
+       if (not defined($self->check_or_start($env, "prefork"))) {
+           return undef;
+       }
+
+       my $upn_array = ["$env->{REALM}.upn"];
+       my $spn_array = ["$env->{REALM}.spn"];
+
+       $self->setup_namespaces($env, $upn_array, $spn_array);
+
+       return $env;
+}
+
+# the second DC in the live schema upgrade pair
+sub setup_schema_pair_dc
+{
+       # note: dcvars contains the env info for the dependent testenv ('schema_dc')
+       my ($self, $prefix, $dcvars) = @_;
+       print "Preparing SCHEMA UPGRADE PAIR DC...\n";
+
+       my ($env, $ctx) = $self->prepare_dc_testenv($prefix, "liveupgrade2dc",
+                                                   $dcvars->{DOMAIN},
+                                                   $dcvars->{REALM},
+                                                   $dcvars->{PASSWORD},
+                                                   "");
+
+       my $samba_tool =  Samba::bindir_path($self, "samba-tool");
+       my $cmd_vars = "NSS_WRAPPER_HOSTS='$env->{NSS_WRAPPER_HOSTS}' ";
+       $cmd_vars .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$env->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
+       if (defined($env->{RESOLV_WRAPPER_CONF})) {
+               $cmd_vars .= "RESOLV_WRAPPER_CONF=\"$env->{RESOLV_WRAPPER_CONF}\" ";
+       } else {
+               $cmd_vars .= "RESOLV_WRAPPER_HOSTS=\"$env->{RESOLV_WRAPPER_HOSTS}\" ";
+       }
+       $cmd_vars .= "KRB5_CONFIG=\"$env->{KRB5_CONFIG}\" ";
+       $cmd_vars .= "KRB5CCNAME=\"$env->{KRB5_CCACHE}\" ";
+       $cmd_vars .= "RESOLV_CONF=\"$env->{RESOLV_CONF}\" ";
+
+       my $join_cmd = $cmd_vars;
+       $join_cmd .= "$samba_tool domain join $env->{CONFIGURATION} $dcvars->{REALM} DC --realm=$dcvars->{REALM}";
+       $join_cmd .= " -U$dcvars->{DC_USERNAME}\%$dcvars->{DC_PASSWORD} ";
+       $join_cmd .= " --backend-store=mdb";
+
+       my $upgrade_cmd = $cmd_vars;
+       $upgrade_cmd .= "$samba_tool domain schemaupgrade $dcvars->{CONFIGURATION}";
+       $upgrade_cmd .= " -U$dcvars->{USERNAME}\%$dcvars->{PASSWORD}";
+
+       my $repl_cmd = $cmd_vars;
+       $repl_cmd .= "$samba_tool drs replicate $env->{SERVER} $dcvars->{SERVER}";
+        $repl_cmd .= " CN=Schema,CN=Configuration,DC=schema,DC=samba,DC=example,DC=com";
+       $repl_cmd .= " -U$dcvars->{DC_USERNAME}\%$dcvars->{DC_PASSWORD}";
+
+       unless (system($join_cmd) == 0) {
+               warn("Join failed\n$join_cmd");
+               return undef;
+       }
+
+       $env->{DC_SERVER} = $dcvars->{SERVER};
+       $env->{DC_SERVER_IP} = $dcvars->{SERVER_IP};
+       $env->{DC_SERVER_IPV6} = $dcvars->{SERVER_IPV6};
+       $env->{DC_NETBIOSNAME} = $dcvars->{NETBIOSNAME};
+
+       # start samba for the new DC
+       if (not defined($self->check_or_start($env, "standard"))) {
+           return undef;
+       }
+
+       unless (system($upgrade_cmd) == 0) {
+               warn("Schema upgrade failed\n$upgrade_cmd");
+               return undef;
+       }
+
+       unless (system($repl_cmd) == 0) {
+               warn("Post-update schema replication failed\n$repl_cmd");
+               return undef;
+       }
+
+       return $env;
+}
+
 # Sets up a DC that's solely used to do a domain backup from. We then use the
 # backupfrom-DC to create the restore-DC - this proves that the backup/restore
 # process will create a Samba DC that will actually start up.