2 # Bootstrap Samba and run a number of tests against it.
3 # Copyright (C) 2005-2007 Jelmer Vernooij <jelmer@samba.org>
4 # Published under the GNU GPL, v3 or later.
10 use FindBin qw($RealBin);
17 my $smbd_build_options = Samba::bindir_path($self, "smbd") . " -b|";
18 open(IN, $smbd_build_options) or die("Unable to run $smbd_build_options: $!");
27 # If we were not built with ADS support, pretend we were never even available
32 my ($classname, $bindir, $binary_mapping, $srcdir, $server_maxtime) = @_;
33 my $self = { vars => {},
35 binary_mapping => $binary_mapping,
37 server_maxtime => $server_maxtime
45 my ($self, $envvars) = @_;
48 # This should cause smbd to terminate gracefully
49 close($envvars->{STDIN_PIPE});
51 my $smbdpid = $envvars->{SMBD_TL_PID};
52 my $nmbdpid = $envvars->{NMBD_TL_PID};
53 my $winbinddpid = $envvars->{WINBINDD_TL_PID};
55 # This should give it time to write out the gcov data
57 my $smbdchild = Samba::cleanup_child($smbdpid, "smbd");
58 my $nmbdchild = Samba::cleanup_child($nmbdpid, "nmbd");
59 my $winbinddchild = Samba::cleanup_child($winbinddpid, "winbindd");
62 && $winbinddchild == -1) {
69 if ($count <= 20 && kill(0, $smbdpid, $nmbdpid, $winbinddpid) == 0) {
73 $self->stop_sig_term($smbdpid);
74 $self->stop_sig_term($nmbdpid);
75 $self->stop_sig_term($winbinddpid);
79 my $smbdchild = Samba::cleanup_child($smbdpid, "smbd");
80 my $nmbdchild = Samba::cleanup_child($nmbdpid, "nmbd");
81 my $winbinddchild = Samba::cleanup_child($winbinddpid, "winbindd");
84 && $winbinddchild == -1) {
91 if ($count <= 10 && kill(0, $smbdpid, $nmbdpid, $winbinddpid) == 0) {
95 warn("timelimit process did not quit on SIGTERM, sending SIGKILL");
96 $self->stop_sig_kill($smbdpid);
97 $self->stop_sig_kill($nmbdpid);
98 $self->stop_sig_kill($winbinddpid);
103 sub getlog_env_app($$$)
105 my ($self, $envvars, $name) = @_;
107 my $title = "$name LOG of: $envvars->{NETBIOSNAME}\n";
110 open(LOG, "<".$envvars->{$name."_TEST_LOG"});
112 seek(LOG, $envvars->{$name."_TEST_LOG_POS"}, SEEK_SET);
116 $envvars->{$name."_TEST_LOG_POS"} = tell(LOG);
119 return "" if $out eq $title;
126 my ($self, $envvars) = @_;
129 $ret .= $self->getlog_env_app($envvars, "SMBD");
130 $ret .= $self->getlog_env_app($envvars, "NMBD");
131 $ret .= $self->getlog_env_app($envvars, "WINBINDD");
138 my ($self, $envvars) = @_;
140 my $childpid = waitpid(-1, WNOHANG);
148 my ($self, $envname, $path) = @_;
150 if (defined($self->{vars}->{$envname})) {
151 return $self->{vars}->{$envname};
154 if ($envname eq "s3dc") {
155 return $self->setup_s3dc("$path/s3dc");
156 } elsif ($envname eq "secshare") {
157 return $self->setup_secshare("$path/secshare");
158 } elsif ($envname eq "maptoguest") {
159 return $self->setup_maptoguest("$path/maptoguest");
160 } elsif ($envname eq "ktest") {
161 return $self->setup_ktest("$path/ktest");
162 } elsif ($envname eq "secserver") {
163 if (not defined($self->{vars}->{s3dc})) {
164 if (not defined($self->setup_s3dc("$path/s3dc"))) {
168 return $self->setup_secserver("$path/secserver", $self->{vars}->{s3dc});
169 } elsif ($envname eq "member") {
170 if (not defined($self->{vars}->{s3dc})) {
171 if (not defined($self->setup_s3dc("$path/s3dc"))) {
175 return $self->setup_member("$path/member", $self->{vars}->{s3dc});
183 my ($self, $path) = @_;
185 print "PROVISIONING S3DC...";
193 my $vars = $self->provision($path,
198 $vars or return undef;
200 $self->check_or_start($vars,
201 "yes", "yes", "yes");
203 if (not $self->wait_for_start($vars)) {
207 $vars->{DC_SERVER} = $vars->{SERVER};
208 $vars->{DC_SERVER_IP} = $vars->{SERVER_IP};
209 $vars->{DC_NETBIOSNAME} = $vars->{NETBIOSNAME};
210 $vars->{DC_USERNAME} = $vars->{USERNAME};
211 $vars->{DC_PASSWORD} = $vars->{PASSWORD};
213 $self->{vars}->{s3dc} = $vars;
218 sub setup_member($$$)
220 my ($self, $prefix, $s3dcvars) = @_;
222 print "PROVISIONING MEMBER...";
224 my $member_options = "
228 my $ret = $self->provision($prefix,
233 $ret or return undef;
235 my $net = Samba::bindir_path($self, "net");
237 $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
238 $cmd .= "$net join $ret->{CONFIGURATION} $s3dcvars->{DOMAIN} member";
239 $cmd .= " -U$s3dcvars->{USERNAME}\%$s3dcvars->{PASSWORD}";
241 if (system($cmd) != 0) {
242 warn("Join failed\n$cmd");
246 $self->check_or_start($ret, "yes", "yes", "yes");
248 if (not $self->wait_for_start($ret)) {
252 $ret->{DC_SERVER} = $s3dcvars->{SERVER};
253 $ret->{DC_SERVER_IP} = $s3dcvars->{SERVER_IP};
254 $ret->{DC_NETBIOSNAME} = $s3dcvars->{NETBIOSNAME};
255 $ret->{DC_USERNAME} = $s3dcvars->{USERNAME};
256 $ret->{DC_PASSWORD} = $s3dcvars->{PASSWORD};
261 sub setup_admember($$$$)
263 my ($self, $prefix, $dcvars) = @_;
265 # If we didn't build with ADS, pretend this env was never available
266 if (not $self->have_ads()) {
270 print "PROVISIONING S3 AD MEMBER...";
272 my $member_options = "
275 workgroup = $dcvars->{DOMAIN}
276 realm = $dcvars->{REALM}
279 my $ret = $self->provision($prefix,
284 $ret or return undef;
287 $ret->{DOMAIN} = $dcvars->{DOMAIN};
288 $ret->{REALM} = $dcvars->{REALM};
291 my $prefix_abs = abs_path($prefix);
293 $ctx->{krb5_conf} = "$prefix_abs/lib/krb5.conf";
294 $ctx->{domain} = $dcvars->{DOMAIN};
295 $ctx->{realm} = $dcvars->{REALM};
296 $ctx->{dnsname} = lc($dcvars->{REALM});
297 $ctx->{kdc_ipv4} = $dcvars->{SERVER_IP};
298 Samba::mk_krb5_conf($ctx, "");
300 $ret->{KRB5_CONFIG} = $ctx->{krb5_conf};
302 my $net = Samba::bindir_path($self, "net");
304 $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
305 $cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" ";
306 $cmd .= "$net join $ret->{CONFIGURATION}";
307 $cmd .= " -U$dcvars->{USERNAME}\%$dcvars->{PASSWORD}";
309 if (system($cmd) != 0) {
310 warn("Join failed\n$cmd");
314 # We need world access to this share, as otherwise the domain
315 # administrator from the AD domain provided by Samba4 can't
316 # access the share for tests.
317 chmod 0777, "$prefix/share";
319 $self->check_or_start($ret,
320 "yes", "yes", "yes");
322 $self->wait_for_start($ret);
324 $ret->{DC_SERVER} = $dcvars->{SERVER};
325 $ret->{DC_SERVER_IP} = $dcvars->{SERVER_IP};
326 $ret->{DC_NETBIOSNAME} = $dcvars->{NETBIOSNAME};
327 $ret->{DC_USERNAME} = $dcvars->{USERNAME};
328 $ret->{DC_PASSWORD} = $dcvars->{PASSWORD};
330 # Special case, this is called from Samba4.pm but needs to use the Samba3 check_env and get_log_env
331 $ret->{target} = $self;
336 sub setup_secshare($$)
338 my ($self, $path) = @_;
340 print "PROVISIONING server with security=share...";
342 my $secshare_options = "
347 my $vars = $self->provision($path,
352 $vars or return undef;
354 $self->check_or_start($vars, "yes", "no", "yes");
356 if (not $self->wait_for_start($vars)) {
360 $self->{vars}->{secshare} = $vars;
365 sub setup_secserver($$$)
367 my ($self, $prefix, $s3dcvars) = @_;
369 print "PROVISIONING server with security=server...";
371 my $secserver_options = "
373 password server = $s3dcvars->{SERVER_IP}
376 my $ret = $self->provision($prefix,
381 $ret or return undef;
383 $self->check_or_start($ret, "yes", "no", "yes");
385 if (not $self->wait_for_start($ret)) {
389 $ret->{DC_SERVER} = $s3dcvars->{SERVER};
390 $ret->{DC_SERVER_IP} = $s3dcvars->{SERVER_IP};
391 $ret->{DC_NETBIOSNAME} = $s3dcvars->{NETBIOSNAME};
392 $ret->{DC_USERNAME} = $s3dcvars->{USERNAME};
393 $ret->{DC_PASSWORD} = $s3dcvars->{PASSWORD};
400 my ($self, $prefix) = @_;
402 # If we didn't build with ADS, pretend this env was never available
403 if (not $self->have_ads()) {
407 print "PROVISIONING server with security=ads...";
409 my $ktest_options = "
411 realm = ktest.samba.example.com
413 username map = $prefix/lib/username.map
414 server signing = required
417 my $ret = $self->provision($prefix,
422 $ret or return undef;
425 my $prefix_abs = abs_path($prefix);
427 $ctx->{krb5_conf} = "$prefix_abs/lib/krb5.conf";
428 $ctx->{domain} = "KTEST";
429 $ctx->{realm} = "KTEST.SAMBA.EXAMPLE.COM";
430 $ctx->{dnsname} = lc($ctx->{realm});
431 $ctx->{kdc_ipv4} = "0.0.0.0";
432 Samba::mk_krb5_conf($ctx, "");
434 $ret->{KRB5_CONFIG} = $ctx->{krb5_conf};
436 open(USERMAP, ">$prefix/lib/username.map") or die("Unable to open $prefix/lib/username.map");
438 $ret->{USERNAME} = KTEST\\Administrator
442 #This is the secrets.tdb created by 'net ads join' from Samba3 to a
443 #Samba4 DC with the same parameters as are being used here. The
444 #domain SID is S-1-5-21-1071277805-689288055-3486227160
446 system("cp $self->{srcdir}/source3/selftest/ktest-secrets.tdb $prefix/private/secrets.tdb");
447 chmod 0600, "$prefix/private/secrets.tdb";
449 #This uses a pre-calculated krb5 credentials cache, obtained by running Samba4 with:
450 # "--option=kdc:service ticket lifetime=239232" "--option=kdc:user ticket lifetime=239232" "--option=kdc:renewal lifetime=239232"
452 #and having in krb5.conf:
453 # ticket_lifetime = 799718400
454 # renew_lifetime = 799718400
456 # The commands for the -2 keytab where were:
457 # kinit administrator@KTEST.SAMBA.EXAMPLE.COM
458 # kvno host/localktest6@KTEST.SAMBA.EXAMPLE.COM
459 # kvno cifs/localktest6@KTEST.SAMBA.EXAMPLE.COM
460 # kvno host/LOCALKTEST6@KTEST.SAMBA.EXAMPLE.COM
461 # kvno cifs/LOCALKTEST6@KTEST.SAMBA.EXAMPLE.COM
463 # and then for the -3 keytab, I did
465 # net changetrustpw; kdestroy and the same again.
467 # This creates a credential cache with a very long lifetime (2036 at
468 # at 2011-04), and shows that running 'net changetrustpw' does not
469 # break existing logins (for the secrets.tdb method at least).
472 $ret->{KRB5_CCACHE}="FILE:$prefix/krb5_ccache";
474 system("cp $self->{srcdir}/source3/selftest/ktest-krb5_ccache-2 $prefix/krb5_ccache-2");
475 chmod 0600, "$prefix/krb5_ccache-2";
477 system("cp $self->{srcdir}/source3/selftest/ktest-krb5_ccache-3 $prefix/krb5_ccache-3");
478 chmod 0600, "$prefix/krb5_ccache-3";
480 # We need world access to this share, as otherwise the domain
481 # administrator from the AD domain provided by ktest can't
482 # access the share for tests.
483 chmod 0777, "$prefix/share";
485 $self->check_or_start($ret, "yes", "no", "yes");
487 if (not $self->wait_for_start($ret)) {
493 sub setup_maptoguest($$)
495 my ($self, $path) = @_;
497 print "PROVISIONING maptoguest...";
500 map to guest = bad user
503 my $vars = $self->provision($path,
508 $vars or return undef;
510 $self->check_or_start($vars,
513 if (not $self->wait_for_start($vars)) {
517 $self->{vars}->{s3maptoguest} = $vars;
522 sub stop_sig_term($$) {
523 my ($self, $pid) = @_;
524 kill("USR1", $pid) or kill("ALRM", $pid) or warn("Unable to kill $pid: $!");
527 sub stop_sig_kill($$) {
528 my ($self, $pid) = @_;
529 kill("ALRM", $pid) or warn("Unable to kill $pid: $!");
534 my ($env_vars, $app, $pid) = @_;
536 open(PID, ">$env_vars->{PIDDIR}/timelimit.$app.pid");
543 my ($env_vars, $app) = @_;
545 open(PID, "<$env_vars->{PIDDIR}/timelimit.$app.pid");
551 sub check_or_start($$$$$) {
552 my ($self, $env_vars, $nmbd, $winbindd, $smbd) = @_;
554 # use a pipe for stdin in the child processes. This allows
555 # those processes to monitor the pipe for EOF to ensure they
556 # exit when the test script exits
557 pipe(STDIN_READER, $env_vars->{STDIN_PIPE});
559 unlink($env_vars->{NMBD_TEST_LOG});
560 print "STARTING NMBD...";
563 open STDOUT, ">$env_vars->{NMBD_TEST_LOG}";
564 open STDERR, '>&STDOUT';
566 SocketWrapper::set_default_iface($env_vars->{SOCKET_WRAPPER_DEFAULT_IFACE});
568 $ENV{KRB5_CONFIG} = $env_vars->{KRB5_CONFIG};
569 $ENV{WINBINDD_SOCKET_DIR} = $env_vars->{WINBINDD_SOCKET_DIR};
570 $ENV{NMBD_SOCKET_DIR} = $env_vars->{NMBD_SOCKET_DIR};
572 $ENV{NSS_WRAPPER_PASSWD} = $env_vars->{NSS_WRAPPER_PASSWD};
573 $ENV{NSS_WRAPPER_GROUP} = $env_vars->{NSS_WRAPPER_GROUP};
574 $ENV{NSS_WRAPPER_WINBIND_SO_PATH} = $env_vars->{NSS_WRAPPER_WINBIND_SO_PATH};
576 $ENV{UID_WRAPPER} = "1";
578 if ($nmbd ne "yes") {
579 $SIG{USR1} = $SIG{ALRM} = $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub {
581 print("Skip nmbd received signal $signame");
584 sleep($self->{server_maxtime});
588 my @optargs = ("-d0");
589 if (defined($ENV{NMBD_OPTIONS})) {
590 @optargs = split(/ /, $ENV{NMBD_OPTIONS});
593 $ENV{MAKE_TEST_BINARY} = Samba::bindir_path($self, "nmbd");
595 my @preargs = (Samba::bindir_path($self, "timelimit"), $self->{server_maxtime});
596 if(defined($ENV{NMBD_VALGRIND})) {
597 @preargs = split(/ /, $ENV{NMBD_VALGRIND});
600 close($env_vars->{STDIN_PIPE});
601 open STDIN, ">&", \*STDIN_READER or die "can't dup STDIN_READER to STDIN: $!";
603 exec(@preargs, Samba::bindir_path($self, "nmbd"), "-F", "--no-process-group", "--log-stdout", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start nmbd: $!");
605 $env_vars->{NMBD_TL_PID} = $pid;
606 write_pid($env_vars, "nmbd", $pid);
609 unlink($env_vars->{WINBINDD_TEST_LOG});
610 print "STARTING WINBINDD...";
613 open STDOUT, ">$env_vars->{WINBINDD_TEST_LOG}";
614 open STDERR, '>&STDOUT';
616 SocketWrapper::set_default_iface($env_vars->{SOCKET_WRAPPER_DEFAULT_IFACE});
618 $ENV{KRB5_CONFIG} = $env_vars->{KRB5_CONFIG};
619 $ENV{WINBINDD_SOCKET_DIR} = $env_vars->{WINBINDD_SOCKET_DIR};
620 $ENV{NMBD_SOCKET_DIR} = $env_vars->{NMBD_SOCKET_DIR};
622 $ENV{NSS_WRAPPER_PASSWD} = $env_vars->{NSS_WRAPPER_PASSWD};
623 $ENV{NSS_WRAPPER_GROUP} = $env_vars->{NSS_WRAPPER_GROUP};
624 $ENV{NSS_WRAPPER_WINBIND_SO_PATH} = $env_vars->{NSS_WRAPPER_WINBIND_SO_PATH};
626 $ENV{UID_WRAPPER} = "1";
628 if ($winbindd ne "yes") {
629 $SIG{USR1} = $SIG{ALRM} = $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub {
631 print("Skip winbindd received signal $signame");
634 sleep($self->{server_maxtime});
638 my @optargs = ("-d0");
639 if (defined($ENV{WINBINDD_OPTIONS})) {
640 @optargs = split(/ /, $ENV{WINBINDD_OPTIONS});
643 $ENV{MAKE_TEST_BINARY} = Samba::bindir_path($self, "winbindd");
645 my @preargs = (Samba::bindir_path($self, "timelimit"), $self->{server_maxtime});
646 if(defined($ENV{WINBINDD_VALGRIND})) {
647 @preargs = split(/ /, $ENV{WINBINDD_VALGRIND});
650 print "Starting winbindd with config $env_vars->{SERVERCONFFILE}\n";
652 close($env_vars->{STDIN_PIPE});
653 open STDIN, ">&", \*STDIN_READER or die "can't dup STDIN_READER to STDIN: $!";
655 exec(@preargs, Samba::bindir_path($self, "winbindd"), "-F", "--no-process-group", "--stdout", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start winbindd: $!");
657 $env_vars->{WINBINDD_TL_PID} = $pid;
658 write_pid($env_vars, "winbindd", $pid);
661 unlink($env_vars->{SMBD_TEST_LOG});
662 print "STARTING SMBD...";
665 open STDOUT, ">$env_vars->{SMBD_TEST_LOG}";
666 open STDERR, '>&STDOUT';
668 SocketWrapper::set_default_iface($env_vars->{SOCKET_WRAPPER_DEFAULT_IFACE});
670 $ENV{KRB5_CONFIG} = $env_vars->{KRB5_CONFIG};
671 $ENV{WINBINDD_SOCKET_DIR} = $env_vars->{WINBINDD_SOCKET_DIR};
672 $ENV{NMBD_SOCKET_DIR} = $env_vars->{NMBD_SOCKET_DIR};
674 $ENV{NSS_WRAPPER_PASSWD} = $env_vars->{NSS_WRAPPER_PASSWD};
675 $ENV{NSS_WRAPPER_GROUP} = $env_vars->{NSS_WRAPPER_GROUP};
676 $ENV{NSS_WRAPPER_WINBIND_SO_PATH} = $env_vars->{NSS_WRAPPER_WINBIND_SO_PATH};
678 $ENV{UID_WRAPPER} = "1";
680 if ($smbd ne "yes") {
681 $SIG{USR1} = $SIG{ALRM} = $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub {
683 print("Skip smbd received signal $signame");
686 sleep($self->{server_maxtime});
690 $ENV{MAKE_TEST_BINARY} = Samba::bindir_path($self, "smbd");
691 my @optargs = ("-d0");
692 if (defined($ENV{SMBD_OPTIONS})) {
693 @optargs = split(/ /, $ENV{SMBD_OPTIONS});
695 my @preargs = (Samba::bindir_path($self, "timelimit"), $self->{server_maxtime});
696 if(defined($ENV{SMBD_VALGRIND})) {
697 @preargs = split(/ /,$ENV{SMBD_VALGRIND});
700 close($env_vars->{STDIN_PIPE});
701 open STDIN, ">&", \*STDIN_READER or die "can't dup STDIN_READER to STDIN: $!";
703 exec(@preargs, Samba::bindir_path($self, "smbd"), "-F", "--no-process-group", "--log-stdout", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start smbd: $!");
705 $env_vars->{SMBD_TL_PID} = $pid;
706 write_pid($env_vars, "smbd", $pid);
714 sub provision($$$$$$)
716 my ($self, $prefix, $server, $password, $extra_options, $no_delete_prefix) = @_;
719 ## setup the various environment variables we need
722 my $swiface = Samba::get_interface($server);
724 my $server_ip = "127.0.0.$swiface";
725 my $domain = "SAMBA-TEST";
727 my $unix_name = ($ENV{USER} or $ENV{LOGNAME} or `PATH=/usr/ucb:$ENV{PATH} whoami`);
730 my $unix_gids_str = $);
731 my @unix_gids = split(" ", $unix_gids_str);
733 my $prefix_abs = abs_path($prefix);
734 my $bindir_abs = abs_path($self->{bindir});
735 my $vfs_modulesdir_abs = ($ENV{VFSLIBDIR} or $bindir_abs);
737 my $dns_host_file = "$ENV{SELFTEST_PREFIX}/dns_host_file";
741 my $shrdir="$prefix_abs/share";
744 my $libdir="$prefix_abs/lib";
747 my $piddir="$prefix_abs/pid";
750 my $privatedir="$prefix_abs/private";
751 push(@dirs,$privatedir);
753 my $lockdir="$prefix_abs/lockdir";
754 push(@dirs,$lockdir);
756 my $eventlogdir="$prefix_abs/lockdir/eventlog";
757 push(@dirs,$eventlogdir);
759 my $logdir="$prefix_abs/logs";
762 my $driver32dir="$shrdir/W32X86";
763 push(@dirs,$driver32dir);
765 my $driver64dir="$shrdir/x64";
766 push(@dirs,$driver64dir);
768 my $driver40dir="$shrdir/WIN40";
769 push(@dirs,$driver40dir);
771 my $ro_shrdir="$shrdir/root-tmp";
772 push(@dirs,$ro_shrdir);
774 my $msdfs_shrdir="$shrdir/msdfsshare";
775 push(@dirs,$msdfs_shrdir);
777 my $msdfs_deeppath="$msdfs_shrdir/deeppath";
778 push(@dirs,$msdfs_deeppath);
780 # this gets autocreated by winbindd
781 my $wbsockdir="$prefix_abs/winbindd";
782 my $wbsockprivdir="$lockdir/winbindd_privileged";
784 my $nmbdsockdir="$prefix_abs/nmbd";
785 unlink($nmbdsockdir);
788 ## create the test directory layout
790 die ("prefix_abs = ''") if $prefix_abs eq "";
791 die ("prefix_abs = '/'") if $prefix_abs eq "/";
793 mkdir($prefix_abs, 0777);
794 print "CREATE TEST ENVIRONMENT IN '$prefix'...";
795 if (not defined($no_delete_prefix) or not $no_delete_prefix) {
796 system("rm -rf $prefix_abs/*");
798 mkdir($_, 0777) foreach(@dirs);
801 ## create ro and msdfs share layout
804 chmod 0755, $ro_shrdir;
805 my $unreadable_file = "$ro_shrdir/unreadable_file";
806 unless (open(UNREADABLE_FILE, ">$unreadable_file")) {
807 warn("Unable to open $unreadable_file");
810 close(UNREADABLE_FILE);
811 chmod 0600, $unreadable_file;
813 my $msdfs_target = "$ro_shrdir/msdfs-target";
814 unless (open(MSDFS_TARGET, ">$msdfs_target")) {
815 warn("Unable to open $msdfs_target");
819 chmod 0666, $msdfs_target;
820 symlink "msdfs:$server_ip\\ro-tmp", "$msdfs_shrdir/msdfs-src1";
821 symlink "msdfs:$server_ip\\ro-tmp", "$msdfs_shrdir/deeppath/msdfs-src2";
823 my $conffile="$libdir/server.conf";
825 my $nss_wrapper_pl = "$ENV{PERL} $self->{srcdir}/lib/nss_wrapper/nss_wrapper.pl";
826 my $nss_wrapper_passwd = "$privatedir/passwd";
827 my $nss_wrapper_group = "$privatedir/group";
829 my $mod_printer_pl = "$ENV{PERL} $self->{srcdir}/source3/script/tests/printing/modprinter.pl";
831 my @eventlog_list = ("dns server", "application");
834 ## calculate uids and gids
837 my ($max_uid, $max_gid);
838 my ($uid_nobody, $uid_root);
839 my ($gid_nobody, $gid_nogroup, $gid_root, $gid_domusers);
841 if ($unix_uid < 0xffff - 2) {
844 $max_uid = $unix_uid;
847 $uid_root = $max_uid - 1;
848 $uid_nobody = $max_uid - 2;
850 if ($unix_gids[0] < 0xffff - 3) {
853 $max_gid = $unix_gids[0];
856 $gid_nobody = $max_gid - 1;
857 $gid_nogroup = $max_gid - 2;
858 $gid_root = $max_gid - 3;
859 $gid_domusers = $max_gid - 4;
865 unless (open(CONF, ">$conffile")) {
866 warn("Unable to open $conffile");
871 netbios name = $server
872 interfaces = $server_ip/8
873 bind interfaces only = yes
874 panic action = $self->{srcdir}/selftest/gdb_backtrace %d %\$(MAKE_TEST_BINARY)
878 private dir = $privatedir
879 pid directory = $piddir
880 lock directory = $lockdir
881 log file = $logdir/log.\%m
886 state directory = $lockdir
887 cache directory = $lockdir
889 passdb backend = tdbsam
893 add user script = $nss_wrapper_pl --passwd_path $nss_wrapper_passwd --type passwd --action add --name %u --gid $gid_nogroup
894 add group script = $nss_wrapper_pl --group_path $nss_wrapper_group --type group --action add --name %g
895 add machine script = $nss_wrapper_pl --passwd_path $nss_wrapper_passwd --type passwd --action add --name %u --gid $gid_nogroup
896 add user to group script = $nss_wrapper_pl --passwd_path $nss_wrapper_passwd --type member --action add --member %u --name %g --group_path $nss_wrapper_group
897 delete user script = $nss_wrapper_pl --passwd_path $nss_wrapper_passwd --type passwd --action delete --name %u
898 delete group script = $nss_wrapper_pl --group_path $nss_wrapper_group --type group --action delete --name %g
899 delete user from group script = $nss_wrapper_pl --passwd_path $nss_wrapper_passwd --type member --action delete --member %u --name %g --group_path $nss_wrapper_group
901 addprinter command = $mod_printer_pl -a -s $conffile --
902 deleteprinter command = $mod_printer_pl -d -s $conffile --
904 eventlog list = application \"dns server\"
907 kernel change notify = no
911 printcap name = /dev/null
913 winbindd:socket dir = $wbsockdir
914 nmbd:socket dir = $nmbdsockdir
915 idmap config * : range = 100000-200000
916 winbind enum users = yes
917 winbind enum groups = yes
919 # min receivefile size = 4000
923 server signing = auto
925 smbd:sharedelay = 100000
926 # smbd:writetimeupdatedelay = 500000
930 store dos attributes = yes
933 vfs objects = $vfs_modulesdir_abs/xattr_tdb.so $vfs_modulesdir_abs/streams_depot.so
936 print command = $bindir_abs/vlp tdbfile=$lockdir/vlp.tdb print %p %s
937 lpq command = $bindir_abs/vlp tdbfile=$lockdir/vlp.tdb lpq %p
938 lp rm command = $bindir_abs/vlp tdbfile=$lockdir/vlp.tdb lprm %p %j
939 lp pause command = $bindir_abs/vlp tdbfile=$lockdir/vlp.tdb lppause %p %j
940 lp resume command = $bindir_abs/vlp tdbfile=$lockdir/vlp.tdb lpresume %p %j
941 queue pause command = $bindir_abs/vlp tdbfile=$lockdir/vlp.tdb queuepause %p
942 queue resume command = $bindir_abs/vlp tdbfile=$lockdir/vlp.tdb queueresume %p
945 ncalrpc dir = $prefix_abs/ncalrpc
946 rpc_server:epmapper = external
947 rpc_server:spoolss = external
948 rpc_server:lsarpc = external
949 rpc_server:samr = external
950 rpc_server:netlogon = external
951 rpc_server:tcpip = yes
953 rpc_daemon:epmd = fork
954 rpc_daemon:spoolssd = fork
955 rpc_daemon:lsasd = fork
957 resolv:host file = $dns_host_file
959 # The samba3.blackbox.smbclient_s3 test uses this to test that
960 # sending messages works, and that the %m sub works.
961 message command = mv %s $shrdir/message.%m
963 # Begin extra options
967 #Include user defined custom parameters if set
970 if (defined($ENV{INCLUDE_CUSTOM_CONF})) {
971 print CONF "\t$ENV{INCLUDE_CUSTOM_CONF}\n";
977 comment = smb username is [%U]
987 force user = $unix_name
991 force group = nogroup
1002 hide unreadable = yes
1005 case sensitive = yes
1008 hide unwriteable files = yes
1021 comment = smb username is [%U]
1023 force create mode = 777
1030 ## create a test account
1033 unless (open(PASSWD, ">$nss_wrapper_passwd")) {
1034 warn("Unable to open $nss_wrapper_passwd");
1037 print PASSWD "nobody:x:$uid_nobody:$gid_nobody:nobody gecos:$prefix_abs:/bin/false
1038 $unix_name:x:$unix_uid:$unix_gids[0]:$unix_name gecos:$prefix_abs:/bin/false
1040 if ($unix_uid != 0) {
1041 print PASSWD "root:x:$uid_root:$gid_root:root gecos:$prefix_abs:/bin/false";
1045 unless (open(GROUP, ">$nss_wrapper_group")) {
1046 warn("Unable to open $nss_wrapper_group");
1049 print GROUP "nobody:x:$gid_nobody:
1050 nogroup:x:$gid_nogroup:nobody
1051 $unix_name-group:x:$unix_gids[0]:
1052 domusers:X:$gid_domusers:
1054 if ($unix_gids[0] != 0) {
1055 print GROUP "root:x:$gid_root:";
1060 foreach my $evlog (@eventlog_list) {
1061 my $evlogtdb = "$eventlogdir/$evlog.tdb";
1062 open(EVENTLOG, ">$evlogtdb") or die("Unable to open $evlogtdb");
1066 $ENV{NSS_WRAPPER_PASSWD} = $nss_wrapper_passwd;
1067 $ENV{NSS_WRAPPER_GROUP} = $nss_wrapper_group;
1069 my $cmd = Samba::bindir_path($self, "smbpasswd")." -c $conffile -L -s -a $unix_name > /dev/null";
1070 unless (open(PWD, "|$cmd")) {
1071 warn("Unable to set password for test account\n$cmd");
1074 print PWD "$password\n$password\n";
1075 unless (close(PWD)) {
1076 warn("Unable to set password for test account\n$cmd");
1081 open(HOSTS, ">>$ENV{SELFTEST_PREFIX}/dns_host_file") or die("Unable to open $ENV{SELFTEST_PREFIX}/dns_host_file");
1082 print HOSTS "A $server. $server_ip
1086 $ret{SERVER_IP} = $server_ip;
1087 $ret{NMBD_TEST_LOG} = "$prefix/nmbd_test.log";
1088 $ret{NMBD_TEST_LOG_POS} = 0;
1089 $ret{WINBINDD_TEST_LOG} = "$prefix/winbindd_test.log";
1090 $ret{WINBINDD_TEST_LOG_POS} = 0;
1091 $ret{SMBD_TEST_LOG} = "$prefix/smbd_test.log";
1092 $ret{SMBD_TEST_LOG_POS} = 0;
1093 $ret{SERVERCONFFILE} = $conffile;
1094 $ret{CONFIGURATION} ="-s $conffile";
1095 $ret{SERVER} = $server;
1096 $ret{USERNAME} = $unix_name;
1097 $ret{USERID} = $unix_uid;
1098 $ret{DOMAIN} = $domain;
1099 $ret{NETBIOSNAME} = $server;
1100 $ret{PASSWORD} = $password;
1101 $ret{PIDDIR} = $piddir;
1102 $ret{WINBINDD_SOCKET_DIR} = $wbsockdir;
1103 $ret{WINBINDD_PRIV_PIPE_DIR} = $wbsockprivdir;
1104 $ret{NMBD_SOCKET_DIR} = $nmbdsockdir;
1105 $ret{SOCKET_WRAPPER_DEFAULT_IFACE} = $swiface;
1106 $ret{NSS_WRAPPER_PASSWD} = $nss_wrapper_passwd;
1107 $ret{NSS_WRAPPER_GROUP} = $nss_wrapper_group;
1108 $ret{NSS_WRAPPER_WINBIND_SO_PATH} = $ENV{NSS_WRAPPER_WINBIND_SO_PATH};
1109 if (not defined($ret{NSS_WRAPPER_WINBIND_SO_PATH})) {
1110 $ret{NSS_WRAPPER_WINBIND_SO_PATH} = Samba::bindir_path($self, "default/nsswitch/libnss-winbind.so");
1112 $ret{LOCAL_PATH} = "$shrdir";
1117 sub wait_for_start($$)
1119 my ($self, $envvars) = @_;
1121 # give time for nbt server to register its names
1122 print "delaying for nbt name registration\n";
1124 # This will return quickly when things are up, but be slow if we need to wait for (eg) SSL init
1125 system(Samba::bindir_path($self, "nmblookup3") ." $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} __SAMBA__");
1126 system(Samba::bindir_path($self, "nmblookup3") ." $envvars->{CONFIGURATION} __SAMBA__");
1127 system(Samba::bindir_path($self, "nmblookup3") ." $envvars->{CONFIGURATION} -U 127.255.255.255 __SAMBA__");
1128 system(Samba::bindir_path($self, "nmblookup3") ." $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} $envvars->{SERVER}");
1129 system(Samba::bindir_path($self, "nmblookup3") ." $envvars->{CONFIGURATION} $envvars->{SERVER}");
1131 # make sure smbd is also up set
1132 print "wait for smbd\n";
1137 $ret = system(Samba::bindir_path($self, "smbclient3") ." $envvars->{CONFIGURATION} -L $envvars->{SERVER} -U% -p 139");
1142 } while ($ret != 0 && $count < 10);
1144 print "SMBD failed to start up in a reasonable time (20sec)\n";
1145 teardown_env($self, $envvars);
1148 # Ensure we have domain users mapped.
1149 $ret = system(Samba::bindir_path($self, "net") ." $envvars->{CONFIGURATION} groupmap add rid=513 unixgroup=domusers type=domain");
1154 print $self->getlog_env($envvars);