Changeset 745 for trunk/server/selftest
- Timestamp:
- Nov 27, 2012, 4:43:17 PM (13 years ago)
- Location:
- trunk/server
- Files:
-
- 9 deleted
- 11 edited
- 5 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/server
- Property svn:mergeinfo changed
/vendor/current merged: 581,587,591,594,597,600,615,618,740
- Property svn:mergeinfo changed
-
trunk/server/selftest/README
r414 r745 11 11 selftest.pl simply outputs subunit, which can then be formatted or analyzed 12 12 by tools that understand the subunit protocol. One of these tools is 13 format-subunit .pl, which is used by default as part of "make test".13 format-subunit, which is used by default as part of "make test". 14 14 15 15 Available testsuites 16 16 ==================== 17 17 The available testsuites are obtained from a script, usually 18 s elftest/samba{3,4}_tests.sh. This script should for each testsuite output18 source{3,4}/selftest/tests.sh. This script should for each testsuite output 19 19 the name of the test, the command to run and the environment that should be 20 20 provided. Use the included "plantest" function to generate the required output. … … 38 38 for the last announced test. 39 39 40 Accepted commands are: 40 For a full description of the subunit protocol, see ../lib/subunit/README. 41 41 42 test 43 ~~~~ 44 test: <NAME> 45 46 Announce that a new test with the specified name is starting 47 48 success 49 ~~~~~~~ 50 success: <NAME> 51 52 Announce that the test with the specified name is done and ran successfully. 53 54 failure 55 ~~~~~~~ 56 failure: <NAME> 57 failure: <NAME> [ REASON ] 58 59 Announce that the test with the specified name failed. Optionally, it is 60 possible to specify a reason it failed. 61 62 The alias "fail" will also work. 63 64 xfail 65 ~~~~~ 66 xfail: <NAME> 67 xfail: <NAME> [ REASON ] 68 69 Announce that the test with the specified name failed but that the failure 70 was expected, e.g. it's a test for a known bug that hasn't been fixed yet. 71 Alternatively it is also possible to simply return "failure:" here but 72 specify in the samba4-knownfailures file that it is failing. 73 74 skip 75 ~~~~ 76 skip: <NAME> 77 skip: <NAME> [ REASON ] 78 79 Announce that the test with the specified name was skipped. Optionally a 80 reason can be specified. 81 82 time 83 ~~~~ 84 time: YYYY-MM-DD HH:mm:ssZ 85 86 Announce the current time. This may be used to calculate the duration of 87 various tests. 88 89 The following are Samba extensions to Subunit: 42 The following commands are Samba extensions to Subunit: 90 43 91 44 testsuite-count … … 96 49 97 50 start-testsuite 98 ~~~~~~~~~ 51 ~~~~~~~~~~~~~~~ 99 52 start-testsuite: name 100 53 -
trunk/server/selftest/Subunit.pm
r414 r745 20 20 require Exporter; 21 21 @ISA = qw(Exporter); 22 @EXPORT_OK = qw(parse_results);23 22 24 23 use strict; 25 26 sub parse_results($$$)27 {28 my ($msg_ops, $statistics, $fh) = @_;29 my $expected_fail = 0;30 my $unexpected_fail = 0;31 my $unexpected_err = 0;32 my $open_tests = [];33 34 while(<$fh>) {35 if (/^test: (.+)\n/) {36 $msg_ops->control_msg($_);37 $msg_ops->start_test($1);38 push (@$open_tests, $1);39 } elsif (/^time: (\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)\n/) {40 $msg_ops->report_time(mktime($6, $5, $4, $3, $2-1, $1-1900));41 } elsif (/^(success|successful|failure|fail|skip|knownfail|error|xfail|skip-testsuite|testsuite-failure|testsuite-xfail|testsuite-success|testsuite-error): (.*?)( \[)?([ \t]*)\n/) {42 $msg_ops->control_msg($_);43 my $result = $1;44 my $testname = $2;45 my $reason = undef;46 if ($3) {47 $reason = "";48 # reason may be specified in next lines49 my $terminated = 0;50 while(<$fh>) {51 $msg_ops->control_msg($_);52 if ($_ eq "]\n") { $terminated = 1; last; } else { $reason .= $_; }53 }54 55 unless ($terminated) {56 $statistics->{TESTS_ERROR}++;57 $msg_ops->end_test($testname, "error", 1,58 "reason ($result) interrupted");59 return 1;60 }61 }62 if ($result eq "success" or $result eq "successful") {63 pop(@$open_tests); #FIXME: Check that popped value == $testname64 $statistics->{TESTS_EXPECTED_OK}++;65 $msg_ops->end_test($testname, "success", 0, $reason);66 } elsif ($result eq "xfail" or $result eq "knownfail") {67 pop(@$open_tests); #FIXME: Check that popped value == $testname68 $statistics->{TESTS_EXPECTED_FAIL}++;69 $msg_ops->end_test($testname, "xfail", 0, $reason);70 $expected_fail++;71 } elsif ($result eq "failure" or $result eq "fail") {72 pop(@$open_tests); #FIXME: Check that popped value == $testname73 $statistics->{TESTS_UNEXPECTED_FAIL}++;74 $msg_ops->end_test($testname, "failure", 1, $reason);75 $unexpected_fail++;76 } elsif ($result eq "skip") {77 $statistics->{TESTS_SKIP}++;78 # Allow tests to be skipped without prior announcement of test79 my $last = pop(@$open_tests);80 if (defined($last) and $last ne $testname) {81 push (@$open_tests, $testname);82 }83 $msg_ops->end_test($testname, "skip", 0, $reason);84 } elsif ($result eq "error") {85 $statistics->{TESTS_ERROR}++;86 pop(@$open_tests); #FIXME: Check that popped value == $testname87 $msg_ops->end_test($testname, "error", 1, $reason);88 $unexpected_err++;89 } elsif ($result eq "skip-testsuite") {90 $msg_ops->skip_testsuite($testname);91 } elsif ($result eq "testsuite-success") {92 $msg_ops->end_testsuite($testname, "success", $reason);93 } elsif ($result eq "testsuite-failure") {94 $msg_ops->end_testsuite($testname, "failure", $reason);95 } elsif ($result eq "testsuite-xfail") {96 $msg_ops->end_testsuite($testname, "xfail", $reason);97 } elsif ($result eq "testsuite-error") {98 $msg_ops->end_testsuite($testname, "error", $reason);99 }100 } elsif (/^testsuite: (.*)\n/) {101 $msg_ops->start_testsuite($1);102 } elsif (/^testsuite-count: (\d+)\n/) {103 $msg_ops->testsuite_count($1);104 } else {105 $msg_ops->output_msg($_);106 }107 }108 109 while ($#$open_tests+1 > 0) {110 $msg_ops->end_test(pop(@$open_tests), "error", 1,111 "was started but never finished!");112 $statistics->{TESTS_ERROR}++;113 $unexpected_err++;114 }115 116 return 1 if $unexpected_err > 0;117 return 1 if $unexpected_fail > 0;118 return 0;119 }120 24 121 25 sub start_test($) … … 132 36 if ($reason) { 133 37 print "$result: $name [\n"; 134 print "$reason"; 38 print $reason; 39 if (substr($reason, -1, 1) ne "\n") { print "\n"; } 135 40 print "]\n"; 136 41 } else { … … 139 44 } 140 45 141 sub skip_test($;$)142 {143 my $name = shift;144 my $reason = shift;145 end_test($name, "skip", $reason);146 }147 148 sub fail_test($;$)149 {150 my $name = shift;151 my $reason = shift;152 end_test($name, "fail", $reason);153 }154 155 sub success_test($;$)156 {157 my $name = shift;158 my $reason = shift;159 end_test($name, "success", $reason);160 }161 162 sub xfail_test($;$)163 {164 my $name = shift;165 my $reason = shift;166 end_test($name, "xfail", $reason);167 }168 169 46 sub report_time($) 170 47 { 171 48 my ($time) = @_; 172 49 my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time); 173 printf "time: %04d-%02d-%02d %02d:%02d:%02d\n", $year+1900, $mon+1, $mday, $hour, $min, $sec; 50 $sec = ($time - int($time) + $sec); 51 my $msg = sprintf("%f", $sec); 52 if (substr($msg, 1, 1) eq ".") { 53 $msg = "0" . $msg; 54 } 55 printf "time: %04d-%02d-%02d %02d:%02d:%s\n", $year+1900, $mon+1, $mday, $hour, $min, $msg; 56 } 57 58 sub progress_pop() 59 { 60 print "progress: pop\n"; 61 } 62 63 sub progress_push() 64 { 65 print "progress: push\n"; 66 } 67 68 sub progress($;$) 69 { 70 my ($count, $whence) = @_; 71 72 unless(defined($whence)) { 73 $whence = ""; 74 } 75 76 print "progress: $whence$count\n"; 174 77 } 175 78 … … 206 109 } 207 110 208 sub testsuite_count($)209 {210 my ($count) = @_;211 print "testsuite-count: $count\n";212 }213 214 111 1; -
trunk/server/selftest/gdb_backtrace
r414 r745 31 31 DB_LIST="ladebug ${DB_LIST}" 32 32 ;; 33 # 34 # On solaris dbx is working way more better than gdb 35 # let's try it first 36 # 37 SunOS) 38 DB_LIST="dbx ${DB_LIST}" 39 ;; 40 # 41 # FreeBSD comes with a flavor that works gdb66 and one that don't gdb 42 # (gdb 6.1) let's try it first the one that works ! 43 # 44 FreeBSD) 45 DB_LIST="gdb66 ${DB_LIST}" 46 ;; 33 47 esac 34 48 … … 46 60 47 61 # 48 # we first try to use /proc/${PID}/exe 62 # we first try to use /proc/${PID}/exe or /proc/{$PID}/path for solaris 49 63 # then fallback to the binary from the commandline 50 64 # then we search for the commandline argument with … … 52 66 # 53 67 test -f "/proc/${PID}/exe" && BINARY="/proc/${PID}/exe" 68 test -f "/proc/${PID}/path/a.out" && BINARY=`ls -l /proc/${PID}/path/a.out |sed 's/.*-> //'` 54 69 test x"${BINARY}" = x"" && BINARY="/proc/${PID}/exe" 55 70 test -f "${BINARY}" || BINARY=`which ${BINARY}` … … 76 91 ${DB_BIN} -c "${BATCHFILE_MAIN}" -i "${BATCHFILE_PRE}" -pid "${PID}" "${BINARY}" 77 92 ;; 78 gdb )93 gdb66) 79 94 cat << EOF > ${BATCHFILE_MAIN} 80 95 set height 1000 81 96 bt full 97 info locals 98 kill 82 99 quit 83 100 EOF 84 101 ${DB_BIN} -x "${BATCHFILE_MAIN}" "${BINARY}" "${PID}" 85 102 ;; 103 gdb) 104 cat << EOF > ${BATCHFILE_MAIN} 105 set height 0 106 bt full 107 thread apply all bt full 108 info locals 109 quit 110 EOF 111 ${DB_BIN} -batch -x "${BATCHFILE_MAIN}" --pid "${PID}" < /dev/null 112 ;; 113 dbx) 114 ${DB_BIN} "where;dump;kill;quit" "${BINARY}" "${PID}" 115 ;; 86 116 esac 87 117 /bin/rm -f ${BATCHFILE_PRE} ${BATCHFILE_MAIN} -
trunk/server/selftest/gdb_backtrace_test.c
r414 r745 1 1 /* 2 2 3 add a useful ltool to test the gdb_backtrace script3 add a useful tool to test the gdb_backtrace script 4 4 5 5 just compile it with -
trunk/server/selftest/selftest.pl
r414 r745 1 1 #!/usr/bin/perl 2 2 # Bootstrap Samba and run a number of tests against it. 3 # Copyright (C) 2005-20 09Jelmer Vernooij <jelmer@samba.org>3 # Copyright (C) 2005-2010 Jelmer Vernooij <jelmer@samba.org> 4 4 # Copyright (C) 2007-2009 Stefan Metzmacher <metze@samba.org> 5 5 … … 126 126 use FindBin qw($RealBin $Script); 127 127 use File::Spec; 128 use File::Temp qw(tempfile); 128 129 use Getopt::Long; 129 130 use POSIX; 130 131 use Cwd qw(abs_path); 131 132 use lib "$RealBin"; 132 use Subunit qw(parse_results); 133 use Subunit::Filter; 133 use Subunit; 134 134 use SocketWrapper; 135 136 eval { 137 require Time::HiRes; 138 Time::HiRes->import("time"); 139 }; 140 if ($@) { 141 print "You don't have Time::Hires installed !\n"; 142 } 135 143 136 144 my $opt_help = 0; … … 146 154 my $opt_image = undef; 147 155 my $opt_testenv = 0; 156 my $opt_list = 0; 148 157 my $ldap = undef; 149 my $opt_analyse_cmd = undef;150 158 my $opt_resetup_env = undef; 151 159 my $opt_bindir = undef; 152 my $opt_ no_lazy_setup= undef;160 my $opt_load_list = undef; 153 161 my @testlists = (); 154 162 … … 161 169 my @excludes = (); 162 170 171 sub pipe_handler { 172 my $sig = shift @_; 173 print STDERR "Exiting early because of SIGPIPE.\n"; 174 exit(1); 175 } 176 177 $SIG{PIPE} = \&pipe_handler; 178 163 179 sub find_in_list($$) 164 180 { … … 213 229 } 214 230 231 # expand strings from %ENV 232 sub expand_environment_strings($) 233 { 234 my $s = shift; 235 # we use a reverse sort so we do the longer ones first 236 foreach my $k (sort { $b cmp $a } keys %ENV) { 237 $s =~ s/\$$k/$ENV{$k}/g; 238 } 239 return $s; 240 } 241 215 242 sub run_testsuite($$$$$) 216 243 { … … 219 246 220 247 Subunit::start_testsuite($name); 248 Subunit::progress_push(); 221 249 Subunit::report_time(time()); 222 223 open(RESULTS, "$cmd 2>&1|"); 224 my $statistics = { 225 TESTS_UNEXPECTED_OK => 0, 226 TESTS_EXPECTED_OK => 0, 227 TESTS_UNEXPECTED_FAIL => 0, 228 TESTS_EXPECTED_FAIL => 0, 229 TESTS_ERROR => 0, 230 TESTS_SKIP => 0, 231 }; 232 233 my $msg_ops = new Subunit::Filter("$name\.", []); 234 235 parse_results($msg_ops, $statistics, *RESULTS); 236 237 my $ret = 0; 238 239 unless (close(RESULTS)) { 240 if ($!) { 241 Subunit::end_testsuite($name, "error", "Unable to run $cmd: $!"); 242 return 0; 243 } else { 244 $ret = $?; 245 } 246 } 247 248 if ($ret & 127) { 249 Subunit::end_testsuite($name, "error", sprintf("Testsuite died with signal %d, %s coredump", ($ret & 127), ($ret & 128) ? "with": "without")); 250 return 0; 251 } 250 system($cmd); 251 Subunit::report_time(time()); 252 Subunit::progress_pop(); 253 254 if ($? == -1) { 255 Subunit::progress_pop(); 256 Subunit::end_testsuite($name, "error", "Unable to run $cmd: $!"); 257 exit(1); 258 } elsif ($? & 127) { 259 Subunit::end_testsuite($name, "error", 260 sprintf("%s died with signal %d, %s coredump\n", $cmd, ($? & 127), ($? & 128) ? 'with' : 'without')); 261 exit(1); 262 } 263 264 my $exitcode = $? >> 8; 265 252 266 my $envlog = getlog_env($envname); 253 267 if ($envlog ne "") { … … 256 270 257 271 print "command: $cmd\n"; 258 259 my $exitcode = $ret >> 8; 260 261 Subunit::report_time(time()); 272 printf "expanded command: %s\n", expand_environment_strings($cmd); 273 262 274 if ($exitcode == 0) { 263 275 Subunit::end_testsuite($name, "success"); … … 315 327 --one abort when the first test fails 316 328 --verbose be verbose 317 --analyse-cmd CMD command to run after each test 329 --testenv run a shell in the requested test environment 330 --list list available tests 318 331 "; 319 332 exit(0); … … 336 349 'verbose' => \$opt_verbose, 337 350 'testenv' => \$opt_testenv, 351 'list' => \$opt_list, 338 352 'ldap:s' => \$ldap, 339 'analyse-cmd=s' => \$opt_analyse_cmd,340 'no-lazy-setup' => \$opt_no_lazy_setup,341 353 'resetup-environment' => \$opt_resetup_env, 342 354 'bindir:s' => \$opt_bindir, 343 355 'image=s' => \$opt_image, 344 'testlist=s' => \@testlists 356 'testlist=s' => \@testlists, 357 'load-list=s' => \$opt_load_list, 345 358 ); 346 359 … … 348 361 349 362 ShowHelp() if ($opt_help); 363 364 die("--list and --testenv are mutually exclusive") if ($opt_list and $opt_testenv); 365 366 # we want unbuffered output 367 $| = 1; 350 368 351 369 my @tests = @ARGV; … … 356 374 $ENV{MALLOC_CHECK_} = 2; 357 375 } 376 377 # make all our python scripts unbuffered 378 $ENV{PYTHONUNBUFFERED} = 1; 358 379 359 380 my $bindir = ($opt_bindir or "$builddir/bin"); … … 385 406 386 407 my $prefix_abs = abs_path($prefix); 408 my $tmpdir_abs = abs_path("$prefix/tmp"); 409 mkdir($tmpdir_abs, 0777) unless -d $tmpdir_abs; 410 387 411 my $srcdir_abs = abs_path($srcdir); 388 412 my $builddir_abs = abs_path($builddir); … … 398 422 $ENV{BUILDDIR} = $builddir; 399 423 $ENV{BUILDDIR_ABS} = $builddir_abs; 424 $ENV{BINDIR} = $bindir_abs; 400 425 $ENV{EXEEXT} = $exeext; 401 426 402 427 my $tls_enabled = not $opt_quick; 403 428 $ENV{TLS_ENABLED} = ($tls_enabled?"yes":"no"); 404 $ENV{LDB_MODULES_PATH} = "$bindir_abs/modules/ldb"; 405 $ENV{LD_SAMBA_MODULE_PATH} = "$bindir_abs/modules"; 429 406 430 sub prefix_pathvar($$) 407 431 { … … 428 452 my $socket_wrapper_dir; 429 453 if ($opt_socket_wrapper) { 430 $socket_wrapper_dir = SocketWrapper::setup_dir("$prefix /w", $opt_socket_wrapper_pcap);454 $socket_wrapper_dir = SocketWrapper::setup_dir("$prefix_abs/w", $opt_socket_wrapper_pcap); 431 455 print "SOCKET_WRAPPER_DIR=$socket_wrapper_dir\n"; 432 456 } else { … … 440 464 441 465 if ($opt_target eq "samba4") { 442 $testenv_default = " member";466 $testenv_default = "all"; 443 467 require target::Samba4; 444 $target = new Samba4($bindir, $ldap, "$srcdir/setup", $exeext);468 $target = new Samba4($bindir, $ldap, $srcdir, $exeext); 445 469 } elsif ($opt_target eq "samba3") { 446 470 if ($opt_socket_wrapper and `$bindir/smbd -b | grep SOCKET_WRAPPER` eq "") { … … 449 473 $testenv_default = "member"; 450 474 require target::Samba3; 451 $target = new Samba3($bindir );475 $target = new Samba3($bindir, $srcdir_abs); 452 476 } elsif ($opt_target eq "win") { 453 477 die("Windows tests will not run with socket wrapper enabled.") … … 516 540 } 517 541 518 my $interfaces = join(',', ("127.0.0.6/8", 519 "127.0.0.7/8", 520 "127.0.0.8/8", 521 "127.0.0.9/8", 522 "127.0.0.10/8", 523 "127.0.0.11/8")); 524 525 my $conffile = "$prefix_abs/client/client.conf"; 542 my $interfaces = join(',', ("127.0.0.11/8", 543 "127.0.0.12/8", 544 "127.0.0.13/8", 545 "127.0.0.14/8", 546 "127.0.0.15/8", 547 "127.0.0.16/8")); 548 549 my $clientdir = "$prefix_abs/client"; 550 551 my $conffile = "$clientdir/client.conf"; 526 552 $ENV{SMB_CONF_PATH} = $conffile; 527 553 528 sub write_clientconf($$ )529 { 530 my ($conffile, $ vars) = @_;531 532 mkdir("$ prefix/client", 0777) unless -d "$prefix/client";533 534 if ( -d "$ prefix/client/private" ) {535 unlink <$ prefix/client/private/*>;554 sub write_clientconf($$$) 555 { 556 my ($conffile, $clientdir, $vars) = @_; 557 558 mkdir("$clientdir", 0777) unless -d "$clientdir"; 559 560 if ( -d "$clientdir/private" ) { 561 unlink <$clientdir/private/*>; 536 562 } else { 537 mkdir("$ prefix/client/private", 0777);538 } 539 540 if ( -d "$ prefix/client/lockdir" ) {541 unlink <$ prefix/client/lockdir/*>;563 mkdir("$clientdir/private", 0777); 564 } 565 566 if ( -d "$clientdir/lockdir" ) { 567 unlink <$clientdir/lockdir/*>; 542 568 } else { 543 mkdir("$ prefix/client/lockdir", 0777);544 } 545 546 if ( -d "$ prefix_abs/client/ncalrpcdir" ) {547 unlink <$ prefix/client/ncalrpcdir/*>;569 mkdir("$clientdir/lockdir", 0777); 570 } 571 572 if ( -d "$clientdir/ncalrpcdir" ) { 573 unlink <$clientdir/ncalrpcdir/*>; 548 574 } else { 549 mkdir("$ prefix/client/ncalrpcdir", 0777);575 mkdir("$clientdir/ncalrpcdir", 0777); 550 576 } 551 577 … … 568 594 } 569 595 print CF " 570 private dir = $ prefix_abs/client/private571 lock dir = $ prefix_abs/client/lockdir572 ncalrpc dir = $ prefix_abs/client/ncalrpcdir573 name resolve order = bcast 596 private dir = $clientdir/private 597 lock dir = $clientdir/lockdir 598 ncalrpc dir = $clientdir/ncalrpcdir 599 name resolve order = bcast file 574 600 panic action = $RealBin/gdb_backtrace \%PID\% \%PROG\% 575 601 max xmit = 32K … … 578 604 system:anonymous = true 579 605 client lanman auth = Yes 580 torture:basedir = $prefix_abs/client 606 log level = 1 607 torture:basedir = $clientdir 581 608 #We don't want to pass our self-tests if the PAC code is wrong 582 609 gensec:require_pac = true 583 modules dir = $ENV{LD_SAMBA_MODULE_PATH} 610 resolv:host file = $prefix_abs/dns_host_file 611 #We don't want to run 'speed' tests for very long 612 torture:timelimit = 1 584 613 "; 585 614 close(CF); … … 587 616 588 617 my @todo = (); 589 590 my $testsdir = "$srcdir/selftest";591 592 my %required_envs = ();593 618 594 619 sub should_run_test($) … … 614 639 615 640 while (<IN>) { 616 if ($_ eq "-- TEST --\n") { 641 if (/-- TEST(-LOADLIST|-IDLIST|) --\n/) { 642 my $supports_loadlist = (defined($1) and $1 eq "-LOADLIST"); 643 my $supports_idlist = (defined($1) and $1 eq "-IDLIST"); 617 644 my $name = <IN>; 618 645 $name =~ s/\n//g; … … 622 649 $cmdline =~ s/\n//g; 623 650 if (should_run_test($name) == 1) { 624 $required_envs{$env} = 1; 625 push (@ret, [$name, $env, $cmdline]); 651 push (@ret, [$name, $env, $cmdline, $supports_loadlist, $supports_idlist]); 626 652 } 627 653 } else { … … 638 664 639 665 $ENV{SELFTEST_PREFIX} = "$prefix_abs"; 666 $ENV{SELFTEST_TMPDIR} = "$tmpdir_abs"; 667 $ENV{TEST_DATA_PREFIX} = "$tmpdir_abs"; 640 668 if ($opt_socket_wrapper) { 641 669 $ENV{SELFTEST_INTERFACES} = $interfaces; … … 665 693 } 666 694 667 Subunit::testsuite_count($#available+1); 668 Subunit::report_time(time()); 669 670 foreach (@available) { 671 my $name = $$_[0]; 695 my $restricted = undef; 696 my $restricted_used = {}; 697 698 if ($opt_load_list) { 699 $restricted = []; 700 open(LOAD_LIST, "<$opt_load_list") or die("Unable to open $opt_load_list"); 701 while (<LOAD_LIST>) { 702 chomp; 703 push (@$restricted, $_); 704 } 705 close(LOAD_LIST); 706 } 707 708 my $individual_tests = undef; 709 $individual_tests = {}; 710 711 foreach my $testsuite (@available) { 712 my $name = $$testsuite[0]; 672 713 my $skipreason = skip($name); 673 if (defined($skipreason)) { 714 if (defined($restricted)) { 715 # Find the testsuite for this test 716 my $match = undef; 717 foreach my $r (@$restricted) { 718 if ($r eq $name) { 719 $individual_tests->{$name} = []; 720 $match = $r; 721 $restricted_used->{$r} = 1; 722 } elsif (substr($r, 0, length($name)+1) eq "$name.") { 723 push(@{$individual_tests->{$name}}, $r); 724 $match = $r; 725 $restricted_used->{$r} = 1; 726 } 727 } 728 if ($match) { 729 if (defined($skipreason)) { 730 Subunit::skip_testsuite($name, $skipreason); 731 } else { 732 push(@todo, $testsuite); 733 } 734 } 735 } elsif (defined($skipreason)) { 674 736 Subunit::skip_testsuite($name, $skipreason); 675 737 } else { 676 push(@todo, $_); 677 } 678 } 679 680 if ($#todo == -1) { 738 push(@todo, $testsuite); 739 } 740 } 741 742 if (defined($restricted)) { 743 foreach (@$restricted) { 744 unless (defined($restricted_used->{$_})) { 745 print "No test or testsuite found matching $_\n"; 746 } 747 } 748 } elsif ($#todo == -1) { 681 749 print STDERR "No tests to run\n"; 682 750 exit(1); 683 751 } 684 752 685 753 my $suitestotal = $#todo + 1; 754 755 Subunit::progress($suitestotal); 756 Subunit::report_time(time()); 757 686 758 my $i = 0; 687 759 $| = 1; … … 711 783 "DC_NETBIOSALIAS", 712 784 785 # domain member 786 "MEMBER_SERVER", 787 "MEMBER_SERVER_IP", 788 "MEMBER_NETBIOSNAME", 789 "MEMBER_NETBIOSALIAS", 790 791 # rpc proxy controller stuff 792 "RPC_PROXY_SERVER", 793 "RPC_PROXY_SERVER_IP", 794 "RPC_PROXY_NETBIOSNAME", 795 "RPC_PROXY_NETBIOSALIAS", 796 797 # domain controller stuff for Vampired DC 798 "VAMPIRE_DC_SERVER", 799 "VAMPIRE_DC_SERVER_IP", 800 "VAMPIRE_DC_NETBIOSNAME", 801 "VAMPIRE_DC_NETBIOSALIAS", 802 713 803 # server stuff 714 804 "SERVER", … … 719 809 # user stuff 720 810 "USERNAME", 811 "USERID", 721 812 "PASSWORD", 722 813 "DC_USERNAME", … … 726 817 "KRB5_CONFIG", 727 818 "WINBINDD_SOCKET_DIR", 728 "WINBINDD_PRIV_PIPE_DIR" 819 "WINBINDD_PRIV_PIPE_DIR", 820 "NMBD_SOCKET_DIR", 821 "LOCAL_PATH" 729 822 ); 730 823 … … 735 828 }; 736 829 737 sub setup_env($ )738 { 739 my ($name ) = @_;830 sub setup_env($$) 831 { 832 my ($name, $prefix) = @_; 740 833 741 834 my $testenv_vars = undef; … … 754 847 } elsif (defined(get_running_env($envname))) { 755 848 $testenv_vars = get_running_env($envname); 756 if (not $target->check_env($testenv_vars)) { 849 if (not $testenv_vars->{target}->check_env($testenv_vars)) { 850 print $testenv_vars->{target}->getlog_env($testenv_vars); 757 851 $testenv_vars = undef; 758 852 } 759 853 } else { 760 854 $testenv_vars = $target->setup_env($envname, $prefix); 855 if (defined($testenv_vars) && not defined($testenv_vars->{target})) { 856 $testenv_vars->{target} = $target; 857 } 761 858 } 762 859 … … 769 866 $ENV{SMB_CONF_PATH} = $testenv_vars->{SERVERCONFFILE}; 770 867 } elsif ($option eq "client") { 771 SocketWrapper::set_default_iface( 6);772 write_clientconf($conffile, $ testenv_vars);868 SocketWrapper::set_default_iface(11); 869 write_clientconf($conffile, $clientdir, $testenv_vars); 773 870 $ENV{SMB_CONF_PATH} = $conffile; 774 871 } else { … … 804 901 my ($envname) = @_; 805 902 return "" if ($envname eq "none"); 806 return $target->getlog_env(get_running_env($envname)); 903 my $env = get_running_env($envname); 904 return $env->{target}->getlog_env($env); 807 905 } 808 906 … … 811 909 my ($envname) = @_; 812 910 return 1 if ($envname eq "none"); 813 return $target->check_env(get_running_env($envname)); 911 my $env = get_running_env($envname); 912 return $env->{target}->check_env($env); 814 913 } 815 914 … … 818 917 my ($envname) = @_; 819 918 return if ($envname eq "none"); 820 $target->teardown_env(get_running_env($envname)); 919 my $env = get_running_env($envname); 920 $env->{target}->teardown_env($env); 821 921 delete $running_envs{$envname}; 822 922 } 823 923 824 if ($opt_no_lazy_setup) { 825 setup_env($_) foreach (keys %required_envs); 826 } 924 # This 'global' file needs to be empty when we start 925 unlink("$prefix_abs/dns_host_file"); 827 926 828 927 if ($opt_testenv) { … … 830 929 $testenv_name = $testenv_default unless defined($testenv_name); 831 930 832 my $testenv_vars = setup_env($testenv_name); 931 my $testenv_vars = setup_env($testenv_name, $prefix); 932 933 die("Unable to setup environment $testenv_name") unless ($testenv_vars); 833 934 834 935 $ENV{PIDDIR} = $testenv_vars->{PIDDIR}; 936 $ENV{ENVNAME} = $testenv_name; 835 937 836 938 my $envvarstr = exported_envvars_str($testenv_vars); 837 939 838 my $term = ($ENV{TERM } or "xterm");839 system("$term -e'echo -e \"940 my $term = ($ENV{TERMINAL} or "xterm -e"); 941 system("$term 'echo -e \" 840 942 Welcome to the Samba4 Test environment '$testenv_name' 841 943 … … 850 952 \" && LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} bash'"); 851 953 teardown_env($testenv_name); 954 } elsif ($opt_list) { 955 foreach (@todo) { 956 my $cmd = $$_[2]; 957 my $name = $$_[0]; 958 my $envname = $$_[1]; 959 960 unless($cmd =~ /\$LISTOPT/) { 961 warn("Unable to list tests in $name"); 962 next; 963 } 964 965 $cmd =~ s/\$LISTOPT/--list/g; 966 967 system($cmd); 968 969 if ($? == -1) { 970 die("Unable to run $cmd: $!"); 971 } elsif ($? & 127) { 972 die(snprintf("%s died with signal %d, %s coredump\n", $cmd, ($? & 127), ($? & 128) ? 'with' : 'without')); 973 } 974 975 my $exitcode = $? >> 8; 976 if ($exitcode != 0) { 977 die("$cmd exited with exit code $exitcode"); 978 } 979 } 852 980 } else { 853 981 foreach (@todo) { 854 982 $i++; 855 983 my $cmd = $$_[2]; 856 $cmd =~ s/([\(\)])/\\$1/g;857 984 my $name = $$_[0]; 858 985 my $envname = $$_[1]; 859 860 my $envvars = setup_env($envname );986 987 my $envvars = setup_env($envname, $prefix); 861 988 if (not defined($envvars)) { 862 Subunit::skip_testsuite($name, 863 "unable to set up environment $envname"); 989 Subunit::start_testsuite($name); 990 Subunit::end_testsuite($name, "error", 991 "unable to set up environment $envname - exiting"); 864 992 next; 865 993 } 866 994 995 # Generate a file with the individual tests to run, if the 996 # test runner for this test suite supports it. 997 if ($individual_tests and $individual_tests->{$name}) { 998 if ($$_[3]) { 999 my ($fh, $listid_file) = tempfile(UNLINK => 0); 1000 foreach my $test (@{$individual_tests->{$name}}) { 1001 print $fh substr($test, length($name)+1) . "\n"; 1002 } 1003 $cmd =~ s/\$LOADLIST/--load-list=$listid_file/g; 1004 } elsif ($$_[4]) { 1005 $cmd =~ s/\s+[^\s]+\s*$//; 1006 $cmd .= " " . join(' ', @{$individual_tests->{$name}}); 1007 } 1008 } 1009 867 1010 run_testsuite($envname, $name, $cmd, $i, $suitestotal); 868 1011 869 if (defined($opt_analyse_cmd)) {870 system("$opt_analyse_cmd \"$name\"");871 }872 873 1012 teardown_env($envname) if ($opt_resetup_env); 874 1013 } … … 878 1017 879 1018 teardown_env($_) foreach (keys %running_envs); 880 881 $target->stop();882 1019 883 1020 my $failed = 0; … … 886 1023 foreach (<$prefix/valgrind.log*>) { 887 1024 next unless (-s $_); 888 system("grep DWARF2.CFI.reader $_ > /dev/null"); 889 if ($? >> 8 == 0) { 890 print "VALGRIND FAILURE\n"; 891 $failed++; 892 system("cat $_"); 893 } 1025 print "VALGRIND FAILURE\n"; 1026 $failed++; 1027 system("cat $_"); 894 1028 } 895 1029 exit 0; -
trunk/server/selftest/target/Kvm.pm
r414 r745 160 160 } 161 161 162 sub stop($)163 {164 my ($self) = @_;165 }166 167 162 1; -
trunk/server/selftest/target/Samba3.pm
r414 r745 25 25 26 26 sub new($$) { 27 my ($classname, $bindir) = @_; 28 my $self = { bindir => $bindir }; 27 my ($classname, $bindir, $srcdir) = @_; 28 my $self = { bindir => $bindir, 29 srcdir => $srcdir 30 }; 29 31 bless $self; 30 32 return $self; … … 97 99 my ($self, $envname, $path) = @_; 98 100 99 if ($envname eq "dc") { 100 return $self->setup_dc("$path/dc"); 101 if ($envname eq "s3dc") { 102 return $self->setup_dc("$path/s3dc"); 103 } elsif ($envname eq "secshare") { 104 return $self->setup_secshare("$path/secshare"); 105 } elsif ($envname eq "secserver") { 106 if (not defined($self->{vars}->{s3dc})) { 107 $self->setup_dc("$path/s3dc"); 108 } 109 return $self->setup_secserver("$path/secserver", $self->{vars}->{s3dc}); 101 110 } elsif ($envname eq "member") { 102 if (not defined($self->{vars}->{ dc})) {103 $self->setup_dc("$path/ dc");104 } 105 return $self->setup_member("$path/member", $self->{vars}->{ dc});111 if (not defined($self->{vars}->{s3dc})) { 112 $self->setup_dc("$path/s3dc"); 113 } 114 return $self->setup_member("$path/member", $self->{vars}->{s3dc}); 106 115 } else { 107 116 return undef; … … 113 122 my ($self, $path) = @_; 114 123 115 print "PROVISIONING DC...";116 117 my $ dc_options = "124 print "PROVISIONING S3DC..."; 125 126 my $s3dc_options = " 118 127 domain master = yes 119 128 domain logons = yes … … 122 131 123 132 my $vars = $self->provision($path, 124 "LOCAL DC2",133 "LOCALS3DC2", 125 134 2, 126 "local dc2pass",127 $ dc_options);135 "locals3dc2pass", 136 $s3dc_options); 128 137 129 138 $self->check_or_start($vars, … … 133 142 $self->wait_for_start($vars); 134 143 135 $self->{vars}->{dc} = $vars; 144 $vars->{DC_SERVER} = $vars->{SERVER}; 145 $vars->{DC_SERVER_IP} = $vars->{SERVER_IP}; 146 $vars->{DC_NETBIOSNAME} = $vars->{NETBIOSNAME}; 147 $vars->{DC_USERNAME} = $vars->{USERNAME}; 148 $vars->{DC_PASSWORD} = $vars->{PASSWORD}; 149 150 $self->{vars}->{s3dc} = $vars; 136 151 137 152 return $vars; … … 140 155 sub setup_member($$$) 141 156 { 142 my ($self, $prefix, $ dcvars) = @_;157 my ($self, $prefix, $s3dcvars) = @_; 143 158 144 159 print "PROVISIONING MEMBER..."; … … 159 174 my $cmd = ""; 160 175 $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" "; 161 $cmd .= "$net join $ret->{CONFIGURATION} $ dcvars->{DOMAIN} member";162 $cmd .= " -U$ dcvars->{USERNAME}\%$dcvars->{PASSWORD}";176 $cmd .= "$net join $ret->{CONFIGURATION} $s3dcvars->{DOMAIN} member"; 177 $cmd .= " -U$s3dcvars->{USERNAME}\%$s3dcvars->{PASSWORD}"; 163 178 164 179 system($cmd) == 0 or die("Join failed\n$cmd"); … … 170 185 $self->wait_for_start($ret); 171 186 172 $ret->{DC_SERVER} = $ dcvars->{SERVER};173 $ret->{DC_SERVER_IP} = $ dcvars->{SERVER_IP};174 $ret->{DC_NETBIOSNAME} = $ dcvars->{NETBIOSNAME};175 $ret->{DC_USERNAME} = $ dcvars->{USERNAME};176 $ret->{DC_PASSWORD} = $ dcvars->{PASSWORD};187 $ret->{DC_SERVER} = $s3dcvars->{SERVER}; 188 $ret->{DC_SERVER_IP} = $s3dcvars->{SERVER_IP}; 189 $ret->{DC_NETBIOSNAME} = $s3dcvars->{NETBIOSNAME}; 190 $ret->{DC_USERNAME} = $s3dcvars->{USERNAME}; 191 $ret->{DC_PASSWORD} = $s3dcvars->{PASSWORD}; 177 192 178 193 return $ret; 179 194 } 180 195 181 sub stop($) 182 { 183 my ($self) = @_; 196 sub setup_secshare($$) 197 { 198 my ($self, $path) = @_; 199 200 print "PROVISIONING server with security=share..."; 201 202 my $secshare_options = " 203 security = share 204 lanman auth = yes 205 "; 206 207 my $vars = $self->provision($path, 208 "LOCALSHARE4", 209 4, 210 "local4pass", 211 $secshare_options); 212 213 $self->check_or_start($vars, 214 ($ENV{SMBD_MAXTIME} or 2700), 215 "yes", "no", "yes"); 216 217 $self->wait_for_start($vars); 218 219 $self->{vars}->{secshare} = $vars; 220 221 return $vars; 222 } 223 224 sub setup_secserver($$$) 225 { 226 my ($self, $prefix, $s3dcvars) = @_; 227 228 print "PROVISIONING server with security=server..."; 229 230 my $secserver_options = " 231 security = server 232 password server = $s3dcvars->{SERVER_IP} 233 "; 234 235 my $ret = $self->provision($prefix, 236 "LOCALSERVER5", 237 5, 238 "localserver5pass", 239 $secserver_options); 240 241 $ret or die("Unable to provision"); 242 243 $self->check_or_start($ret, 244 ($ENV{SMBD_MAXTIME} or 2700), 245 "yes", "no", "yes"); 246 247 $self->wait_for_start($ret); 248 249 $ret->{DC_SERVER} = $s3dcvars->{SERVER}; 250 $ret->{DC_SERVER_IP} = $s3dcvars->{SERVER_IP}; 251 $ret->{DC_NETBIOSNAME} = $s3dcvars->{NETBIOSNAME}; 252 $ret->{DC_USERNAME} = $s3dcvars->{USERNAME}; 253 $ret->{DC_PASSWORD} = $s3dcvars->{PASSWORD}; 254 255 return $ret; 184 256 } 185 257 … … 226 298 227 299 $ENV{WINBINDD_SOCKET_DIR} = $env_vars->{WINBINDD_SOCKET_DIR}; 300 $ENV{NMBD_SOCKET_DIR} = $env_vars->{NMBD_SOCKET_DIR}; 228 301 229 302 $ENV{NSS_WRAPPER_PASSWD} = $env_vars->{NSS_WRAPPER_PASSWD}; … … 253 326 } 254 327 255 exec(@preargs, $self->binpath("nmbd"), "-F", "- S", "--no-process-group", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start nmbd: $!");328 exec(@preargs, $self->binpath("nmbd"), "-F", "--no-process-group", "-S", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start nmbd: $!"); 256 329 } 257 330 write_pid($env_vars, "nmbd", $pid); … … 268 341 269 342 $ENV{WINBINDD_SOCKET_DIR} = $env_vars->{WINBINDD_SOCKET_DIR}; 343 $ENV{NMBD_SOCKET_DIR} = $env_vars->{NMBD_SOCKET_DIR}; 270 344 271 345 $ENV{NSS_WRAPPER_PASSWD} = $env_vars->{NSS_WRAPPER_PASSWD}; … … 295 369 } 296 370 297 exec(@preargs, $self->binpath("winbindd"), "-F", "- S", "--no-process-group", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start winbindd: $!");371 exec(@preargs, $self->binpath("winbindd"), "-F", "--no-process-group", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start winbindd: $!"); 298 372 } 299 373 write_pid($env_vars, "winbindd", $pid); … … 310 384 311 385 $ENV{WINBINDD_SOCKET_DIR} = $env_vars->{WINBINDD_SOCKET_DIR}; 386 $ENV{NMBD_SOCKET_DIR} = $env_vars->{NMBD_SOCKET_DIR}; 312 387 313 388 $ENV{NSS_WRAPPER_PASSWD} = $env_vars->{NSS_WRAPPER_PASSWD}; … … 334 409 @preargs = split(/ /,$ENV{SMBD_VALGRIND}); 335 410 } 336 exec(@preargs, $self->binpath("smbd"), "-F", "- S", "--no-process-group", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start smbd: $!");411 exec(@preargs, $self->binpath("smbd"), "-F", "--no-process-group", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start smbd: $!"); 337 412 } 338 413 write_pid($env_vars, "smbd", $pid); … … 340 415 341 416 return 0; 342 }343 344 sub create_clientconf($$$)345 {346 my ($self, $prefix, $domain) = @_;347 348 my $lockdir = "$prefix/locks";349 my $logdir = "$prefix/logs";350 my $piddir = "$prefix/pid";351 my $privatedir = "$prefix/private";352 my $conffile = "$prefix/smb.conf";353 354 my $torture_interfaces='127.0.0.6/8,127.0.0.7/8,127.0.0.8/8,127.0.0.9/8,127.0.0.10/8,127.0.0.11/8';355 open(CONF, ">$conffile");356 print CONF "357 [global]358 workgroup = $domain359 360 private dir = $privatedir361 pid directory = $piddir362 lock directory = $lockdir363 log file = $logdir/log.\%m364 log level = 0365 366 name resolve order = bcast367 368 netbios name = TORTURE_6369 interfaces = $torture_interfaces370 panic action = $RealBin/gdb_backtrace \%d %\$(MAKE_TEST_BINARY)371 372 passdb backend = tdbsam373 ";374 close(CONF);375 417 } 376 418 … … 395 437 my $prefix_abs = abs_path($prefix); 396 438 my $bindir_abs = abs_path($self->{bindir}); 439 my $vfs_modulesdir_abs = ($ENV{VFSLIBDIR} or $bindir_abs); 397 440 398 441 my @dirs = (); … … 413 456 push(@dirs,$lockdir); 414 457 458 my $eventlogdir="$prefix_abs/lockdir/eventlog"; 459 push(@dirs,$eventlogdir); 460 415 461 my $logdir="$prefix_abs/logs"; 416 462 push(@dirs,$logdir); 463 464 my $driver32dir="$shrdir/W32X86"; 465 push(@dirs,$driver32dir); 466 467 my $driver64dir="$shrdir/x64"; 468 push(@dirs,$driver64dir); 469 470 my $driver40dir="$shrdir/WIN40"; 471 push(@dirs,$driver40dir); 472 473 my $ro_shrdir="$shrdir/root-tmp"; 474 push(@dirs,$ro_shrdir); 475 476 my $msdfs_shrdir="$shrdir/msdfsshare"; 477 push(@dirs,$msdfs_shrdir); 478 479 my $msdfs_deeppath="$msdfs_shrdir/deeppath"; 480 push(@dirs,$msdfs_deeppath); 417 481 418 482 # this gets autocreated by winbindd 419 483 my $wbsockdir="$prefix_abs/winbindd"; 420 484 my $wbsockprivdir="$lockdir/winbindd_privileged"; 485 486 my $nmbdsockdir="$prefix_abs/nmbd"; 487 unlink($nmbdsockdir); 421 488 422 489 ## … … 431 498 mkdir($_, 0777) foreach(@dirs); 432 499 500 ## 501 ## create ro and msdfs share layout 502 ## 503 504 chmod 0755, $ro_shrdir; 505 my $unreadable_file = "$ro_shrdir/unreadable_file"; 506 open(UNREADABLE_FILE, ">$unreadable_file") or die("Unable to open $unreadable_file"); 507 close(UNREADABLE_FILE); 508 chmod 0600, $unreadable_file; 509 510 my $msdfs_target = "$ro_shrdir/msdfs-target"; 511 open(MSDFS_TARGET, ">$msdfs_target") or die("Unable to open $msdfs_target"); 512 close(MSDFS_TARGET); 513 chmod 0666, $msdfs_target; 514 symlink "msdfs:$server_ip\\ro-tmp", "$msdfs_shrdir/msdfs-src1"; 515 symlink "msdfs:$server_ip\\ro-tmp", "$msdfs_shrdir/deeppath/msdfs-src2"; 516 433 517 my $conffile="$libdir/server.conf"; 434 518 435 my $nss_wrapper_pl = "$ENV{PERL} $ RealBin/../lib/nss_wrapper/nss_wrapper.pl";519 my $nss_wrapper_pl = "$ENV{PERL} $self->{srcdir}/lib/nss_wrapper/nss_wrapper.pl"; 436 520 my $nss_wrapper_passwd = "$privatedir/passwd"; 437 521 my $nss_wrapper_group = "$privatedir/group"; 522 523 my $mod_printer_pl = "$ENV{PERL} $self->{srcdir}/source3/script/tests/printing/modprinter.pl"; 524 525 my @eventlog_list = ("dns server", "application"); 526 527 ## 528 ## calculate uids and gids 529 ## 530 531 my ($max_uid, $max_gid); 532 my ($uid_nobody, $uid_root); 533 my ($gid_nobody, $gid_nogroup, $gid_root, $gid_domusers); 534 535 if ($unix_uid < 0xffff - 2) { 536 $max_uid = 0xffff; 537 } else { 538 $max_uid = $unix_uid; 539 } 540 541 $uid_root = $max_uid - 1; 542 $uid_nobody = $max_uid - 2; 543 544 if ($unix_gids[0] < 0xffff - 3) { 545 $max_gid = 0xffff; 546 } else { 547 $max_gid = $unix_gids[0]; 548 } 549 550 $gid_nobody = $max_gid - 1; 551 $gid_nogroup = $max_gid - 2; 552 $gid_root = $max_gid - 3; 553 $gid_domusers = $max_gid - 4; 554 555 ## 556 ## create conffile 557 ## 438 558 439 559 open(CONF, ">$conffile") or die("Unable to open $conffile"); … … 443 563 interfaces = $server_ip/8 444 564 bind interfaces only = yes 445 panic action = $ RealBin/gdb_backtrace %d %\$(MAKE_TEST_BINARY)565 panic action = $self->{srcdir}/selftest/gdb_backtrace %d %\$(MAKE_TEST_BINARY) 446 566 447 567 workgroup = $domain … … 452 572 log file = $logdir/log.\%m 453 573 log level = 0 574 debug pid = yes 454 575 455 576 name resolve order = bcast … … 462 583 time server = yes 463 584 464 add user script = $nss_wrapper_pl --passwd_path $nss_wrapper_passwd --type passwd --action add --name %u 585 add user script = $nss_wrapper_pl --passwd_path $nss_wrapper_passwd --type passwd --action add --name %u --gid $gid_nogroup 465 586 add group script = $nss_wrapper_pl --group_path $nss_wrapper_group --type group --action add --name %g 466 add machine script = $nss_wrapper_pl --passwd_path $nss_wrapper_passwd --type passwd --action add --name %u 587 add machine script = $nss_wrapper_pl --passwd_path $nss_wrapper_passwd --type passwd --action add --name %u --gid $gid_nogroup 467 588 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 468 589 delete user script = $nss_wrapper_pl --passwd_path $nss_wrapper_passwd --type passwd --action delete --name %u … … 470 591 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 471 592 593 addprinter command = $mod_printer_pl -a -s $conffile -- 594 deleteprinter command = $mod_printer_pl -d -s $conffile -- 595 596 eventlog list = application \"dns server\" 597 472 598 kernel oplocks = no 473 599 kernel change notify = no … … 478 604 479 605 winbindd:socket dir = $wbsockdir 480 idmap uid = 100000-200000 481 idmap gid = 100000-200000 606 nmbd:socket dir = $nmbdsockdir 607 idmap config * : range = 100000-200000 608 winbind enum users = yes 609 winbind enum groups = yes 482 610 483 611 # min receivefile size = 4000 484 612 613 max protocol = SMB2 485 614 read only = no 615 server signing = auto 616 486 617 smbd:sharedelay = 100000 487 smbd:writetimeupdatedelay = 500000 488 map hidden = yes 489 map system = yes 618 # smbd:writetimeupdatedelay = 500000 619 map hidden = no 620 map system = no 621 map readonly = no 622 store dos attributes = yes 490 623 create mask = 755 491 vfs objects = $bindir_abs/xattr_tdb.so $bindir_abs/streams_depot.so 492 493 # Begin extra options 494 $extra_options 495 # End extra options 496 497 #Include user defined custom parameters if set 498 "; 499 500 if (defined($ENV{INCLUDE_CUSTOM_CONF})) { 501 print CONF "\t$ENV{INCLUDE_CUSTOM_CONF}\n"; 502 } 503 504 print CONF " 505 [tmp] 506 path = $shrdir 507 [hideunread] 508 copy = tmp 509 hide unreadable = yes 510 [hideunwrite] 511 copy = tmp 512 hide unwriteable files = yes 513 [print1] 514 copy = tmp 515 printable = yes 624 vfs objects = $vfs_modulesdir_abs/xattr_tdb.so $vfs_modulesdir_abs/streams_depot.so 625 516 626 printing = vlp 517 627 print command = $bindir_abs/vlp tdbfile=$lockdir/vlp.tdb print %p %s … … 522 632 queue pause command = $bindir_abs/vlp tdbfile=$lockdir/vlp.tdb queuepause %p 523 633 queue resume command = $bindir_abs/vlp tdbfile=$lockdir/vlp.tdb queueresume %p 634 lpq cache time = 0 635 636 ncalrpc dir = $lockdir/ncalrpc 637 rpc_server:epmapper = embedded 638 639 # Begin extra options 640 $extra_options 641 # End extra options 642 643 #Include user defined custom parameters if set 644 "; 645 646 if (defined($ENV{INCLUDE_CUSTOM_CONF})) { 647 print CONF "\t$ENV{INCLUDE_CUSTOM_CONF}\n"; 648 } 649 650 print CONF " 651 [tmp] 652 path = $shrdir 653 [tmpguest] 654 path = $shrdir 655 guest ok = yes 656 [guestonly] 657 path = $shrdir 658 guest only = yes 659 guest ok = yes 660 [forceuser] 661 path = $shrdir 662 force user = $unix_name 663 guest ok = yes 664 [forcegroup] 665 path = $shrdir 666 force group = nogroup 667 guest ok = yes 668 [ro-tmp] 669 path = $ro_shrdir 670 guest ok = yes 671 [msdfs-share] 672 path = $msdfs_shrdir 673 msdfs root = yes 674 guest ok = yes 675 [hideunread] 676 copy = tmp 677 hide unreadable = yes 678 [tmpcase] 679 copy = tmp 680 case sensitive = yes 681 [hideunwrite] 682 copy = tmp 683 hide unwriteable files = yes 684 [print1] 685 copy = tmp 686 printable = yes 524 687 525 688 [print2] … … 527 690 [print3] 528 691 copy = print1 529 [ print4]692 [lp] 530 693 copy = print1 694 [print\$] 695 copy = tmp 531 696 "; 532 697 close(CONF); … … 537 702 538 703 open(PASSWD, ">$nss_wrapper_passwd") or die("Unable to open $nss_wrapper_passwd"); 539 print PASSWD "nobody:x:65534:65533:nobody gecos:$prefix_abs:/bin/false 540 root:x:65533:65532:root gecos:$prefix_abs:/bin/false 704 print PASSWD "nobody:x:$uid_nobody:$gid_nobody:nobody gecos:$prefix_abs:/bin/false 541 705 $unix_name:x:$unix_uid:$unix_gids[0]:$unix_name gecos:$prefix_abs:/bin/false 542 706 "; 707 if ($unix_uid != 0) { 708 print PASSWD "root:x:$uid_root:$gid_root:root gecos:$prefix_abs:/bin/false"; 709 } 543 710 close(PASSWD); 544 711 545 712 open(GROUP, ">$nss_wrapper_group") or die("Unable to open $nss_wrapper_group"); 546 print GROUP "nobody:x:65533: 547 nogroup:x:65534:nobody 548 root:x:65532: 713 print GROUP "nobody:x:$gid_nobody: 714 nogroup:x:$gid_nogroup:nobody 549 715 $unix_name-group:x:$unix_gids[0]: 716 domusers:X:$gid_domusers: 550 717 "; 718 if ($unix_gids[0] != 0) { 719 print GROUP "root:x:$gid_root:"; 720 } 721 551 722 close(GROUP); 723 724 foreach my $evlog (@eventlog_list) { 725 my $evlogtdb = "$eventlogdir/$evlog.tdb"; 726 open(EVENTLOG, ">$evlogtdb") or die("Unable to open $evlogtdb"); 727 close(EVENTLOG); 728 } 552 729 553 730 $ENV{NSS_WRAPPER_PASSWD} = $nss_wrapper_passwd; … … 557 734 print PWD "$password\n$password\n"; 558 735 close(PWD) or die("Unable to set password for test account"); 559 560 delete $ENV{NSS_WRAPPER_PASSWD};561 delete $ENV{NSS_WRAPPER_GROUP};562 736 563 737 print "DONE\n"; … … 574 748 $ret{SERVER} = $server; 575 749 $ret{USERNAME} = $unix_name; 750 $ret{USERID} = $unix_uid; 576 751 $ret{DOMAIN} = $domain; 577 752 $ret{NETBIOSNAME} = $server; … … 580 755 $ret{WINBINDD_SOCKET_DIR} = $wbsockdir; 581 756 $ret{WINBINDD_PRIV_PIPE_DIR} = $wbsockprivdir; 757 $ret{NMBD_SOCKET_DIR} = $nmbdsockdir; 582 758 $ret{SOCKET_WRAPPER_DEFAULT_IFACE} = $swiface; 583 759 $ret{NSS_WRAPPER_PASSWD} = $nss_wrapper_passwd; 584 760 $ret{NSS_WRAPPER_GROUP} = $nss_wrapper_group; 585 761 $ret{NSS_WRAPPER_WINBIND_SO_PATH} = $ENV{NSS_WRAPPER_WINBIND_SO_PATH}; 762 $ret{LOCAL_PATH} = "$shrdir"; 586 763 587 764 return \%ret; … … 606 783 system($self->binpath("smbclient") ." $envvars->{CONFIGURATION} -L $envvars->{SERVER_IP} -U% -p 139 | head -2"); 607 784 785 # Ensure we have domain users mapped. 786 system($self->binpath("net") ." $envvars->{CONFIGURATION} groupmap add rid=513 unixgroup=domusers type=domain"); 787 608 788 print $self->getlog_env($envvars); 609 789 } -
trunk/server/selftest/target/Samba4.pm
r414 r745 10 10 use FindBin qw($RealBin); 11 11 use POSIX; 12 use SocketWrapper; 12 13 13 14 sub new($$$$$) { 14 my ($classname, $bindir, $ldap, $s etupdir, $exeext) = @_;15 my ($classname, $bindir, $ldap, $srcdir, $exeext) = @_; 15 16 $exeext = "" unless defined($exeext); 16 my $self = { 17 vars => {}, 18 ldap => $ldap, 19 bindir => $bindir, 20 s etupdir => $setupdir,17 my $self = { 18 vars => {}, 19 ldap => $ldap, 20 bindir => $bindir, 21 srcdir => $srcdir, 21 22 exeext => $exeext 22 23 }; … … 28 29 my ($self, $path) = @_; 29 30 30 return "$self->{bindir}/$path$self->{exeext}"; 31 my $valpath = "$self->{bindir}/$path$self->{exeext}"; 32 33 return $valpath if (-f $valpath); 34 return $path; 35 } 36 37 sub scriptdir_path($$) { 38 my ($self, $path) = @_; 39 return "$self->{srcdir}/source4/scripting/$path"; 31 40 } 32 41 … … 54 63 } 55 64 while (system("$ldbsearch -H $uri -s base -b \"\" supportedLDAPVersion > /dev/null") != 0) { 56 65 $count++; 57 66 if ($count > 40) { 58 59 67 $self->slapd_stop($env_vars); 68 return 0; 60 69 } 61 70 sleep(1); … … 68 77 my ($self, $envvars) = @_; 69 78 if ($self->{ldap} eq "fedora-ds") { 70 system("$envvars->{LDAPDIR}/slapd- samba4/stop-slapd");79 system("$envvars->{LDAPDIR}/slapd-$envvars->{LDAP_INSTANCE}/stop-slapd"); 71 80 } elsif ($self->{ldap} eq "openldap") { 72 open(IN, "<$envvars->{OPENLDAP_PIDFILE}") or 73 die("unable to open slapd pid file: $envvars->{OPENLDAP_PIDFILE}"); 81 unless (open(IN, "<$envvars->{OPENLDAP_PIDFILE}")) { 82 warn("unable to open slapd pid file: $envvars->{OPENLDAP_PIDFILE}"); 83 return 0; 84 } 74 85 kill 9, <IN>; 75 86 close(IN); … … 78 89 } 79 90 80 sub check_or_start($$$) 91 sub check_or_start($$$) 81 92 { 82 93 my ($self, $env_vars, $max_time) = @_; … … 87 98 unlink($env_vars->{SAMBA_TEST_LOG}); 88 99 89 print "STARTING SAMBA... "; 100 my $pwd = `pwd`; 101 print "STARTING SAMBA for $ENV{ENVNAME}\n"; 90 102 my $pid = fork(); 91 103 if ($pid == 0) { … … 102 114 if (defined($ENV{SAMBA_VALGRIND})) { 103 115 $valgrind = $ENV{SAMBA_VALGRIND}; 104 } 105 106 $ENV{KRB5_CONFIG} = $env_vars->{KRB5_CONFIG}; 116 } 117 118 $ENV{KRB5_CONFIG} = $env_vars->{KRB5_CONFIG}; 107 119 $ENV{WINBINDD_SOCKET_DIR} = $env_vars->{WINBINDD_SOCKET_DIR}; 108 120 … … 114 126 # Start slapd before samba, but with the fifo on stdin 115 127 if (defined($self->{ldap})) { 116 $self->slapd_start($env_vars) or 117 die("couldn't start slapd (main run)"); 128 unless($self->slapd_start($env_vars)) { 129 warn("couldn't start slapd (main run)"); 130 return undef; 131 } 118 132 } 119 133 … … 129 143 # allow selection of the process model using 130 144 # the environment varibale SAMBA_PROCESS_MODEL 131 # that allows us to change the process model for 145 # that allows us to change the process model for 132 146 # individual machines in the build farm 133 147 my $model = "single"; … … 135 149 $model = $ENV{SAMBA_PROCESS_MODEL}; 136 150 } 137 my $ret = system("$valgrind $samba $optarg $env_vars->{CONFIGURATION} -M $model -i"); 138 if ($? == -1) { 139 print "Unable to start $samba: $ret: $!\n"; 151 chomp($pwd); 152 my $cmdline = "$valgrind ${pwd}/$samba $optarg $env_vars->{CONFIGURATION} -M $model -i"; 153 my $ret = system("$cmdline"); 154 if ($ret == -1) { 155 print "Unable to start $cmdline: $ret: $!\n"; 140 156 exit 1; 141 157 } 158 my $exit = ($ret >> 8); 142 159 unlink($env_vars->{SAMBA_TEST_FIFO}); 143 my $exit = $? >> 8;144 if ( $ret == 0 ) {145 print "$samba exits with status $exit\n";160 if ($ret == 0) { 161 print "$samba exited with no error\n"; 162 exit 0; 146 163 } elsif ( $ret & 127 ) { 147 164 print "$samba got signal ".($ret & 127)." and exits with $exit!\n"; 148 165 } else { 149 $ret = $? >> 8;150 166 print "$samba failed with status $exit!\n"; 167 } 168 if ($exit == 0) { 169 $exit = -1; 151 170 } 152 171 exit $exit; … … 166 185 sleep 2; 167 186 168 # This will return quickly when things are up, but be slow if we 169 # need to wait for (eg) SSL init 187 # This will return quickly when things are up, but be slow if we 188 # need to wait for (eg) SSL init 170 189 my $nmblookup = $self->bindir_path("nmblookup"); 171 190 system("$nmblookup $testenv_vars->{CONFIGURATION} $testenv_vars->{SERVER}"); … … 192 211 open(LDIF, "|$ldbadd -H $file >/dev/null"); 193 212 print LDIF $ldif; 194 return close(LDIF);213 return(close(LDIF)); 195 214 } 196 215 … … 200 219 201 220 return $self->write_ldb_file("$privatedir/wins_config.ldb", " 202 dn: name=TORTURE_ 6,CN=PARTNERS221 dn: name=TORTURE_11,CN=PARTNERS 203 222 objectClass: wreplPartner 204 name: TORTURE_ 6205 address: 127.0.0. 6223 name: TORTURE_11 224 address: 127.0.0.11 206 225 pullInterval: 0 207 226 pushChangeCount: 0 … … 212 231 sub mk_fedora_ds($$) 213 232 { 214 my ($self, $ ldapdir) = @_;233 my ($self, $ctx) = @_; 215 234 216 235 #Make the subdirectory be as fedora DS would expect 217 my $fedora_ds_dir = "$ ldapdir/slapd-samba4";218 219 my $pidfile = "$fedora_ds_dir/logs/slapd- samba4.pid";236 my $fedora_ds_dir = "$ctx->{ldapdir}/slapd-$ctx->{ldap_instance}"; 237 238 my $pidfile = "$fedora_ds_dir/logs/slapd-$ctx->{ldap_instance}.pid"; 220 239 221 240 return ($fedora_ds_dir, $pidfile); … … 224 243 sub mk_openldap($$) 225 244 { 226 my ($self, $ ldapdir) = @_;227 228 my $slapd_conf_d = "$ ldapdir/slapd.d";229 my $pidfile = "$ ldapdir/slapd.pid";245 my ($self, $ctx) = @_; 246 247 my $slapd_conf_d = "$ctx->{ldapdir}/slapd.d"; 248 my $pidfile = "$ctx->{ldapdir}/slapd.pid"; 230 249 231 250 return ($slapd_conf_d, $pidfile); … … 261 280 close(DHFILE); 262 281 263 #Likewise, we pregenerate the key material. This allows the 282 #Likewise, we pregenerate the key material. This allows the 264 283 #other certificates to be pre-generated 265 284 open(KEYFILE, ">$keyfile"); … … 303 322 EOF 304 323 305 #generated with 324 #generated with 306 325 # hxtool issue-certificate --self-signed --issue-ca \ 307 326 # --ca-private-key="FILE:$KEYFILE" \ … … 327 346 EOF 328 347 329 #generated with GNUTLS internally in Samba. 348 #generated with GNUTLS internally in Samba. 330 349 331 350 open(CERTFILE, ">$certfile"); … … 441 460 } 442 461 443 # 444 # provision_raw_prepare() is also used by Samba34.pm! 445 # 446 sub provision_raw_prepare($$$$$$$) 447 { 448 my ($self, $prefix, $server_role, $netbiosname, $netbiosalias, $swiface, $password, $kdc_ipv4) = @_; 449 my $ctx; 450 451 -d $prefix or mkdir($prefix, 0777) or die("Unable to create $prefix"); 452 my $prefix_abs = abs_path($prefix); 453 454 die ("prefix=''") if $prefix_abs eq ""; 455 die ("prefix='/'") if $prefix_abs eq "/"; 456 457 (system("rm -rf $prefix_abs/*") == 0) or die("Unable to clean up"); 458 459 $ctx->{prefix} = $prefix; 460 $ctx->{prefix_abs} = $prefix_abs; 461 $ctx->{server_role} = $server_role; 462 $ctx->{netbiosname} = $netbiosname; 463 $ctx->{netbiosalias} = $netbiosalias; 464 $ctx->{swiface} = $swiface; 465 $ctx->{password} = $password; 466 $ctx->{kdc_ipv4} = $kdc_ipv4; 467 468 $ctx->{server_loglevel} = 1; 469 $ctx->{username} = "Administrator"; 470 $ctx->{domain} = "SAMBADOMAIN"; 471 $ctx->{realm} = "SAMBA.EXAMPLE.COM"; 472 $ctx->{dnsname} = "samba.example.com"; 473 $ctx->{basedn} = "dc=samba,dc=example,dc=com"; 474 475 my $unix_name = ($ENV{USER} or $ENV{LOGNAME} or `whoami`); 476 chomp $unix_name; 477 $ctx->{unix_name} = $unix_name; 478 $ctx->{unix_uid} = $>; 479 $ctx->{unix_gids_str} = $); 480 @{$ctx->{unix_gids}} = split(" ", $ctx->{unix_gids_str}); 481 482 $ctx->{etcdir} = "$prefix_abs/etc"; 483 $ctx->{piddir} = "$prefix_abs/pid"; 484 $ctx->{smb_conf} = "$ctx->{etcdir}/smb.conf"; 485 $ctx->{krb5_conf} = "$ctx->{etcdir}/krb5.conf"; 486 $ctx->{privatedir} = "$prefix_abs/private"; 487 $ctx->{ncalrpcdir} = "$prefix_abs/ncalrpc"; 488 $ctx->{lockdir} = "$prefix_abs/lockdir"; 489 $ctx->{winbindd_socket_dir} = "$prefix_abs/winbindd_socket"; 490 $ctx->{winbindd_privileged_socket_dir} = "$prefix_abs/winbindd_privileged_socket"; 491 $ctx->{ntp_signd_socket_dir} = "$prefix_abs/ntp_signd_socket"; 492 $ctx->{nsswrap_passwd} = "$ctx->{etcdir}/passwd"; 493 $ctx->{nsswrap_group} = "$ctx->{etcdir}/group"; 494 495 $ctx->{tlsdir} = "$ctx->{privatedir}/tls"; 496 497 $ctx->{ipv4} = "127.0.0.$swiface"; 498 $ctx->{interfaces} = "$ctx->{ipv4}/8"; 499 500 $ctx->{localbasedn} = $ctx->{basedn}; 501 $ctx->{localbasedn} = "CN=$netbiosname" if $server_role eq "member server"; 502 503 push(@{$ctx->{directories}}, $ctx->{privatedir}); 504 push(@{$ctx->{directories}}, $ctx->{etcdir}); 505 push(@{$ctx->{directories}}, $ctx->{piddir}); 506 push(@{$ctx->{directories}}, $ctx->{ncalrpcdir}); 507 push(@{$ctx->{directories}}, $ctx->{lockdir}); 508 509 $ctx->{smb_conf_extra_options} = ""; 510 511 my @provision_options = (); 512 push (@provision_options, "NSS_WRAPPER_PASSWD=\"$ctx->{nsswrap_passwd}\""); 513 push (@provision_options, "NSS_WRAPPER_GROUP=\"$ctx->{nsswrap_group}\""); 514 if (defined($ENV{GDB_PROVISION})) { 515 push (@provision_options, "gdb --args"); 516 } 517 if (defined($ENV{VALGRIND_PROVISION})) { 518 push (@provision_options, "valgrind"); 519 } 520 if (defined($ENV{PYTHON})) { 521 push (@provision_options, $ENV{PYTHON}); 522 } 523 push (@provision_options, "$self->{setupdir}/provision"); 524 push (@provision_options, "--configfile=$ctx->{smb_conf}"); 525 push (@provision_options, "--host-name=$ctx->{netbiosname}"); 526 push (@provision_options, "--host-ip=$ctx->{ipv4}"); 527 push (@provision_options, "--quiet"); 528 push (@provision_options, "--domain=$ctx->{domain}"); 529 push (@provision_options, "--realm=$ctx->{realm}"); 530 push (@provision_options, "--adminpass=$ctx->{password}"); 531 push (@provision_options, "--krbtgtpass=krbtgt$ctx->{password}"); 532 push (@provision_options, "--machinepass=machine$ctx->{password}"); 533 push (@provision_options, "--root=$ctx->{unix_name}"); 534 push (@provision_options, "--server-role=\"$ctx->{server_role}\""); 535 536 @{$ctx->{provision_options}} = @provision_options; 537 538 return $ctx; 539 } 540 541 # 542 # provision_raw_step1() is also used by Samba34.pm! 543 # 544 # Step1 creates the basic configuration 545 # 546 sub provision_raw_step1($$) 462 sub mk_krb5_conf($$) 547 463 { 548 464 my ($self, $ctx) = @_; 549 465 550 mkdir($_, 0777) foreach (@{$ctx->{directories}}); 551 552 open(CONFFILE, ">$ctx->{smb_conf}") 553 or die("can't open $ctx->{smb_conf}$?"); 554 print CONFFILE " 555 [global] 556 netbios name = $ctx->{netbiosname} 557 netbios aliases = $ctx->{netbiosalias} 558 workgroup = $ctx->{domain} 559 realm = $ctx->{realm} 560 private dir = $ctx->{privatedir} 561 pid directory = $ctx->{piddir} 562 ncalrpc dir = $ctx->{ncalrpcdir} 563 lock dir = $ctx->{lockdir} 564 setup directory = $self->{setupdir} 565 modules dir = $self->{bindir}/modules 566 winbindd socket directory = $ctx->{winbindd_socket_dir} 567 winbindd privileged socket directory = $ctx->{winbindd_privileged_socket_dir} 568 ntp signd socket directory = $ctx->{ntp_signd_socket_dir} 569 winbind separator = / 570 name resolve order = bcast 571 interfaces = $ctx->{interfaces} 572 tls dh params file = $ctx->{tlsdir}/dhparms.pem 573 panic action = $RealBin/gdb_backtrace \%PID% \%PROG% 574 wins support = yes 575 server role = $ctx->{server_role} 576 notify:inotify = false 577 ldb:nosync = true 578 #We don't want to pass our self-tests if the PAC code is wrong 579 gensec:require_pac = true 580 log level = $ctx->{server_loglevel} 581 lanman auth = Yes 582 583 # Begin extra options 584 $ctx->{smb_conf_extra_options} 585 # End extra options 586 "; 587 close(CONFFILE); 588 589 $self->mk_keyblobs($ctx->{tlsdir}); 590 591 open(KRB5CONF, ">$ctx->{krb5_conf}") 592 or die("can't open $ctx->{krb5_conf}$?"); 466 unless (open(KRB5CONF, ">$ctx->{krb5_conf}")) { 467 warn("can't open $ctx->{krb5_conf}$?"); 468 return undef; 469 } 593 470 print KRB5CONF " 594 471 #Generated krb5.conf for $ctx->{realm} … … 600 477 ticket_lifetime = 24h 601 478 forwardable = yes 479 allow_weak_crypto = yes 602 480 603 481 [realms] … … 630 508 "; 631 509 close(KRB5CONF); 510 } 511 512 sub provision_raw_prepare($$$$$$$$$$) 513 { 514 my ($self, $prefix, $server_role, $netbiosname, $netbiosalias, 515 $domain, $realm, $functional_level, 516 $swiface, $password, $kdc_ipv4) = @_; 517 my $ctx; 518 519 unless(-d $prefix or mkdir($prefix, 0777)) { 520 warn("Unable to create $prefix"); 521 return undef; 522 } 523 my $prefix_abs = abs_path($prefix); 524 525 die ("prefix=''") if $prefix_abs eq ""; 526 die ("prefix='/'") if $prefix_abs eq "/"; 527 528 unless (system("rm -rf $prefix_abs/*") == 0) { 529 warn("Unable to clean up"); 530 } 531 532 $ctx->{prefix} = $prefix; 533 $ctx->{prefix_abs} = $prefix_abs; 534 535 $ctx->{dns_host_file} = "$ENV{SELFTEST_PREFIX}/dns_host_file"; 536 537 $ctx->{server_role} = $server_role; 538 $ctx->{netbiosname} = $netbiosname; 539 $ctx->{netbiosalias} = $netbiosalias; 540 $ctx->{swiface} = $swiface; 541 $ctx->{password} = $password; 542 $ctx->{kdc_ipv4} = $kdc_ipv4; 543 544 $ctx->{server_loglevel} =$ENV{SERVER_LOG_LEVEL} || 1; 545 $ctx->{username} = "Administrator"; 546 $ctx->{domain} = $domain; 547 $ctx->{realm} = uc($realm); 548 $ctx->{dnsname} = lc($realm); 549 $ctx->{sid_generator} = "internal"; 550 551 $ctx->{functional_level} = $functional_level; 552 553 my $unix_name = ($ENV{USER} or $ENV{LOGNAME} or `whoami`); 554 chomp $unix_name; 555 $ctx->{unix_name} = $unix_name; 556 $ctx->{unix_uid} = $>; 557 $ctx->{unix_gids_str} = $); 558 @{$ctx->{unix_gids}} = split(" ", $ctx->{unix_gids_str}); 559 560 $ctx->{etcdir} = "$prefix_abs/etc"; 561 $ctx->{piddir} = "$prefix_abs/pid"; 562 $ctx->{smb_conf} = "$ctx->{etcdir}/smb.conf"; 563 $ctx->{krb5_conf} = "$ctx->{etcdir}/krb5.conf"; 564 $ctx->{privatedir} = "$prefix_abs/private"; 565 $ctx->{ncalrpcdir} = "$prefix_abs/ncalrpc"; 566 $ctx->{lockdir} = "$prefix_abs/lockdir"; 567 $ctx->{winbindd_socket_dir} = "$prefix_abs/winbindd_socket"; 568 $ctx->{winbindd_privileged_socket_dir} = "$prefix_abs/winbindd_privileged_socket"; 569 $ctx->{ntp_signd_socket_dir} = "$prefix_abs/ntp_signd_socket"; 570 $ctx->{nsswrap_passwd} = "$ctx->{etcdir}/passwd"; 571 $ctx->{nsswrap_group} = "$ctx->{etcdir}/group"; 572 573 $ctx->{tlsdir} = "$ctx->{privatedir}/tls"; 574 575 $ctx->{ipv4} = "127.0.0.$swiface"; 576 $ctx->{interfaces} = "$ctx->{ipv4}/8"; 577 578 push(@{$ctx->{directories}}, $ctx->{privatedir}); 579 push(@{$ctx->{directories}}, $ctx->{etcdir}); 580 push(@{$ctx->{directories}}, $ctx->{piddir}); 581 push(@{$ctx->{directories}}, $ctx->{ncalrpcdir}); 582 push(@{$ctx->{directories}}, $ctx->{lockdir}); 583 584 $ctx->{smb_conf_extra_options} = ""; 585 586 my @provision_options = (); 587 push (@provision_options, "NSS_WRAPPER_PASSWD=\"$ctx->{nsswrap_passwd}\""); 588 push (@provision_options, "NSS_WRAPPER_GROUP=\"$ctx->{nsswrap_group}\""); 589 if (defined($ENV{GDB_PROVISION})) { 590 push (@provision_options, "gdb --args"); 591 if (!defined($ENV{PYTHON})) { 592 push (@provision_options, "env"); 593 push (@provision_options, "python"); 594 } 595 } 596 if (defined($ENV{VALGRIND_PROVISION})) { 597 push (@provision_options, "valgrind"); 598 if (!defined($ENV{PYTHON})) { 599 push (@provision_options, "env"); 600 push (@provision_options, "python"); 601 } 602 } 603 if (defined($ENV{PYTHON})) { 604 push (@provision_options, $ENV{PYTHON}); 605 } 606 push (@provision_options, "$self->{srcdir}/source4/setup/provision"); 607 push (@provision_options, "--configfile=$ctx->{smb_conf}"); 608 push (@provision_options, "--host-name=$ctx->{netbiosname}"); 609 push (@provision_options, "--host-ip=$ctx->{ipv4}"); 610 push (@provision_options, "--quiet"); 611 push (@provision_options, "--domain=$ctx->{domain}"); 612 push (@provision_options, "--realm=$ctx->{realm}"); 613 push (@provision_options, "--adminpass=$ctx->{password}"); 614 push (@provision_options, "--krbtgtpass=krbtgt$ctx->{password}"); 615 push (@provision_options, "--machinepass=machine$ctx->{password}"); 616 push (@provision_options, "--root=$ctx->{unix_name}"); 617 push (@provision_options, "--server-role=\"$ctx->{server_role}\""); 618 push (@provision_options, "--function-level=\"$ctx->{functional_level}\""); 619 620 @{$ctx->{provision_options}} = @provision_options; 621 622 return $ctx; 623 } 624 625 # 626 # Step1 creates the basic configuration 627 # 628 sub provision_raw_step1($$) 629 { 630 my ($self, $ctx) = @_; 631 632 mkdir($_, 0777) foreach (@{$ctx->{directories}}); 633 634 unless (open(CONFFILE, ">$ctx->{smb_conf}")) { 635 warn("can't open $ctx->{smb_conf}$?"); 636 return undef; 637 } 638 print CONFFILE " 639 [global] 640 netbios name = $ctx->{netbiosname} 641 netbios aliases = $ctx->{netbiosalias} 642 posix:eadb = $ctx->{lockdir}/eadb.tdb 643 workgroup = $ctx->{domain} 644 realm = $ctx->{realm} 645 private dir = $ctx->{privatedir} 646 pid directory = $ctx->{piddir} 647 ncalrpc dir = $ctx->{ncalrpcdir} 648 lock dir = $ctx->{lockdir} 649 winbindd socket directory = $ctx->{winbindd_socket_dir} 650 winbindd privileged socket directory = $ctx->{winbindd_privileged_socket_dir} 651 ntp signd socket directory = $ctx->{ntp_signd_socket_dir} 652 winbind separator = / 653 name resolve order = file bcast 654 interfaces = $ctx->{interfaces} 655 tls dh params file = $ctx->{tlsdir}/dhparms.pem 656 panic action = $RealBin/gdb_backtrace \%PID% \%PROG% 657 wins support = yes 658 server role = $ctx->{server_role} 659 server services = +echo 660 notify:inotify = false 661 ldb:nosync = true 662 #We don't want to pass our self-tests if the PAC code is wrong 663 gensec:require_pac = true 664 log level = $ctx->{server_loglevel} 665 lanman auth = Yes 666 rndc command = true 667 dns update command = $ENV{SRCDIR_ABS}/source4/scripting/bin/samba_dnsupdate --all-interfaces --use-file=$ctx->{dns_host_file} 668 spn update command = $ENV{SRCDIR_ABS}/source4/scripting/bin/samba_spnupdate 669 resolv:host file = $ctx->{dns_host_file} 670 dreplsrv:periodic_startup_interval = 0 671 "; 672 673 if (defined($ctx->{sid_generator}) && $ctx->{sid_generator} ne "internal") { 674 print CONFFILE " 675 sid generator = $ctx->{sid_generator}"; 676 } 677 678 print CONFFILE " 679 680 # Begin extra options 681 $ctx->{smb_conf_extra_options} 682 # End extra options 683 "; 684 close(CONFFILE); 685 686 $self->mk_keyblobs($ctx->{tlsdir}); 687 688 $self->mk_krb5_conf($ctx); 632 689 633 690 open(PWD, ">$ctx->{nsswrap_passwd}"); … … 652 709 653 710 #Ensure the config file is valid before we start 654 my $testparm = $self-> bindir_path("testparm");711 my $testparm = $self->scriptdir_path("bin/testparm"); 655 712 if (system("$testparm $configuration -v --suppress-prompt >/dev/null 2>&1") != 0) { 656 713 system("$testparm -v --suppress-prompt $configuration >&2"); 657 die("Failed to create a valid smb.conf configuration $testparm!"); 658 } 659 660 (system("($testparm $configuration -v --suppress-prompt --parameter-name=\"netbios name\" --section-name=global 2> /dev/null | grep -i \"^$ctx->{netbiosname}\" ) >/dev/null 2>&1") == 0) or die("Failed to create a valid smb.conf configuration! $self->{bindir}/testparm $configuration -v --suppress-prompt --parameter-name=\"netbios name\" --section-name=global"); 714 warn("Failed to create a valid smb.conf configuration $testparm!"); 715 return undef; 716 } 717 unless (system("($testparm $configuration -v --suppress-prompt --parameter-name=\"netbios name\" --section-name=global 2> /dev/null | grep -i \"^$ctx->{netbiosname}\" ) >/dev/null 2>&1") == 0) { 718 warn("Failed to create a valid smb.conf configuration! $testparm $configuration -v --suppress-prompt --parameter-name=\"netbios name\" --section-name=global"); 719 return undef; 720 } 661 721 662 722 my $ret = { … … 672 732 PASSWORD => $ctx->{password}, 673 733 LDAPDIR => $ctx->{ldapdir}, 734 LDAP_INSTANCE => $ctx->{ldap_instance}, 674 735 WINBINDD_SOCKET_DIR => $ctx->{winbindd_socket_dir}, 675 736 NCALRPCDIR => $ctx->{ncalrpcdir}, … … 689 750 690 751 # 691 # provision_raw_step2() is also used by Samba34.pm!692 #693 752 # Step2 runs the provision script 694 753 # … … 698 757 699 758 my $provision_cmd = join(" ", @{$ctx->{provision_options}}); 700 (system($provision_cmd) == 0) or die("Unable to provision: \n$provision_cmd\n"); 759 unless (system($provision_cmd) == 0) { 760 warn("Unable to provision: \n$provision_cmd\n"); 761 return undef; 762 } 701 763 702 764 return $ret; 703 765 } 704 766 705 sub provision($$$$$$$) 706 { 707 my ($self, $prefix, $server_role, $netbiosname, $netbiosalias, $swiface, $password, $kdc_ipv4) = @_; 767 sub provision($$$$$$$$$) 768 { 769 my ($self, $prefix, $server_role, $netbiosname, $netbiosalias, 770 $domain, $realm, $functional_level, 771 $swiface, $password, $kdc_ipv4, $extra_smbconf_options) = @_; 708 772 709 773 my $ctx = $self->provision_raw_prepare($prefix, $server_role, 710 774 $netbiosname, $netbiosalias, 775 $domain, $realm, $functional_level, 711 776 $swiface, $password, $kdc_ipv4); 712 777 … … 715 780 push(@{$ctx->{directories}}, "$ctx->{tmpdir}/test1"); 716 781 push(@{$ctx->{directories}}, "$ctx->{tmpdir}/test2"); 717 782 my $msdfs = "no"; 783 $msdfs = "yes" if ($server_role eq "domain controller"); 718 784 $ctx->{smb_conf_extra_options} = " 719 785 720 786 max xmit = 32K 721 787 server max protocol = SMB2 788 $extra_smbconf_options 789 host msdfs = $msdfs 790 lanman auth = yes 722 791 723 792 [tmp] 724 793 path = $ctx->{tmpdir} 725 794 read only = no 726 posix:sharedelay = 100000 727 posix:eadb = $ctx->{lockdir}/eadb.tdb 795 posix:sharedelay = 10000 728 796 posix:oplocktimeout = 3 729 797 posix:writetimeupdatedelay = 500000 … … 732 800 path = $ctx->{tmpdir}/test1 733 801 read only = no 734 posix:sharedelay = 100000 735 posix:eadb = $ctx->{lockdir}/eadb.tdb 802 posix:sharedelay = 10000 736 803 posix:oplocktimeout = 3 737 posix:writetimeupdatedelay = 50000 0804 posix:writetimeupdatedelay = 50000 738 805 739 806 [test2] 740 807 path = $ctx->{tmpdir}/test2 741 808 read only = no 742 posix:sharedelay = 100000 743 posix:eadb = $ctx->{lockdir}/eadb.tdb 809 posix:sharedelay = 10000 744 810 posix:oplocktimeout = 3 745 posix:writetimeupdatedelay = 50000 0811 posix:writetimeupdatedelay = 50000 746 812 747 813 [cifs] … … 779 845 $ldap_uri = "ldapi://$ldap_uri"; 780 846 $ctx->{ldap_uri} = $ldap_uri; 847 if ($self->{ldap} eq "fedora-ds") { 848 $ctx->{sid_generator} = "backend"; 849 } 850 851 $ctx->{ldap_instance} = lc($ctx->{netbiosname}); 781 852 } 782 853 783 854 my $ret = $self->provision_raw_step1($ctx); 855 unless (defined $ret) { 856 return undef; 857 } 784 858 785 859 if (defined($self->{ldap})) { 786 860 $ret->{LDAP_URI} = $ctx->{ldap_uri}; 787 861 push (@{$ctx->{provision_options}}, "--ldap-backend-type=" . $self->{ldap}); 862 push (@{$ctx->{provision_options}}, "--ldap-backend-nosync"); 788 863 if ($self->{ldap} eq "openldap") { 789 790 ($ret->{SLAPD_CONF_D}, $ret->{OPENLDAP_PIDFILE}) = $self->mk_openldap($ctx ->{ldapdir}) or die("Unable to create openldap directories");864 push (@{$ctx->{provision_options}}, "--slapd-path=" . $ENV{OPENLDAP_SLAPD}); 865 ($ret->{SLAPD_CONF_D}, $ret->{OPENLDAP_PIDFILE}) = $self->mk_openldap($ctx) or die("Unable to create openldap directories"); 791 866 792 867 } elsif ($self->{ldap} eq "fedora-ds") { 793 868 push (@{$ctx->{provision_options}}, "--slapd-path=" . "$ENV{FEDORA_DS_ROOT}/sbin/ns-slapd"); 794 869 push (@{$ctx->{provision_options}}, "--setup-ds-path=" . "$ENV{FEDORA_DS_ROOT}/sbin/setup-ds.pl"); 795 ($ret->{FEDORA_DS_DIR}, $ret->{FEDORA_DS_PIDFILE}) = $self->mk_fedora_ds($ctx->{ldapdir}) or die("Unable to create fedora ds directories"); 796 } 797 798 } 799 800 $ret = $self->provision_raw_step2($ctx, $ret); 801 802 return $ret; 870 ($ret->{FEDORA_DS_DIR}, $ret->{FEDORA_DS_PIDFILE}) = $self->mk_fedora_ds($ctx) or die("Unable to create fedora ds directories"); 871 } 872 873 } 874 875 return $self->provision_raw_step2($ctx, $ret); 803 876 } 804 877 … … 810 883 my $ret = $self->provision($prefix, 811 884 "member server", 812 "localmember3",813 885 "localmember", 886 "member3", 887 "SAMBADOMAIN", 888 "samba.example.com", 889 "2008", 814 890 3, 815 "localmemberpass", 816 $dcvars->{SERVER_IP}); 817 818 $ret or die("Unable to provision"); 819 820 my $net = $self->bindir_path("net"); 891 "locMEMpass3", 892 $dcvars->{SERVER_IP}, 893 ""); 894 unless ($ret) { 895 return undef; 896 } 897 898 my $samba_tool = $self->bindir_path("samba-tool"); 821 899 my $cmd = ""; 822 900 $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" "; 823 901 $cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" "; 824 $cmd .= "$net join $ret->{CONFIGURATION} $dcvars->{DOMAIN} member"; 825 $cmd .= " -U$dcvars->{USERNAME}\%$dcvars->{PASSWORD}"; 826 827 system($cmd) == 0 or die("Join failed\n$cmd"); 828 829 $ret->{DC_SERVER} = $dcvars->{SERVER}; 830 $ret->{DC_SERVER_IP} = $dcvars->{SERVER_IP}; 831 $ret->{DC_NETBIOSNAME} = $dcvars->{NETBIOSNAME}; 832 $ret->{DC_NETBIOSALIAS} = $dcvars->{NETBIOSALIAS}; 833 $ret->{DC_USERNAME} = $dcvars->{USERNAME}; 834 $ret->{DC_PASSWORD} = $dcvars->{PASSWORD}; 902 $cmd .= "$samba_tool join $ret->{CONFIGURATION} $dcvars->{REALM} member"; 903 $cmd .= " -U$dcvars->{DC_USERNAME}\%$dcvars->{DC_PASSWORD}"; 904 905 unless (system($cmd) == 0) { 906 warn("Join failed\n$cmd"); 907 return undef; 908 } 909 910 $ret->{MEMBER_SERVER} = $ret->{SERVER}; 911 $ret->{MEMBER_SERVER_IP} = $ret->{SERVER_IP}; 912 $ret->{MEMBER_NETBIOSNAME} = $ret->{NETBIOSNAME}; 913 $ret->{MEMBER_NETBIOSALIAS} = $ret->{NETBIOSALIAS}; 914 $ret->{MEMBER_USERNAME} = $ret->{USERNAME}; 915 $ret->{MEMBER_PASSWORD} = $ret->{PASSWORD}; 916 917 $ret->{DC_SERVER} = $dcvars->{DC_SERVER}; 918 $ret->{DC_SERVER_IP} = $dcvars->{DC_SERVER_IP}; 919 $ret->{DC_NETBIOSNAME} = $dcvars->{DC_NETBIOSNAME}; 920 $ret->{DC_NETBIOSALIAS} = $dcvars->{DC_NETBIOSALIAS}; 921 $ret->{DC_USERNAME} = $dcvars->{DC_USERNAME}; 922 $ret->{DC_PASSWORD} = $dcvars->{DC_PASSWORD}; 923 924 return $ret; 925 } 926 927 sub provision_rpc_proxy($$$) 928 { 929 my ($self, $prefix, $dcvars) = @_; 930 print "PROVISIONING RPC PROXY..."; 931 932 my $extra_smbconf_options = "dcerpc_remote:binding = ncacn_ip_tcp:localdc 933 dcerpc endpoint servers = epmapper, remote 934 dcerpc_remote:interfaces = rpcecho 935 "; 936 937 my $ret = $self->provision($prefix, 938 "member server", 939 "localrpcproxy", 940 "rpcproxy4", 941 "SAMBADOMAIN", 942 "samba.example.com", 943 "2008", 944 4, 945 "locRPCproxypass4", 946 $dcvars->{SERVER_IP}, 947 $extra_smbconf_options); 948 949 unless ($ret) { 950 return undef; 951 } 952 953 my $samba_tool = $self->bindir_path("samba-tool"); 954 my $cmd = ""; 955 $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" "; 956 $cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" "; 957 $cmd .= "$samba_tool join $ret->{CONFIGURATION} $dcvars->{REALM} member"; 958 $cmd .= " -U$dcvars->{DC_USERNAME}\%$dcvars->{DC_PASSWORD}"; 959 960 unless (system($cmd) == 0) { 961 warn("Join failed\n$cmd"); 962 return undef; 963 } 964 965 $ret->{RPC_PROXY_SERVER} = $ret->{SERVER}; 966 $ret->{RPC_PROXY_SERVER_IP} = $ret->{SERVER_IP}; 967 $ret->{RPC_PROXY_NETBIOSNAME} = $ret->{NETBIOSNAME}; 968 $ret->{RPC_PROXY_NETBIOSALIAS} = $ret->{NETBIOSALIAS}; 969 $ret->{RPC_PROXY_USERNAME} = $ret->{USERNAME}; 970 $ret->{RPC_PROXY_PASSWORD} = $ret->{PASSWORD}; 971 972 return $ret; 973 } 974 975 sub provision_vampire_dc($$$) 976 { 977 my ($self, $prefix, $dcvars) = @_; 978 print "PROVISIONING VAMPIRE DC..."; 979 980 # We do this so that we don't run the provision. That's the job of 'net vampire'. 981 my $ctx = $self->provision_raw_prepare($prefix, "domain controller", 982 "localvampiredc", 983 "dc2", 984 "SAMBADOMAIN", 985 "samba.example.com", 986 "2008", 987 2, $dcvars->{PASSWORD}, 988 $dcvars->{SERVER_IP}); 989 990 $ctx->{smb_conf_extra_options} = " 991 max xmit = 32K 992 server max protocol = SMB2 993 994 [sysvol] 995 path = $ctx->{lockdir}/sysvol 996 read only = yes 997 998 [netlogon] 999 path = $ctx->{lockdir}/sysvol/$ctx->{dnsname}/scripts 1000 read only = no 1001 1002 "; 1003 1004 my $ret = $self->provision_raw_step1($ctx); 1005 unless ($ret) { 1006 return undef; 1007 } 1008 1009 my $samba_tool = $self->bindir_path("samba-tool"); 1010 my $cmd = ""; 1011 $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" "; 1012 $cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" "; 1013 $cmd .= "$samba_tool join $ret->{CONFIGURATION} $dcvars->{REALM} DC --realm=$dcvars->{REALM}"; 1014 $cmd .= " -U$dcvars->{DC_USERNAME}\%$dcvars->{DC_PASSWORD}"; 1015 1016 unless (system($cmd) == 0) { 1017 warn("Join failed\n$cmd"); 1018 return undef; 1019 } 1020 1021 $ret->{VAMPIRE_DC_SERVER} = $ret->{SERVER}; 1022 $ret->{VAMPIRE_DC_SERVER_IP} = $ret->{SERVER_IP}; 1023 $ret->{VAMPIRE_DC_NETBIOSNAME} = $ret->{NETBIOSNAME}; 1024 $ret->{VAMPIRE_DC_NETBIOSALIAS} = $ret->{NETBIOSALIAS}; 1025 1026 $ret->{DC_SERVER} = $dcvars->{DC_SERVER}; 1027 $ret->{DC_SERVER_IP} = $dcvars->{DC_SERVER_IP}; 1028 $ret->{DC_NETBIOSNAME} = $dcvars->{DC_NETBIOSNAME}; 1029 $ret->{DC_NETBIOSALIAS} = $dcvars->{DC_NETBIOSALIAS}; 1030 $ret->{DC_USERNAME} = $dcvars->{DC_USERNAME}; 1031 $ret->{DC_PASSWORD} = $dcvars->{DC_PASSWORD}; 835 1032 836 1033 return $ret; … … 844 1041 my $ret = $self->provision($prefix, 845 1042 "domain controller", 846 "localdc1",847 1043 "localdc", 1044 "dc1", 1045 "SAMBADOMAIN", 1046 "samba.example.com", 1047 "2008", 848 1048 1, 849 "localdcpass", 850 "127.0.0.1"); 851 852 $self->add_wins_config("$prefix/private") or 853 die("Unable to add wins configuration"); 1049 "locDCpass1", 1050 "127.0.0.1", ""); 1051 1052 return undef unless(defined $ret); 1053 unless($self->add_wins_config("$prefix/private")) { 1054 warn("Unable to add wins configuration"); 1055 return undef; 1056 } 1057 1058 $ret->{DC_SERVER} = $ret->{SERVER}; 1059 $ret->{DC_SERVER_IP} = $ret->{SERVER_IP}; 1060 $ret->{DC_NETBIOSNAME} = $ret->{NETBIOSNAME}; 1061 $ret->{DC_NETBIOSALIAS} = $ret->{NETBIOSALIAS}; 1062 $ret->{DC_USERNAME} = $ret->{USERNAME}; 1063 $ret->{DC_PASSWORD} = $ret->{PASSWORD}; 1064 1065 return $ret; 1066 } 1067 1068 sub provision_fl2000dc($$) 1069 { 1070 my ($self, $prefix) = @_; 1071 1072 print "PROVISIONING DC..."; 1073 my $ret = $self->provision($prefix, 1074 "domain controller", 1075 "dc5", 1076 "localfl2000dc", 1077 "SAMBA2000", 1078 "samba2000.example.com", 1079 "2000", 1080 5, 1081 "locDCpass5", 1082 "127.0.0.5", ""); 1083 1084 unless($self->add_wins_config("$prefix/private")) { 1085 warn("Unable to add wins configuration"); 1086 return undef; 1087 } 1088 1089 return $ret; 1090 } 1091 1092 sub provision_fl2003dc($$) 1093 { 1094 my ($self, $prefix) = @_; 1095 1096 print "PROVISIONING DC..."; 1097 my $ret = $self->provision($prefix, 1098 "domain controller", 1099 "dc6", 1100 "localfl2003dc", 1101 "SAMBA2003", 1102 "samba2003.example.com", 1103 "2003", 1104 6, 1105 "locDCpass6", 1106 "127.0.0.6", ""); 1107 1108 unless($self->add_wins_config("$prefix/private")) { 1109 warn("Unable to add wins configuration"); 1110 return undef; 1111 } 1112 1113 return $ret; 1114 } 1115 1116 sub provision_fl2008r2dc($$) 1117 { 1118 my ($self, $prefix) = @_; 1119 1120 print "PROVISIONING DC..."; 1121 my $ret = $self->provision($prefix, 1122 "domain controller", 1123 "dc7", 1124 "localfl2000r2dc", 1125 "SAMBA2008R2", 1126 "samba2008R2.example.com", 1127 "2008_R2", 1128 7, 1129 "locDCpass7", 1130 "127.0.0.7", ""); 1131 1132 unless ($self->add_wins_config("$prefix/private")) { 1133 warn("Unable to add wins configuration"); 1134 return undef; 1135 } 1136 1137 return $ret; 1138 } 1139 1140 1141 sub provision_rodc($$$) 1142 { 1143 my ($self, $prefix, $dcvars) = @_; 1144 print "PROVISIONING RODC..."; 1145 1146 # We do this so that we don't run the provision. That's the job of 'net join RODC'. 1147 my $ctx = $self->provision_raw_prepare($prefix, "domain controller", 1148 "rodc", 1149 "dc8", 1150 "SAMBADOMAIN", 1151 "samba.example.com", 1152 "2008", 1153 8, $dcvars->{PASSWORD}, 1154 $dcvars->{SERVER_IP}); 1155 unless ($ctx) { 1156 return undef; 1157 } 1158 1159 $ctx->{tmpdir} = "$ctx->{prefix_abs}/tmp"; 1160 push(@{$ctx->{directories}}, "$ctx->{tmpdir}"); 1161 1162 $ctx->{smb_conf_extra_options} = " 1163 max xmit = 32K 1164 server max protocol = SMB2 1165 1166 [sysvol] 1167 path = $ctx->{lockdir}/sysvol 1168 read only = yes 1169 1170 [netlogon] 1171 path = $ctx->{lockdir}/sysvol/$ctx->{dnsname}/scripts 1172 read only = yes 1173 1174 [tmp] 1175 path = $ctx->{tmpdir} 1176 read only = no 1177 posix:sharedelay = 10000 1178 posix:oplocktimeout = 3 1179 posix:writetimeupdatedelay = 500000 1180 1181 "; 1182 1183 my $ret = $self->provision_raw_step1($ctx); 1184 unless ($ret) { 1185 return undef; 1186 } 1187 1188 my $samba_tool = $self->bindir_path("samba-tool"); 1189 my $cmd = ""; 1190 $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" "; 1191 $cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" "; 1192 $cmd .= "$samba_tool join $ret->{CONFIGURATION} $dcvars->{REALM} RODC"; 1193 $cmd .= " -U$dcvars->{DC_USERNAME}\%$dcvars->{DC_PASSWORD}"; 1194 $cmd .= " --server=$dcvars->{DC_SERVER}"; 1195 1196 unless (system($cmd) == 0) { 1197 warn("RODC join failed\n$cmd"); 1198 return undef; 1199 } 1200 1201 # we overwrite the kdc after the RODC join 1202 # so that use the RODC as kdc and test 1203 # the proxy code 1204 $ctx->{kdc_ipv4} = $ret->{SERVER_IP}; 1205 $self->mk_krb5_conf($ctx); 1206 1207 $ret->{RODC_DC_SERVER} = $ret->{SERVER}; 1208 $ret->{RODC_DC_SERVER_IP} = $ret->{SERVER_IP}; 1209 $ret->{RODC_DC_NETBIOSNAME} = $ret->{NETBIOSNAME}; 1210 $ret->{RODC_DC_NETBIOSALIAS} = $ret->{NETBIOSALIAS}; 1211 1212 $ret->{DC_SERVER} = $dcvars->{DC_SERVER}; 1213 $ret->{DC_SERVER_IP} = $dcvars->{DC_SERVER_IP}; 1214 $ret->{DC_NETBIOSNAME} = $dcvars->{DC_NETBIOSNAME}; 1215 $ret->{DC_NETBIOSALIAS} = $dcvars->{DC_NETBIOSALIAS}; 1216 $ret->{DC_USERNAME} = $dcvars->{DC_USERNAME}; 1217 $ret->{DC_PASSWORD} = $dcvars->{DC_PASSWORD}; 854 1218 855 1219 return $ret; … … 863 1227 close(DATA); 864 1228 865 if (-f "$envvars->{PIDDIR}/samba.pid" ) { 866 open(IN, "<$envvars->{PIDDIR}/samba.pid") or die("unable to open server pid file"); 1229 if (open(IN, "<$envvars->{PIDDIR}/samba.pid")) { 867 1230 $pid = <IN>; 868 1231 close(IN); … … 872 1235 my $count = 0; 873 1236 until (kill(0, $pid) == 0) { 874 875 876 877 878 } 879 1237 # if no process sucessfully signalled, then we are done 1238 sleep(1); 1239 $count++; 1240 last if $count > 20; 1241 } 1242 880 1243 # If it is still around, kill it 881 1244 if ($count > 20) { 882 883 1245 print "server process $pid took more than $count seconds to exit, killing\n"; 1246 kill 9, $pid; 884 1247 } 885 1248 } … … 910 1273 911 1274 return "" if $out eq $title; 912 1275 913 1276 return $out; 914 1277 } … … 918 1281 my ($self, $envvars) = @_; 919 1282 920 return 1 if (-p $envvars->{SAMBA_TEST_FIFO}); 921 922 print $self->getlog_env($envvars); 923 924 return 0; 1283 return (-p $envvars->{SAMBA_TEST_FIFO}); 925 1284 } 926 1285 … … 928 1287 { 929 1288 my ($self, $envname, $path) = @_; 1289 1290 $ENV{ENVNAME} = $envname; 930 1291 931 1292 if ($envname eq "dc") { 932 1293 return $self->setup_dc("$path/dc"); 1294 } elsif ($envname eq "fl2000dc") { 1295 return $self->setup_fl2000dc("$path/fl2000dc"); 1296 } elsif ($envname eq "fl2003dc") { 1297 return $self->setup_fl2003dc("$path/fl2003dc"); 1298 } elsif ($envname eq "fl2008r2dc") { 1299 return $self->setup_fl2008r2dc("$path/fl2008r2dc"); 1300 } elsif ($envname eq "rpc_proxy") { 1301 if (not defined($self->{vars}->{dc})) { 1302 $self->setup_dc("$path/dc"); 1303 } 1304 return $self->setup_rpc_proxy("$path/rpc_proxy", $self->{vars}->{dc}); 1305 } elsif ($envname eq "vampire_dc") { 1306 if (not defined($self->{vars}->{dc})) { 1307 $self->setup_dc("$path/dc"); 1308 } 1309 return $self->setup_vampire_dc("$path/vampire_dc", $self->{vars}->{dc}); 933 1310 } elsif ($envname eq "member") { 934 1311 if (not defined($self->{vars}->{dc})) { … … 936 1313 } 937 1314 return $self->setup_member("$path/member", $self->{vars}->{dc}); 1315 } elsif ($envname eq "rodc") { 1316 if (not defined($self->{vars}->{dc})) { 1317 $self->setup_dc("$path/dc"); 1318 } 1319 return $self->setup_rodc("$path/rodc", $self->{vars}->{dc}); 1320 } elsif ($envname eq "all") { 1321 if (not defined($self->{vars}->{dc})) { 1322 $ENV{ENVNAME} = "dc"; 1323 $self->setup_dc("$path/dc"); 1324 } 1325 my $ret = $self->setup_member("$path/member", $self->{vars}->{dc}); 1326 if (not defined($self->{vars}->{rpc_proxy})) { 1327 $ENV{ENVNAME} = "rpc_proxy"; 1328 my $rpc_proxy_ret = $self->setup_rpc_proxy("$path/rpc_proxy", $self->{vars}->{dc}); 1329 1330 $ret->{RPC_PROXY_SERVER} = $rpc_proxy_ret->{SERVER}; 1331 $ret->{RPC_PROXY_SERVER_IP} = $rpc_proxy_ret->{SERVER_IP}; 1332 $ret->{RPC_PROXY_NETBIOSNAME} = $rpc_proxy_ret->{NETBIOSNAME}; 1333 $ret->{RPC_PROXY_NETBIOSALIAS} = $rpc_proxy_ret->{NETBIOSALIAS}; 1334 $ret->{RPC_PROXY_USERNAME} = $rpc_proxy_ret->{USERNAME}; 1335 $ret->{RPC_PROXY_PASSWORD} = $rpc_proxy_ret->{PASSWORD}; 1336 } 1337 if (not defined($self->{vars}->{fl2000dc})) { 1338 $ENV{ENVNAME} = "fl2000dc"; 1339 my $fl2000dc_ret = $self->setup_fl2000dc("$path/fl2000dc", $self->{vars}->{dc}); 1340 1341 $ret->{FL2000DC_SERVER} = $fl2000dc_ret->{SERVER}; 1342 $ret->{FL2000DC_SERVER_IP} = $fl2000dc_ret->{SERVER_IP}; 1343 $ret->{FL2000DC_NETBIOSNAME} = $fl2000dc_ret->{NETBIOSNAME}; 1344 $ret->{FL2000DC_NETBIOSALIAS} = $fl2000dc_ret->{NETBIOSALIAS}; 1345 $ret->{FL2000DC_USERNAME} = $fl2000dc_ret->{USERNAME}; 1346 $ret->{FL2000DC_PASSWORD} = $fl2000dc_ret->{PASSWORD}; 1347 } 1348 if (not defined($self->{vars}->{fl2003dc})) { 1349 $ENV{ENVNAME} = "fl2003dc"; 1350 my $fl2003dc_ret = $self->setup_fl2003dc("$path/fl2003dc", $self->{vars}->{dc}); 1351 1352 $ret->{FL2003DC_SERVER} = $fl2003dc_ret->{SERVER}; 1353 $ret->{FL2003DC_SERVER_IP} = $fl2003dc_ret->{SERVER_IP}; 1354 $ret->{FL2003DC_NETBIOSNAME} = $fl2003dc_ret->{NETBIOSNAME}; 1355 $ret->{FL2003DC_NETBIOSALIAS} = $fl2003dc_ret->{NETBIOSALIAS}; 1356 $ret->{FL2003DC_USERNAME} = $fl2003dc_ret->{USERNAME}; 1357 $ret->{FL2003DC_PASSWORD} = $fl2003dc_ret->{PASSWORD}; 1358 } 1359 if (not defined($self->{vars}->{fl2008r2dc})) { 1360 $ENV{ENVNAME} = "fl2008r2dc"; 1361 my $fl2008r2dc_ret = $self->setup_fl2008r2dc("$path/fl2008r2dc", $self->{vars}->{dc}); 1362 1363 $ret->{FL2008R2DC_SERVER} = $fl2008r2dc_ret->{SERVER}; 1364 $ret->{FL2008R2DC_SERVER_IP} = $fl2008r2dc_ret->{SERVER_IP}; 1365 $ret->{FL2008R2DC_NETBIOSNAME} = $fl2008r2dc_ret->{NETBIOSNAME}; 1366 $ret->{FL2008R2DC_NETBIOSALIAS} = $fl2008r2dc_ret->{NETBIOSALIAS}; 1367 $ret->{FL2008R2DC_USERNAME} = $fl2008r2dc_ret->{USERNAME}; 1368 $ret->{FL2008R2DC_PASSWORD} = $fl2008r2dc_ret->{PASSWORD}; 1369 } 1370 return $ret; 938 1371 } else { 939 die("Samba4 can't provide environment '$envname'"); 940 } 941 } 942 943 sub setup_member($$$$) 1372 warn("Samba4 can't provide environment '$envname'"); 1373 return undef; 1374 } 1375 } 1376 1377 sub setup_member($$$) 944 1378 { 945 1379 my ($self, $path, $dc_vars) = @_; … … 947 1381 my $env = $self->provision_member($path, $dc_vars); 948 1382 949 $self->check_or_start($env, ($ENV{SMBD_MAXTIME} or 7500)); 1383 if (defined $env) { 1384 $self->check_or_start($env, ($ENV{SMBD_MAXTIME} or 7500)); 1385 1386 $self->wait_for_start($env); 1387 1388 $self->{vars}->{member} = $env; 1389 } 1390 1391 return $env; 1392 } 1393 1394 sub setup_rpc_proxy($$$) 1395 { 1396 my ($self, $path, $dc_vars) = @_; 1397 1398 my $env = $self->provision_rpc_proxy($path, $dc_vars); 1399 1400 if (defined $env) { 1401 $self->check_or_start($env, ($ENV{SMBD_MAXTIME} or 7500)); 1402 1403 $self->wait_for_start($env); 1404 1405 $self->{vars}->{rpc_proxy} = $env; 1406 } 1407 return $env; 1408 } 1409 1410 sub setup_dc($$) 1411 { 1412 my ($self, $path) = @_; 1413 1414 my $env = $self->provision_dc($path); 1415 if (defined $env) { 1416 $self->check_or_start($env, 1417 ($ENV{SMBD_MAXTIME} or 7500)); 1418 1419 $self->wait_for_start($env); 1420 1421 $self->{vars}->{dc} = $env; 1422 } 1423 return $env; 1424 } 1425 1426 sub setup_fl2000dc($$) 1427 { 1428 my ($self, $path) = @_; 1429 1430 my $env = $self->provision_fl2000dc($path); 1431 if (defined $env) { 1432 $self->check_or_start($env, 1433 ($ENV{SMBD_MAXTIME} or 7500)); 1434 1435 $self->wait_for_start($env); 1436 1437 $self->{vars}->{fl2000dc} = $env; 1438 } 1439 1440 return $env; 1441 } 1442 1443 sub setup_fl2003dc($$) 1444 { 1445 my ($self, $path) = @_; 1446 1447 my $env = $self->provision_fl2003dc($path); 1448 1449 if (defined $env) { 1450 $self->check_or_start($env, 1451 ($ENV{SMBD_MAXTIME} or 7500)); 1452 1453 $self->wait_for_start($env); 1454 1455 $self->{vars}->{fl2003dc} = $env; 1456 } 1457 return $env; 1458 } 1459 1460 sub setup_fl2008r2dc($$) 1461 { 1462 my ($self, $path) = @_; 1463 1464 my $env = $self->provision_fl2008r2dc($path); 1465 1466 if (defined $env) { 1467 $self->check_or_start($env, 1468 ($ENV{SMBD_MAXTIME} or 7500)); 1469 1470 $self->wait_for_start($env); 1471 1472 $self->{vars}->{fl2008r2dc} = $env; 1473 } 1474 1475 return $env; 1476 } 1477 1478 sub setup_vampire_dc($$$) 1479 { 1480 my ($self, $path, $dc_vars) = @_; 1481 1482 my $env = $self->provision_vampire_dc($path, $dc_vars); 1483 1484 if (defined $env) { 1485 $self->check_or_start($env, 1486 ($ENV{SMBD_MAXTIME} or 7500)); 1487 1488 $self->wait_for_start($env); 1489 1490 $self->{vars}->{vampire_dc} = $env; 1491 1492 # force replicated DC to update repsTo/repsFrom 1493 # for vampired partitions 1494 my $samba_tool = $self->bindir_path("samba-tool"); 1495 my $cmd = ""; 1496 $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$env->{SOCKET_WRAPPER_DEFAULT_IFACE}\""; 1497 $cmd .= " KRB5_CONFIG=\"$env->{KRB5_CONFIG}\""; 1498 $cmd .= " $samba_tool drs kcc $env->{DC_SERVER}"; 1499 $cmd .= " -U$dc_vars->{DC_USERNAME}\%$dc_vars->{DC_PASSWORD}"; 1500 unless (system($cmd) == 0) { 1501 warn("Failed to exec kcc\n$cmd"); 1502 return undef; 1503 } 1504 1505 # as 'vampired' dc may add data in its local replica 1506 # we need to synchronize data between DCs 1507 my $base_dn = "DC=".join(",DC=", split(/\./, $dc_vars->{REALM})); 1508 $cmd = "SOCKET_WRAPPER_DEFAULT_IFACE=\"$env->{SOCKET_WRAPPER_DEFAULT_IFACE}\""; 1509 $cmd .= " KRB5_CONFIG=\"$env->{KRB5_CONFIG}\""; 1510 $cmd .= " $samba_tool drs replicate $env->{DC_SERVER} $env->{VAMPIRE_DC_SERVER}"; 1511 $cmd .= " -U$dc_vars->{DC_USERNAME}\%$dc_vars->{DC_PASSWORD}"; 1512 # replicate Configuration NC 1513 my $cmd_repl = "$cmd \"CN=Configuration,$base_dn\""; 1514 unless(system($cmd_repl) == 0) { 1515 warn("Failed to replicate\n$cmd_repl"); 1516 return undef; 1517 } 1518 # replicate Default NC 1519 $cmd_repl = "$cmd \"$base_dn\""; 1520 unless(system($cmd_repl) == 0) { 1521 warn("Failed to replicate\n$cmd_repl"); 1522 return undef; 1523 } 1524 } 1525 1526 return $env; 1527 } 1528 1529 sub setup_rodc($$$) 1530 { 1531 my ($self, $path, $dc_vars) = @_; 1532 1533 my $env = $self->provision_rodc($path, $dc_vars); 1534 1535 unless ($env) { 1536 return undef; 1537 } 1538 1539 $self->check_or_start($env, 1540 ($ENV{SMBD_MAXTIME} or 7500)); 950 1541 951 1542 $self->wait_for_start($env); 952 1543 1544 $self->{vars}->{rodc} = $env; 1545 953 1546 return $env; 954 1547 } 955 1548 956 sub setup_dc($$)957 {958 my ($self, $path) = @_;959 960 my $env = $self->provision_dc($path);961 962 $self->check_or_start($env,963 ($ENV{SMBD_MAXTIME} or 7500));964 965 $self->wait_for_start($env);966 967 $self->{vars}->{dc} = $env;968 969 return $env;970 }971 972 sub stop($)973 {974 my ($self) = @_;975 }976 977 1549 1; -
trunk/server/selftest/target/Template.pm
r414 r745 45 45 } 46 46 47 sub stop($)48 {49 my ($self) = @_;50 }51 52 47 1; -
trunk/server/selftest/test_samba4.pl
r414 r745 7 7 use Samba4; 8 8 9 my $s = new Samba4( $RealBin."/../source4/bin", undef, $RealBin."/../setup");9 my $s = new Samba4("bin", undef, $RealBin."/../setup"); 10 10 11 11 ok($s); 12 12 13 is( $RealBin."/../source4/bin", $s->{bindir});13 is("bin", $s->{bindir}); 14 14 15 15 ok($s->write_ldb_file("tmpldb", "
Note:
See TracChangeset
for help on using the changeset viewer.