selftest: Wait for the logon server to register to join the member.
[obnox/samba/samba-obnox.git] / selftest / target / Samba3.pm
index 9606d5b09a5fe5249b9372ad58015c9c8cf7e150..4c9124df25786fb7996e85dcac096f45fe486936 100755 (executable)
@@ -229,6 +229,7 @@ sub setup_s3dc($$)
 
        $vars->{DC_SERVER} = $vars->{SERVER};
        $vars->{DC_SERVER_IP} = $vars->{SERVER_IP};
+       $vars->{DC_SERVER_IPV6} = $vars->{SERVER_IPV6};
        $vars->{DC_NETBIOSNAME} = $vars->{NETBIOSNAME};
        $vars->{DC_USERNAME} = $vars->{USERNAME};
        $vars->{DC_PASSWORD} = $vars->{PASSWORD};
@@ -241,12 +242,15 @@ sub setup_s3dc($$)
 sub setup_member($$$)
 {
        my ($self, $prefix, $s3dcvars) = @_;
+       my $count = 0;
+       my $rc;
 
        print "PROVISIONING MEMBER...";
 
        my $member_options = "
        security = domain
        server signing = on
+       dbwrap_tdb_mutexes:* = yes
 ";
        my $ret = $self->provision($prefix,
                                   "LOCALMEMBER3",
@@ -255,6 +259,21 @@ sub setup_member($$$)
 
        $ret or return undef;
 
+       my $nmblookup = Samba::bindir_path($self, "nmblookup");
+       do {
+               print "Waiting for the LOGON SERVER registration ...\n";
+               $rc = system("$nmblookup $ret->{CONFIGURATION} $ret->{DOMAIN}\#1c");
+               if ($rc != 0) {
+                       sleep(1);
+               }
+               $count++;
+       } while ($rc != 0 && $count < 10);
+       if ($count == 10) {
+               print "NMBD not reachable after 10 retries\n";
+               teardown_env($self, $ret);
+               return 0;
+       }
+
        my $net = Samba::bindir_path($self, "net");
        my $cmd = "";
        $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
@@ -272,6 +291,7 @@ sub setup_member($$$)
 
        $ret->{DC_SERVER} = $s3dcvars->{SERVER};
        $ret->{DC_SERVER_IP} = $s3dcvars->{SERVER_IP};
+       $ret->{DC_SERVER_IPV6} = $s3dcvars->{SERVER_IPV6};
        $ret->{DC_NETBIOSNAME} = $s3dcvars->{NETBIOSNAME};
        $ret->{DC_USERNAME} = $s3dcvars->{USERNAME};
        $ret->{DC_PASSWORD} = $s3dcvars->{PASSWORD};
@@ -343,6 +363,7 @@ sub setup_admember($$$$)
 
        $ret->{DC_SERVER} = $dcvars->{SERVER};
        $ret->{DC_SERVER_IP} = $dcvars->{SERVER_IP};
+       $ret->{DC_SERVER_IPV6} = $dcvars->{SERVER_IPV6};
        $ret->{DC_NETBIOSNAME} = $dcvars->{NETBIOSNAME};
        $ret->{DC_USERNAME} = $dcvars->{USERNAME};
        $ret->{DC_PASSWORD} = $dcvars->{PASSWORD};
@@ -422,6 +443,7 @@ sub setup_admember_rfc2307($$$$)
 
        $ret->{DC_SERVER} = $dcvars->{SERVER};
        $ret->{DC_SERVER_IP} = $dcvars->{SERVER_IP};
+       $ret->{DC_SERVER_IPV6} = $dcvars->{SERVER_IPV6};
        $ret->{DC_NETBIOSNAME} = $dcvars->{NETBIOSNAME};
        $ret->{DC_USERNAME} = $dcvars->{USERNAME};
        $ret->{DC_PASSWORD} = $dcvars->{PASSWORD};
@@ -642,6 +664,7 @@ sub check_or_start($$$$$) {
                $ENV{NSS_WRAPPER_PASSWD} = $env_vars->{NSS_WRAPPER_PASSWD};
                $ENV{NSS_WRAPPER_GROUP} = $env_vars->{NSS_WRAPPER_GROUP};
                $ENV{NSS_WRAPPER_HOSTS} = $env_vars->{NSS_WRAPPER_HOSTS};
+               $ENV{NSS_WRAPPER_HOSTNAME} = $env_vars->{NSS_WRAPPER_HOSTNAME};
                $ENV{NSS_WRAPPER_MODULE_SO_PATH} = $env_vars->{NSS_WRAPPER_MODULE_SO_PATH};
                $ENV{NSS_WRAPPER_MODULE_FN_PREFIX} = $env_vars->{NSS_WRAPPER_MODULE_FN_PREFIX};
 
@@ -699,6 +722,7 @@ sub check_or_start($$$$$) {
                $ENV{NSS_WRAPPER_PASSWD} = $env_vars->{NSS_WRAPPER_PASSWD};
                $ENV{NSS_WRAPPER_GROUP} = $env_vars->{NSS_WRAPPER_GROUP};
                $ENV{NSS_WRAPPER_HOSTS} = $env_vars->{NSS_WRAPPER_HOSTS};
+               $ENV{NSS_WRAPPER_HOSTNAME} = $env_vars->{NSS_WRAPPER_HOSTNAME};
                $ENV{NSS_WRAPPER_MODULE_SO_PATH} = $env_vars->{NSS_WRAPPER_MODULE_SO_PATH};
                $ENV{NSS_WRAPPER_MODULE_FN_PREFIX} = $env_vars->{NSS_WRAPPER_MODULE_FN_PREFIX};
 
@@ -756,6 +780,7 @@ sub check_or_start($$$$$) {
                $ENV{NSS_WRAPPER_PASSWD} = $env_vars->{NSS_WRAPPER_PASSWD};
                $ENV{NSS_WRAPPER_GROUP} = $env_vars->{NSS_WRAPPER_GROUP};
                $ENV{NSS_WRAPPER_HOSTS} = $env_vars->{NSS_WRAPPER_HOSTS};
+               $ENV{NSS_WRAPPER_HOSTNAME} = $env_vars->{NSS_WRAPPER_HOSTNAME};
                $ENV{NSS_WRAPPER_MODULE_SO_PATH} = $env_vars->{NSS_WRAPPER_MODULE_SO_PATH};
                $ENV{NSS_WRAPPER_MODULE_FN_PREFIX} = $env_vars->{NSS_WRAPPER_MODULE_FN_PREFIX};
 
@@ -813,6 +838,7 @@ sub provision($$$$$$)
        my $swiface = Samba::get_interface($server);
        my %ret = ();
        my $server_ip = "127.0.0.$swiface";
+       my $server_ipv6 = sprintf("fd00:0000:0000:0000:0000:0000:5357:5f%02x", $swiface);
        my $domain = "SAMBA-TEST";
 
        my $unix_name = ($ENV{USER} or $ENV{LOGNAME} or `PATH=/usr/ucb:$ENV{PATH} whoami`);
@@ -867,6 +893,15 @@ sub provision($$$$$$)
        my $msdfs_deeppath="$msdfs_shrdir/deeppath";
        push(@dirs,$msdfs_deeppath);
 
+       my $badnames_shrdir="$shrdir/badnames";
+       push(@dirs,$badnames_shrdir);
+
+       my $lease1_shrdir="$shrdir/SMB2_10";
+       push(@dirs,$lease1_shrdir);
+
+       my $lease2_shrdir="$shrdir/SMB3_00";
+       push(@dirs,$lease2_shrdir);
+
        # this gets autocreated by winbindd
        my $wbsockdir="$prefix_abs/winbindd";
        my $wbsockprivdir="$lockdir/winbindd_privileged";
@@ -874,8 +909,6 @@ sub provision($$$$$$)
        my $nmbdsockdir="$prefix_abs/nmbd";
        unlink($nmbdsockdir);
 
-       my $fs_specific_conf = $self->get_fs_specific_conf($shrdir);
-
        ## 
        ## create the test directory layout
        ##
@@ -889,6 +922,8 @@ sub provision($$$$$$)
        }
        mkdir($_, 0777) foreach(@dirs);
 
+       my $fs_specific_conf = $self->get_fs_specific_conf($shrdir);
+
        ##
        ## lockdir and piddir must be 0755
        ##
@@ -917,7 +952,37 @@ sub provision($$$$$$)
        close(MSDFS_TARGET);
        chmod 0666, $msdfs_target;
        symlink "msdfs:$server_ip\\ro-tmp", "$msdfs_shrdir/msdfs-src1";
-       symlink "msdfs:$server_ip\\ro-tmp", "$msdfs_shrdir/deeppath/msdfs-src2";
+       symlink "msdfs:$server_ipv6\\ro-tmp", "$msdfs_shrdir/deeppath/msdfs-src2";
+
+       ##
+       ## create bad names in $badnames_shrdir
+       ##
+       ## (An invalid name, would be mangled to 8.3).
+        my $badname_target = "$badnames_shrdir/\340|\231\216\377\177";
+        unless (open(BADNAME_TARGET, ">$badname_target")) {
+                warn("Unable to open $badname_target");
+                return undef;
+        }
+        close(BADNAME_TARGET);
+        chmod 0666, $badname_target;
+
+       ## (A bad name, would not be mangled to 8.3).
+        my $badname_target = "$badnames_shrdir/\240\276\346\327\377\177";
+        unless (open(BADNAME_TARGET, ">$badname_target")) {
+                warn("Unable to open $badname_target");
+                return undef;
+        }
+        close(BADNAME_TARGET);
+        chmod 0666, $badname_target;
+
+       ## (A bad good name).
+        my $badname_target = "$badnames_shrdir/blank.txt";
+        unless (open(BADNAME_TARGET, ">$badname_target")) {
+                warn("Unable to open $badname_target");
+                return undef;
+        }
+        close(BADNAME_TARGET);
+        chmod 0666, $badname_target;
 
        my $conffile="$libdir/server.conf";
 
@@ -935,10 +1000,10 @@ sub provision($$$$$$)
        ##
 
        my ($max_uid, $max_gid);
-       my ($uid_nobody, $uid_root, $uid_pdbtest);
+       my ($uid_nobody, $uid_root, $uid_pdbtest, $uid_pdbtest2);
        my ($gid_nobody, $gid_nogroup, $gid_root, $gid_domusers, $gid_domadmins);
 
-       if ($unix_uid < 0xffff - 2) {
+       if ($unix_uid < 0xffff - 4) {
                $max_uid = 0xffff;
        } else {
                $max_uid = $unix_uid;
@@ -947,8 +1012,9 @@ sub provision($$$$$$)
        $uid_root = $max_uid - 1;
        $uid_nobody = $max_uid - 2;
        $uid_pdbtest = $max_uid - 3;
+       $uid_pdbtest2 = $max_uid - 4;
 
-       if ($unix_gids[0] < 0xffff - 3) {
+       if ($unix_gids[0] < 0xffff - 5) {
                $max_gid = 0xffff;
        } else {
                $max_gid = $unix_gids[0];
@@ -971,7 +1037,7 @@ sub provision($$$$$$)
        print CONF "
 [global]
        netbios name = $server
-       interfaces = $server_ip/8
+       interfaces = $server_ip/8 $server_ipv6/64
        bind interfaces only = yes
        panic action = cd $self->{srcdir} && $self->{srcdir}/selftest/gdb_backtrace %d %\$(MAKE_TEST_BINARY)
        smbd:suicide mode = yes
@@ -1008,6 +1074,7 @@ sub provision($$$$$$)
 
        kernel oplocks = no
        kernel change notify = no
+       smb2 leases = yes
 
        syslog = no
        printing = bsd
@@ -1018,6 +1085,7 @@ sub provision($$$$$$)
        idmap config * : range = 100000-200000
        winbind enum users = yes
        winbind enum groups = yes
+       winbind separator = /
 
 #      min receivefile size = 4000
 
@@ -1032,6 +1100,7 @@ sub provision($$$$$$)
        store dos attributes = yes
        create mask = 755
        dos filemode = yes
+       strict rename = yes
        vfs objects = acl_xattr fake_acls xattr_tdb streams_depot
 
        printing = vlp
@@ -1166,6 +1235,22 @@ sub provision($$$$$$)
 
 [print\$]
        copy = tmp
+
+[vfs_fruit]
+       path = $shrdir
+       vfs objects = catia fruit streams_xattr
+       fruit:ressource = file
+       fruit:metadata = netatalk
+       fruit:locking = netatalk
+       fruit:encoding = native
+
+[badname-tmp]
+       path = $badnames_shrdir
+       guest ok = yes
+
+[dynamic_share]
+       path = $shrdir/%R
+       guest ok = yes
        ";
        close(CONF);
 
@@ -1180,6 +1265,7 @@ sub provision($$$$$$)
        print PASSWD "nobody:x:$uid_nobody:$gid_nobody:nobody gecos:$prefix_abs:/bin/false
 $unix_name:x:$unix_uid:$unix_gids[0]:$unix_name gecos:$prefix_abs:/bin/false
 pdbtest:x:$uid_pdbtest:$gid_nogroup:pdbtest gecos:$prefix_abs:/bin/false
+pdbtest2:x:$uid_pdbtest2:$gid_nogroup:pdbtest gecos:$prefix_abs:/bin/false
 ";
        if ($unix_uid != 0) {
                print PASSWD "root:x:$uid_root:$gid_root:root gecos:$prefix_abs:/bin/false
@@ -1210,8 +1296,8 @@ domadmins:X:$gid_domadmins:
                warn("Unable to open $nss_wrapper_hosts");
                return undef;
        }
-       print HOSTS "${server_ip} ${hostname}.samba.example.com ${hostname}
-";
+       print HOSTS "${server_ip} ${hostname}.samba.example.com ${hostname}\n";
+       print HOSTS "${server_ipv6} ${hostname}.samba.example.com ${hostname}\n";
        close(HOSTS);
 
 
@@ -1224,6 +1310,7 @@ domadmins:X:$gid_domadmins:
        $ENV{NSS_WRAPPER_PASSWD} = $nss_wrapper_passwd;
        $ENV{NSS_WRAPPER_GROUP} = $nss_wrapper_group;
        $ENV{NSS_WRAPPER_HOSTS} = $nss_wrapper_hosts;
+       $ENV{NSS_WRAPPER_HOSTNAME} = "${hostname}.samba.example.com";
 
         my $cmd = "UID_WRAPPER_ROOT=1 " . Samba::bindir_path($self, "smbpasswd")." -c $conffile -L -s -a $unix_name > /dev/null";
        unless (open(PWD, "|$cmd")) {
@@ -1238,14 +1325,16 @@ domadmins:X:$gid_domadmins:
        print "DONE\n";
 
        open(DNS_UPDATE_LIST, ">$prefix/dns_update_list") or die("Unable to open $$prefix/dns_update_list");
-       print DNS_UPDATE_LIST "A $server. $server_ip";
+       print DNS_UPDATE_LIST "A $server. $server_ip\n";
+       print DNS_UPDATE_LIST "AAAA $server. $server_ipv6\n";
        close(DNS_UPDATE_LIST);
 
-        if (system("$ENV{SRCDIR_ABS}/source4/scripting/bin/samba_dnsupdate --all-interfaces --use-file=$dns_host_file -s $conffile --update-list=$prefix/dns_update_list --no-substiutions --no-credentials") != 0) {
+        if (system("$ENV{SRCDIR_ABS}/source4/scripting/bin/samba_dnsupdate --all-interfaces --use-file=$dns_host_file -s $conffile --update-list=$prefix/dns_update_list --update-cache=$prefix/dns_update_cache --no-substiutions --no-credentials") != 0) {
                 die "Unable to update hostname into $dns_host_file";
         }
 
        $ret{SERVER_IP} = $server_ip;
+       $ret{SERVER_IPV6} = $server_ipv6;
        $ret{NMBD_TEST_LOG} = "$prefix/nmbd_test.log";
        $ret{NMBD_TEST_LOG_POS} = 0;
        $ret{WINBINDD_TEST_LOG} = "$prefix/winbindd_test.log";
@@ -1268,6 +1357,7 @@ domadmins:X:$gid_domadmins:
        $ret{NSS_WRAPPER_PASSWD} = $nss_wrapper_passwd;
        $ret{NSS_WRAPPER_GROUP} = $nss_wrapper_group;
        $ret{NSS_WRAPPER_HOSTS} = $nss_wrapper_hosts;
+       $ret{NSS_WRAPPER_HOSTNAME} = "${hostname}.samba.example.com";
        $ret{NSS_WRAPPER_MODULE_SO_PATH} = Samba::nss_wrapper_winbind_so_path($self);
        $ret{NSS_WRAPPER_MODULE_FN_PREFIX} = "winbind";
        $ret{LOCAL_PATH} = "$shrdir";
@@ -1282,23 +1372,38 @@ sub wait_for_start($$$$$)
        my $ret;
 
        if ($nmbd eq "yes") {
-           # give time for nbt server to register its names
-           print "delaying for nbt name registration\n";
-           sleep(10);
-           # This will return quickly when things are up, but be slow if we need to wait for (eg) SSL init 
-           my $nmblookup = Samba::bindir_path($self, "nmblookup3");
-           system("$nmblookup $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} __SAMBA__");
-           system("$nmblookup $envvars->{CONFIGURATION} __SAMBA__");
-           system("$nmblookup $envvars->{CONFIGURATION} -U 127.255.255.255 __SAMBA__");
-           system("$nmblookup $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} $envvars->{SERVER}");
-           system("$nmblookup $envvars->{CONFIGURATION} $envvars->{SERVER}");
+               my $count = 0;
+
+               # give time for nbt server to register its names
+               print "checking for nmbd\n";
+
+               # This will return quickly when things are up, but be slow if we need to wait for (eg) SSL init
+               my $nmblookup = Samba::bindir_path($self, "nmblookup");
+
+               do {
+                       $ret = system("$nmblookup $envvars->{CONFIGURATION} $envvars->{SERVER}");
+                       if ($ret != 0) {
+                               sleep(1);
+                       } else {
+                               system("$nmblookup $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} __SAMBA__");
+                               system("$nmblookup $envvars->{CONFIGURATION} __SAMBA__");
+                               system("$nmblookup $envvars->{CONFIGURATION} -U 127.255.255.255 __SAMBA__");
+                               system("$nmblookup $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} $envvars->{SERVER}");
+                       }
+                       $count++;
+               } while ($ret != 0 && $count < 10);
+               if ($count == 10) {
+                       print "NMBD not reachable after 10 retries\n";
+                       teardown_env($self, $envvars);
+                       return 0;
+               }
        }
 
        if ($winbindd eq "yes") {
            print "checking for winbindd\n";
            my $count = 0;
            do {
-               $ret = system("SELFTEST_WINBINDD_SOCKET_DIR=" . $envvars->{SELFTEST_WINBINDD_SOCKET_DIR} . " " . Samba::bindir_path($self, "wbinfo") . " -p");
+               $ret = system("SELFTEST_WINBINDD_SOCKET_DIR=" . $envvars->{SELFTEST_WINBINDD_SOCKET_DIR} . " " . Samba::bindir_path($self, "wbinfo") . " --ping-dc");
                if ($ret != 0) {
                    sleep(2);
                }