Changeset 745 for trunk/server/selftest


Ignore:
Timestamp:
Nov 27, 2012, 4:43:17 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: updated trunk to 3.6.0

Location:
trunk/server
Files:
9 deleted
11 edited
5 copied

Legend:

Unmodified
Added
Removed
  • trunk/server

  • trunk/server/selftest/README

    r414 r745  
    1111selftest.pl simply outputs subunit, which can then be formatted or analyzed
    1212by 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".
     13format-subunit, which is used by default as part of "make test".
    1414
    1515Available testsuites
    1616====================
    1717The available testsuites are obtained from a script, usually
    18 selftest/samba{3,4}_tests.sh. This script should for each testsuite output
     18source{3,4}/selftest/tests.sh. This script should for each testsuite output
    1919the name of the test, the command to run and the environment that should be
    2020provided. Use the included "plantest" function to generate the required output.
     
    3838for the last announced test.
    3939
    40 Accepted commands are:
     40For a full description of the subunit protocol, see ../lib/subunit/README.
    4141
    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:
     42The following commands are Samba extensions to Subunit:
    9043
    9144testsuite-count
     
    9649
    9750start-testsuite
    98 ~~~~~~~~~
     51~~~~~~~~~~~~~~~
    9952start-testsuite: name
    10053
  • trunk/server/selftest/Subunit.pm

    r414 r745  
    2020require Exporter;
    2121@ISA = qw(Exporter);
    22 @EXPORT_OK = qw(parse_results);
    2322
    2423use 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 lines
    49                                 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 == $testname
    64                                 $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 == $testname
    68                                 $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 == $testname
    73                                 $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 test
    79                                 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 == $testname
    87                                 $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 }
    12024
    12125sub start_test($)
     
    13236        if ($reason) {
    13337                print "$result: $name [\n";
    134                 print "$reason";
     38                print $reason;
     39                if (substr($reason, -1, 1) ne "\n") { print "\n"; }
    13540                print "]\n";
    13641        } else {
     
    13944}
    14045
    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 
    16946sub report_time($)
    17047{
    17148        my ($time) = @_;
    17249        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
     58sub progress_pop()
     59{
     60        print "progress: pop\n";
     61}
     62
     63sub progress_push()
     64{
     65        print "progress: push\n";
     66}
     67
     68sub progress($;$)
     69{
     70        my ($count, $whence) = @_;
     71
     72        unless(defined($whence)) {
     73                $whence = "";
     74        }
     75
     76        print "progress: $whence$count\n";
    17477}
    17578
     
    206109}
    207110
    208 sub testsuite_count($)
    209 {
    210         my ($count) = @_;
    211         print "testsuite-count: $count\n";
    212 }
    213 
    2141111;
  • trunk/server/selftest/gdb_backtrace

    r414 r745  
    3131                DB_LIST="ladebug ${DB_LIST}"
    3232        ;;
     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        ;;
    3347esac
    3448
     
    4660
    4761#
    48 # we first try to use /proc/${PID}/exe
     62# we first try to use /proc/${PID}/exe or /proc/{$PID}/path for solaris
    4963# then fallback to the binary from the commandline
    5064# then we search for the commandline argument with
     
    5266#
    5367test -f "/proc/${PID}/exe" && BINARY="/proc/${PID}/exe"
     68test -f "/proc/${PID}/path/a.out" && BINARY=`ls -l /proc/${PID}/path/a.out |sed 's/.*-> //'`
    5469test x"${BINARY}" = x"" && BINARY="/proc/${PID}/exe"
    5570test -f "${BINARY}" || BINARY=`which ${BINARY}`
     
    7691        ${DB_BIN} -c "${BATCHFILE_MAIN}" -i "${BATCHFILE_PRE}" -pid "${PID}" "${BINARY}"
    7792        ;;
    78         gdb)
     93        gdb66)
    7994cat << EOF  > ${BATCHFILE_MAIN}
    8095set height 1000
    8196bt full
     97info locals
     98kill
    8299quit
    83100EOF
    84101        ${DB_BIN} -x "${BATCHFILE_MAIN}" "${BINARY}" "${PID}"
    85102        ;;
     103        gdb)
     104cat << EOF  > ${BATCHFILE_MAIN}
     105set height 0
     106bt full
     107thread apply all bt full
     108info locals
     109quit
     110EOF
     111        ${DB_BIN} -batch -x "${BATCHFILE_MAIN}" --pid "${PID}" < /dev/null
     112        ;;
     113dbx)
     114        ${DB_BIN} "where;dump;kill;quit" "${BINARY}" "${PID}"
     115        ;;
    86116esac
    87117/bin/rm -f ${BATCHFILE_PRE} ${BATCHFILE_MAIN}
  • trunk/server/selftest/gdb_backtrace_test.c

    r414 r745  
    11/*
    22
    3 add a usefull tool to test the gdb_backtrace script
     3add a useful tool to test the gdb_backtrace script
    44
    55just compile it with
  • trunk/server/selftest/selftest.pl

    r414 r745  
    11#!/usr/bin/perl
    22# Bootstrap Samba and run a number of tests against it.
    3 # Copyright (C) 2005-2009 Jelmer Vernooij <jelmer@samba.org>
     3# Copyright (C) 2005-2010 Jelmer Vernooij <jelmer@samba.org>
    44# Copyright (C) 2007-2009 Stefan Metzmacher <metze@samba.org>
    55
     
    126126use FindBin qw($RealBin $Script);
    127127use File::Spec;
     128use File::Temp qw(tempfile);
    128129use Getopt::Long;
    129130use POSIX;
    130131use Cwd qw(abs_path);
    131132use lib "$RealBin";
    132 use Subunit qw(parse_results);
    133 use Subunit::Filter;
     133use Subunit;
    134134use SocketWrapper;
     135
     136eval {
     137require Time::HiRes;
     138Time::HiRes->import("time");
     139};
     140if ($@) {
     141        print "You don't have Time::Hires installed !\n";
     142}
    135143
    136144my $opt_help = 0;
     
    146154my $opt_image = undef;
    147155my $opt_testenv = 0;
     156my $opt_list = 0;
    148157my $ldap = undef;
    149 my $opt_analyse_cmd = undef;
    150158my $opt_resetup_env = undef;
    151159my $opt_bindir = undef;
    152 my $opt_no_lazy_setup = undef;
     160my $opt_load_list = undef;
    153161my @testlists = ();
    154162
     
    161169my @excludes = ();
    162170
     171sub 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
    163179sub find_in_list($$)
    164180{
     
    213229}
    214230
     231# expand strings from %ENV
     232sub 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
    215242sub run_testsuite($$$$$)
    216243{
     
    219246
    220247        Subunit::start_testsuite($name);
     248        Subunit::progress_push();
    221249        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
    252266        my $envlog = getlog_env($envname);
    253267        if ($envlog ne "") {
     
    256270
    257271        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
    262274        if ($exitcode == 0) {
    263275                Subunit::end_testsuite($name, "success");
     
    315327 --one                      abort when the first test fails
    316328 --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
    318331";
    319332        exit(0);
     
    336349                'verbose' => \$opt_verbose,
    337350                'testenv' => \$opt_testenv,
     351                'list' => \$opt_list,
    338352                'ldap:s' => \$ldap,
    339                 'analyse-cmd=s' => \$opt_analyse_cmd,
    340                 'no-lazy-setup' => \$opt_no_lazy_setup,
    341353                'resetup-environment' => \$opt_resetup_env,
    342354                'bindir:s' => \$opt_bindir,
    343355                'image=s' => \$opt_image,
    344                 'testlist=s' => \@testlists
     356                'testlist=s' => \@testlists,
     357                'load-list=s' => \$opt_load_list,
    345358            );
    346359
     
    348361
    349362ShowHelp() if ($opt_help);
     363
     364die("--list and --testenv are mutually exclusive") if ($opt_list and $opt_testenv);
     365
     366# we want unbuffered output
     367$| = 1;
    350368
    351369my @tests = @ARGV;
     
    356374        $ENV{MALLOC_CHECK_} = 2;
    357375}
     376
     377# make all our python scripts unbuffered
     378$ENV{PYTHONUNBUFFERED} = 1;
    358379
    359380my $bindir = ($opt_bindir or "$builddir/bin");
     
    385406
    386407my $prefix_abs = abs_path($prefix);
     408my $tmpdir_abs = abs_path("$prefix/tmp");
     409mkdir($tmpdir_abs, 0777) unless -d $tmpdir_abs;
     410
    387411my $srcdir_abs = abs_path($srcdir);
    388412my $builddir_abs = abs_path($builddir);
     
    398422$ENV{BUILDDIR} = $builddir;
    399423$ENV{BUILDDIR_ABS} = $builddir_abs;
     424$ENV{BINDIR} = $bindir_abs;
    400425$ENV{EXEEXT} = $exeext;
    401426
    402427my $tls_enabled = not $opt_quick;
    403428$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
    406430sub prefix_pathvar($$)
    407431{
     
    428452my $socket_wrapper_dir;
    429453if ($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);
    431455        print "SOCKET_WRAPPER_DIR=$socket_wrapper_dir\n";
    432456} else {
     
    440464
    441465if ($opt_target eq "samba4") {
    442         $testenv_default = "member";
     466        $testenv_default = "all";
    443467        require target::Samba4;
    444         $target = new Samba4($bindir, $ldap, "$srcdir/setup", $exeext);
     468        $target = new Samba4($bindir, $ldap, $srcdir, $exeext);
    445469} elsif ($opt_target eq "samba3") {
    446470        if ($opt_socket_wrapper and `$bindir/smbd -b | grep SOCKET_WRAPPER` eq "") {
     
    449473        $testenv_default = "member";
    450474        require target::Samba3;
    451         $target = new Samba3($bindir);
     475        $target = new Samba3($bindir, $srcdir_abs);
    452476} elsif ($opt_target eq "win") {
    453477        die("Windows tests will not run with socket wrapper enabled.")
     
    516540}
    517541
    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";
     542my $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
     549my $clientdir = "$prefix_abs/client";
     550
     551my $conffile = "$clientdir/client.conf";
    526552$ENV{SMB_CONF_PATH} = $conffile;
    527553
    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/*>;
     554sub 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/*>;
    536562        } 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/*>;
    542568        } 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/*>;
    548574        } else {
    549                 mkdir("$prefix/client/ncalrpcdir", 0777);
     575                mkdir("$clientdir/ncalrpcdir", 0777);
    550576        }
    551577
     
    568594        }
    569595        print CF "
    570         private dir = $prefix_abs/client/private
    571         lock dir = $prefix_abs/client/lockdir
    572         ncalrpc dir = $prefix_abs/client/ncalrpcdir
    573         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
    574600        panic action = $RealBin/gdb_backtrace \%PID\% \%PROG\%
    575601        max xmit = 32K
     
    578604        system:anonymous = true
    579605        client lanman auth = Yes
    580         torture:basedir = $prefix_abs/client
     606        log level = 1
     607        torture:basedir = $clientdir
    581608#We don't want to pass our self-tests if the PAC code is wrong
    582609        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
    584613";
    585614        close(CF);
     
    587616
    588617my @todo = ();
    589 
    590 my $testsdir = "$srcdir/selftest";
    591 
    592 my %required_envs = ();
    593618
    594619sub should_run_test($)
     
    614639
    615640        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");
    617644                        my $name = <IN>;
    618645                        $name =~ s/\n//g;
     
    622649                        $cmdline =~ s/\n//g;
    623650                        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]);
    626652                        }
    627653                } else {
     
    638664
    639665$ENV{SELFTEST_PREFIX} = "$prefix_abs";
     666$ENV{SELFTEST_TMPDIR} = "$tmpdir_abs";
     667$ENV{TEST_DATA_PREFIX} = "$tmpdir_abs";
    640668if ($opt_socket_wrapper) {
    641669        $ENV{SELFTEST_INTERFACES} = $interfaces;
     
    665693}
    666694
    667 Subunit::testsuite_count($#available+1);
    668 Subunit::report_time(time());
    669 
    670 foreach (@available) {
    671         my $name = $$_[0];
     695my $restricted = undef;
     696my $restricted_used = {};
     697
     698if ($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
     708my $individual_tests = undef;
     709$individual_tests = {};
     710
     711foreach my $testsuite (@available) {
     712        my $name = $$testsuite[0];
    672713        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)) {
    674736                Subunit::skip_testsuite($name, $skipreason);
    675737        } else {
    676                 push(@todo, $_);
    677         }
    678 }
    679 
    680 if ($#todo == -1) {
     738                push(@todo, $testsuite);
     739        }
     740}
     741
     742if (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) {
    681749        print STDERR "No tests to run\n";
    682750        exit(1);
    683         }
     751}
    684752
    685753my $suitestotal = $#todo + 1;
     754
     755Subunit::progress($suitestotal);
     756Subunit::report_time(time());
     757
    686758my $i = 0;
    687759$| = 1;
     
    711783        "DC_NETBIOSALIAS",
    712784
     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
    713803        # server stuff
    714804        "SERVER",
     
    719809        # user stuff
    720810        "USERNAME",
     811        "USERID",
    721812        "PASSWORD",
    722813        "DC_USERNAME",
     
    726817        "KRB5_CONFIG",
    727818        "WINBINDD_SOCKET_DIR",
    728         "WINBINDD_PRIV_PIPE_DIR"
     819        "WINBINDD_PRIV_PIPE_DIR",
     820        "NMBD_SOCKET_DIR",
     821        "LOCAL_PATH"
    729822);
    730823
     
    735828};
    736829
    737 sub setup_env($)
    738 {
    739         my ($name) = @_;
     830sub setup_env($$)
     831{
     832        my ($name, $prefix) = @_;
    740833
    741834        my $testenv_vars = undef;
     
    754847        } elsif (defined(get_running_env($envname))) {
    755848                $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);
    757851                        $testenv_vars = undef;
    758852                }
    759853        } else {
    760854                $testenv_vars = $target->setup_env($envname, $prefix);
     855                if (defined($testenv_vars) && not defined($testenv_vars->{target})) {
     856                       $testenv_vars->{target} = $target;
     857                }
    761858        }
    762859
     
    769866                $ENV{SMB_CONF_PATH} = $testenv_vars->{SERVERCONFFILE};
    770867        } 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);
    773870                $ENV{SMB_CONF_PATH} = $conffile;
    774871        } else {
     
    804901        my ($envname) = @_;
    805902        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);
    807905}
    808906
     
    811909        my ($envname) = @_;
    812910        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);
    814913}
    815914
     
    818917        my ($envname) = @_;
    819918        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);
    821921        delete $running_envs{$envname};
    822922}
    823923
    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
     925unlink("$prefix_abs/dns_host_file");
    827926
    828927if ($opt_testenv) {
     
    830929        $testenv_name = $testenv_default unless defined($testenv_name);
    831930
    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);
    833934
    834935        $ENV{PIDDIR} = $testenv_vars->{PIDDIR};
     936        $ENV{ENVNAME} = $testenv_name;
    835937
    836938        my $envvarstr = exported_envvars_str($testenv_vars);
    837939
    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 \"
    840942Welcome to the Samba4 Test environment '$testenv_name'
    841943
     
    850952\" && LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} bash'");
    851953        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        }
    852980} else {
    853981        foreach (@todo) {
    854982                $i++;
    855983                my $cmd = $$_[2];
    856                 $cmd =~ s/([\(\)])/\\$1/g;
    857984                my $name = $$_[0];
    858985                my $envname = $$_[1];
    859                
    860                 my $envvars = setup_env($envname);
     986
     987                my $envvars = setup_env($envname, $prefix);
    861988                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");
    864992                        next;
    865993                }
    866994
     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
    8671010                run_testsuite($envname, $name, $cmd, $i, $suitestotal);
    8681011
    869                 if (defined($opt_analyse_cmd)) {
    870                         system("$opt_analyse_cmd \"$name\"");
    871                 }
    872 
    8731012                teardown_env($envname) if ($opt_resetup_env);
    8741013        }
     
    8781017
    8791018teardown_env($_) foreach (keys %running_envs);
    880 
    881 $target->stop();
    8821019
    8831020my $failed = 0;
     
    8861023foreach (<$prefix/valgrind.log*>) {
    8871024        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 $_");
    8941028}
    8951029exit 0;
  • trunk/server/selftest/target/Kvm.pm

    r414 r745  
    160160}
    161161
    162 sub stop($)
    163 {
    164         my ($self) = @_;
    165 }
    166 
    1671621;
  • trunk/server/selftest/target/Samba3.pm

    r414 r745  
    2525
    2626sub new($$) {
    27         my ($classname, $bindir) = @_;
    28         my $self = { bindir => $bindir };
     27        my ($classname, $bindir, $srcdir) = @_;
     28        my $self = { bindir => $bindir,
     29                     srcdir => $srcdir
     30        };
    2931        bless $self;
    3032        return $self;
     
    9799        my ($self, $envname, $path) = @_;
    98100       
    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});
    101110        } 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});
    106115        } else {
    107116                return undef;
     
    113122        my ($self, $path) = @_;
    114123
    115         print "PROVISIONING DC...";
    116 
    117         my $dc_options = "
     124        print "PROVISIONING S3DC...";
     125
     126        my $s3dc_options = "
    118127        domain master = yes
    119128        domain logons = yes
     
    122131
    123132        my $vars = $self->provision($path,
    124                                     "LOCALDC2",
     133                                    "LOCALS3DC2",
    125134                                    2,
    126                                     "localdc2pass",
    127                                     $dc_options);
     135                                    "locals3dc2pass",
     136                                    $s3dc_options);
    128137
    129138        $self->check_or_start($vars,
     
    133142        $self->wait_for_start($vars);
    134143
    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;
    136151
    137152        return $vars;
     
    140155sub setup_member($$$)
    141156{
    142         my ($self, $prefix, $dcvars) = @_;
     157        my ($self, $prefix, $s3dcvars) = @_;
    143158
    144159        print "PROVISIONING MEMBER...";
     
    159174        my $cmd = "";
    160175        $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}";
    163178
    164179        system($cmd) == 0 or die("Join failed\n$cmd");
     
    170185        $self->wait_for_start($ret);
    171186
    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};
    177192
    178193        return $ret;
    179194}
    180195
    181 sub stop($)
    182 {
    183         my ($self) = @_;
     196sub 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
     224sub 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;
    184256}
    185257
     
    226298
    227299                $ENV{WINBINDD_SOCKET_DIR} = $env_vars->{WINBINDD_SOCKET_DIR};
     300                $ENV{NMBD_SOCKET_DIR} = $env_vars->{NMBD_SOCKET_DIR};
    228301
    229302                $ENV{NSS_WRAPPER_PASSWD} = $env_vars->{NSS_WRAPPER_PASSWD};
     
    253326                }
    254327
    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: $!");
    256329        }
    257330        write_pid($env_vars, "nmbd", $pid);
     
    268341
    269342                $ENV{WINBINDD_SOCKET_DIR} = $env_vars->{WINBINDD_SOCKET_DIR};
     343                $ENV{NMBD_SOCKET_DIR} = $env_vars->{NMBD_SOCKET_DIR};
    270344
    271345                $ENV{NSS_WRAPPER_PASSWD} = $env_vars->{NSS_WRAPPER_PASSWD};
     
    295369                }
    296370
    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: $!");
    298372        }
    299373        write_pid($env_vars, "winbindd", $pid);
     
    310384
    311385                $ENV{WINBINDD_SOCKET_DIR} = $env_vars->{WINBINDD_SOCKET_DIR};
     386                $ENV{NMBD_SOCKET_DIR} = $env_vars->{NMBD_SOCKET_DIR};
    312387
    313388                $ENV{NSS_WRAPPER_PASSWD} = $env_vars->{NSS_WRAPPER_PASSWD};
     
    334409                        @preargs = split(/ /,$ENV{SMBD_VALGRIND});
    335410                }
    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: $!");
    337412        }
    338413        write_pid($env_vars, "smbd", $pid);
     
    340415
    341416        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 = $domain
    359 
    360         private dir = $privatedir
    361         pid directory = $piddir
    362         lock directory = $lockdir
    363         log file = $logdir/log.\%m
    364         log level = 0
    365 
    366         name resolve order = bcast
    367 
    368         netbios name = TORTURE_6
    369         interfaces = $torture_interfaces
    370         panic action = $RealBin/gdb_backtrace \%d %\$(MAKE_TEST_BINARY)
    371 
    372         passdb backend = tdbsam
    373         ";
    374         close(CONF);
    375417}
    376418
     
    395437        my $prefix_abs = abs_path($prefix);
    396438        my $bindir_abs = abs_path($self->{bindir});
     439        my $vfs_modulesdir_abs = ($ENV{VFSLIBDIR} or $bindir_abs);
    397440
    398441        my @dirs = ();
     
    413456        push(@dirs,$lockdir);
    414457
     458        my $eventlogdir="$prefix_abs/lockdir/eventlog";
     459        push(@dirs,$eventlogdir);
     460
    415461        my $logdir="$prefix_abs/logs";
    416462        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);
    417481
    418482        # this gets autocreated by winbindd
    419483        my $wbsockdir="$prefix_abs/winbindd";
    420484        my $wbsockprivdir="$lockdir/winbindd_privileged";
     485
     486        my $nmbdsockdir="$prefix_abs/nmbd";
     487        unlink($nmbdsockdir);
    421488
    422489        ##
     
    431498        mkdir($_, 0777) foreach(@dirs);
    432499
     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
    433517        my $conffile="$libdir/server.conf";
    434518
    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";
    436520        my $nss_wrapper_passwd = "$privatedir/passwd";
    437521        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        ##
    438558
    439559        open(CONF, ">$conffile") or die("Unable to open $conffile");
     
    443563        interfaces = $server_ip/8
    444564        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)
    446566
    447567        workgroup = $domain
     
    452572        log file = $logdir/log.\%m
    453573        log level = 0
     574        debug pid = yes
    454575
    455576        name resolve order = bcast
     
    462583        time server = yes
    463584
    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
    465586        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
    467588        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
    468589        delete user script =            $nss_wrapper_pl --passwd_path $nss_wrapper_passwd --type passwd --action delete --name %u
     
    470591        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
    471592
     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
    472598        kernel oplocks = no
    473599        kernel change notify = no
     
    478604
    479605        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
    482610
    483611#       min receivefile size = 4000
    484612
     613        max protocol = SMB2
    485614        read only = no
     615        server signing = auto
     616
    486617        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
    490623        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
    516626        printing = vlp
    517627        print command = $bindir_abs/vlp tdbfile=$lockdir/vlp.tdb print %p %s
     
    522632        queue pause command = $bindir_abs/vlp tdbfile=$lockdir/vlp.tdb queuepause %p
    523633        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
    524687
    525688[print2]
     
    527690[print3]
    528691        copy = print1
    529 [print4]
     692[lp]
    530693        copy = print1
     694[print\$]
     695        copy = tmp
    531696        ";
    532697        close(CONF);
     
    537702
    538703        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
    541705$unix_name:x:$unix_uid:$unix_gids[0]:$unix_name gecos:$prefix_abs:/bin/false
    542706";
     707        if ($unix_uid != 0) {
     708                print PASSWD "root:x:$uid_root:$gid_root:root gecos:$prefix_abs:/bin/false";
     709        }
    543710        close(PASSWD);
    544711
    545712        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:
     714nogroup:x:$gid_nogroup:nobody
    549715$unix_name-group:x:$unix_gids[0]:
     716domusers:X:$gid_domusers:
    550717";
     718        if ($unix_gids[0] != 0) {
     719                print GROUP "root:x:$gid_root:";
     720        }
     721
    551722        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        }
    552729
    553730        $ENV{NSS_WRAPPER_PASSWD} = $nss_wrapper_passwd;
     
    557734        print PWD "$password\n$password\n";
    558735        close(PWD) or die("Unable to set password for test account");
    559 
    560         delete $ENV{NSS_WRAPPER_PASSWD};
    561         delete $ENV{NSS_WRAPPER_GROUP};
    562736
    563737        print "DONE\n";
     
    574748        $ret{SERVER} = $server;
    575749        $ret{USERNAME} = $unix_name;
     750        $ret{USERID} = $unix_uid;
    576751        $ret{DOMAIN} = $domain;
    577752        $ret{NETBIOSNAME} = $server;
     
    580755        $ret{WINBINDD_SOCKET_DIR} = $wbsockdir;
    581756        $ret{WINBINDD_PRIV_PIPE_DIR} = $wbsockprivdir;
     757        $ret{NMBD_SOCKET_DIR} = $nmbdsockdir;
    582758        $ret{SOCKET_WRAPPER_DEFAULT_IFACE} = $swiface;
    583759        $ret{NSS_WRAPPER_PASSWD} = $nss_wrapper_passwd;
    584760        $ret{NSS_WRAPPER_GROUP} = $nss_wrapper_group;
    585761        $ret{NSS_WRAPPER_WINBIND_SO_PATH} = $ENV{NSS_WRAPPER_WINBIND_SO_PATH};
     762        $ret{LOCAL_PATH} = "$shrdir";
    586763
    587764        return \%ret;
     
    606783        system($self->binpath("smbclient") ." $envvars->{CONFIGURATION} -L $envvars->{SERVER_IP} -U% -p 139 | head -2");
    607784
     785        # Ensure we have domain users mapped.
     786        system($self->binpath("net") ." $envvars->{CONFIGURATION} groupmap add rid=513 unixgroup=domusers type=domain");
     787
    608788        print $self->getlog_env($envvars);
    609789}
  • trunk/server/selftest/target/Samba4.pm

    r414 r745  
    1010use FindBin qw($RealBin);
    1111use POSIX;
     12use SocketWrapper;
    1213
    1314sub new($$$$$) {
    14         my ($classname, $bindir, $ldap, $setupdir, $exeext) = @_;
     15        my ($classname, $bindir, $ldap, $srcdir, $exeext) = @_;
    1516        $exeext = "" unless defined($exeext);
    16         my $self = { 
    17                 vars => {}, 
    18                 ldap => $ldap, 
    19                 bindir => $bindir, 
    20                 setupdir => $setupdir,
     17        my $self = {
     18                vars => {},
     19                ldap => $ldap,
     20                bindir => $bindir,
     21                srcdir => $srcdir,
    2122                exeext => $exeext
    2223        };
     
    2829        my ($self, $path) = @_;
    2930
    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
     37sub scriptdir_path($$) {
     38        my ($self, $path) = @_;
     39        return "$self->{srcdir}/source4/scripting/$path";
    3140}
    3241
     
    5463        }
    5564        while (system("$ldbsearch -H $uri -s base -b \"\" supportedLDAPVersion > /dev/null") != 0) {
    56                 $count++;
     65                $count++;
    5766                if ($count > 40) {
    58                     $self->slapd_stop($env_vars);
    59                     return 0;
     67                        $self->slapd_stop($env_vars);
     68                        return 0;
    6069                }
    6170                sleep(1);
     
    6877        my ($self, $envvars) = @_;
    6978        if ($self->{ldap} eq "fedora-ds") {
    70                 system("$envvars->{LDAPDIR}/slapd-samba4/stop-slapd");
     79                system("$envvars->{LDAPDIR}/slapd-$envvars->{LDAP_INSTANCE}/stop-slapd");
    7180        } 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                }
    7485                kill 9, <IN>;
    7586                close(IN);
     
    7889}
    7990
    80 sub check_or_start($$$) 
     91sub check_or_start($$$)
    8192{
    8293        my ($self, $env_vars, $max_time) = @_;
     
    8798        unlink($env_vars->{SAMBA_TEST_LOG});
    8899       
    89         print "STARTING SAMBA... ";
     100        my $pwd = `pwd`;
     101        print "STARTING SAMBA for $ENV{ENVNAME}\n";
    90102        my $pid = fork();
    91103        if ($pid == 0) {
     
    102114                if (defined($ENV{SAMBA_VALGRIND})) {
    103115                    $valgrind = $ENV{SAMBA_VALGRIND};
    104                 } 
    105 
    106                 $ENV{KRB5_CONFIG} = $env_vars->{KRB5_CONFIG}; 
     116                }
     117
     118                $ENV{KRB5_CONFIG} = $env_vars->{KRB5_CONFIG};
    107119                $ENV{WINBINDD_SOCKET_DIR} = $env_vars->{WINBINDD_SOCKET_DIR};
    108120
     
    114126                # Start slapd before samba, but with the fifo on stdin
    115127                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                        }
    118132                }
    119133
     
    129143                # allow selection of the process model using
    130144                # 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
    132146                # individual machines in the build farm
    133147                my $model = "single";
     
    135149                        $model = $ENV{SAMBA_PROCESS_MODEL};
    136150                }
    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";
    140156                        exit 1;
    141157                }
     158                my $exit = ($ret >> 8);
    142159                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;
    146163                } elsif ( $ret & 127 ) {
    147164                        print "$samba got signal ".($ret & 127)." and exits with $exit!\n";
    148165                } else {
    149                         $ret = $? >> 8;
    150166                        print "$samba failed with status $exit!\n";
     167                }
     168                if ($exit == 0) {
     169                        $exit = -1;
    151170                }
    152171                exit $exit;
     
    166185        sleep 2;
    167186
    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
    170189        my $nmblookup = $self->bindir_path("nmblookup");
    171190        system("$nmblookup $testenv_vars->{CONFIGURATION} $testenv_vars->{SERVER}");
     
    192211        open(LDIF, "|$ldbadd -H $file >/dev/null");
    193212        print LDIF $ldif;
    194         return close(LDIF);
     213        return(close(LDIF));
    195214}
    196215
     
    200219
    201220        return $self->write_ldb_file("$privatedir/wins_config.ldb", "
    202 dn: name=TORTURE_6,CN=PARTNERS
     221dn: name=TORTURE_11,CN=PARTNERS
    203222objectClass: wreplPartner
    204 name: TORTURE_6
    205 address: 127.0.0.6
     223name: TORTURE_11
     224address: 127.0.0.11
    206225pullInterval: 0
    207226pushChangeCount: 0
     
    212231sub mk_fedora_ds($$)
    213232{
    214         my ($self, $ldapdir) = @_;
     233        my ($self, $ctx) = @_;
    215234
    216235        #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";
    220239
    221240        return ($fedora_ds_dir, $pidfile);
     
    224243sub mk_openldap($$)
    225244{
    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";
    230249
    231250        return ($slapd_conf_d, $pidfile);
     
    261280        close(DHFILE);
    262281
    263         #Likewise, we pregenerate the key material.  This allows the 
     282        #Likewise, we pregenerate the key material.  This allows the
    264283        #other certificates to be pre-generated
    265284        open(KEYFILE, ">$keyfile");
     
    303322EOF
    304323
    305         #generated with 
     324        #generated with
    306325        # hxtool issue-certificate --self-signed --issue-ca \
    307326        # --ca-private-key="FILE:$KEYFILE" \
     
    327346EOF
    328347
    329         #generated with GNUTLS internally in Samba. 
     348        #generated with GNUTLS internally in Samba.
    330349
    331350        open(CERTFILE, ">$certfile");
     
    441460}
    442461
    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($$)
     462sub mk_krb5_conf($$)
    547463{
    548464        my ($self, $ctx) = @_;
    549465
    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        }
    593470        print KRB5CONF "
    594471#Generated krb5.conf for $ctx->{realm}
     
    600477 ticket_lifetime = 24h
    601478 forwardable = yes
     479 allow_weak_crypto = yes
    602480
    603481[realms]
     
    630508";
    631509        close(KRB5CONF);
     510}
     511
     512sub 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#
     628sub 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);
    632689
    633690        open(PWD, ">$ctx->{nsswrap_passwd}");
     
    652709
    653710#Ensure the config file is valid before we start
    654         my $testparm = $self->bindir_path("testparm");
     711        my $testparm = $self->scriptdir_path("bin/testparm");
    655712        if (system("$testparm $configuration -v --suppress-prompt >/dev/null 2>&1") != 0) {
    656713                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        }
    661721
    662722        my $ret = {
     
    672732                PASSWORD => $ctx->{password},
    673733                LDAPDIR => $ctx->{ldapdir},
     734                LDAP_INSTANCE => $ctx->{ldap_instance},
    674735                WINBINDD_SOCKET_DIR => $ctx->{winbindd_socket_dir},
    675736                NCALRPCDIR => $ctx->{ncalrpcdir},
     
    689750
    690751#
    691 # provision_raw_step2() is also used by Samba34.pm!
    692 #
    693752# Step2 runs the provision script
    694753#
     
    698757
    699758        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        }
    701763
    702764        return $ret;
    703765}
    704766
    705 sub provision($$$$$$$)
    706 {
    707         my ($self, $prefix, $server_role, $netbiosname, $netbiosalias, $swiface, $password, $kdc_ipv4) = @_;
     767sub provision($$$$$$$$$)
     768{
     769        my ($self, $prefix, $server_role, $netbiosname, $netbiosalias,
     770            $domain, $realm, $functional_level,
     771            $swiface, $password, $kdc_ipv4, $extra_smbconf_options) = @_;
    708772
    709773        my $ctx = $self->provision_raw_prepare($prefix, $server_role,
    710774                                               $netbiosname, $netbiosalias,
     775                                               $domain, $realm, $functional_level,
    711776                                               $swiface, $password, $kdc_ipv4);
    712777
     
    715780        push(@{$ctx->{directories}}, "$ctx->{tmpdir}/test1");
    716781        push(@{$ctx->{directories}}, "$ctx->{tmpdir}/test2");
    717 
     782        my $msdfs = "no";
     783        $msdfs = "yes" if ($server_role eq "domain controller");
    718784        $ctx->{smb_conf_extra_options} = "
    719785
    720786        max xmit = 32K
    721787        server max protocol = SMB2
     788        $extra_smbconf_options
     789        host msdfs = $msdfs
     790        lanman auth = yes
    722791
    723792[tmp]
    724793        path = $ctx->{tmpdir}
    725794        read only = no
    726         posix:sharedelay = 100000
    727         posix:eadb = $ctx->{lockdir}/eadb.tdb
     795        posix:sharedelay = 10000
    728796        posix:oplocktimeout = 3
    729797        posix:writetimeupdatedelay = 500000
     
    732800        path = $ctx->{tmpdir}/test1
    733801        read only = no
    734         posix:sharedelay = 100000
    735         posix:eadb = $ctx->{lockdir}/eadb.tdb
     802        posix:sharedelay = 10000
    736803        posix:oplocktimeout = 3
    737         posix:writetimeupdatedelay = 500000
     804        posix:writetimeupdatedelay = 50000
    738805
    739806[test2]
    740807        path = $ctx->{tmpdir}/test2
    741808        read only = no
    742         posix:sharedelay = 100000
    743         posix:eadb = $ctx->{lockdir}/eadb.tdb
     809        posix:sharedelay = 10000
    744810        posix:oplocktimeout = 3
    745         posix:writetimeupdatedelay = 500000
     811        posix:writetimeupdatedelay = 50000
    746812
    747813[cifs]
     
    779845                $ldap_uri = "ldapi://$ldap_uri";
    780846                $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});
    781852        }
    782853
    783854        my $ret = $self->provision_raw_step1($ctx);
     855        unless (defined $ret) {
     856                return undef;
     857        }
    784858
    785859        if (defined($self->{ldap})) {
    786                 $ret->{LDAP_URI} = $ctx->{ldap_uri};
     860                $ret->{LDAP_URI} = $ctx->{ldap_uri};
    787861                push (@{$ctx->{provision_options}}, "--ldap-backend-type=" . $self->{ldap});
     862                push (@{$ctx->{provision_options}}, "--ldap-backend-nosync");
    788863                if ($self->{ldap} eq "openldap") {
    789                         push (@{$ctx->{provision_options}}, "--slapd-path=" . $ENV{OPENLDAP_SLAPD});
    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");
    791866
    792867                } elsif ($self->{ldap} eq "fedora-ds") {
    793868                        push (@{$ctx->{provision_options}}, "--slapd-path=" . "$ENV{FEDORA_DS_ROOT}/sbin/ns-slapd");
    794869                        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);
    803876}
    804877
     
    810883        my $ret = $self->provision($prefix,
    811884                                   "member server",
    812                                    "localmember3",
    813885                                   "localmember",
     886                                   "member3",
     887                                   "SAMBADOMAIN",
     888                                   "samba.example.com",
     889                                   "2008",
    814890                                   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");
    821899        my $cmd = "";
    822900        $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
    823901        $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
     927sub 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
     975sub 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};
    8351032
    8361033        return $ret;
     
    8441041        my $ret = $self->provision($prefix,
    8451042                                   "domain controller",
    846                                    "localdc1",
    8471043                                   "localdc",
     1044                                   "dc1",
     1045                                   "SAMBADOMAIN",
     1046                                   "samba.example.com",
     1047                                   "2008",
    8481048                                   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
     1068sub 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
     1092sub 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
     1116sub 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
     1141sub 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};
    8541218
    8551219        return $ret;
     
    8631227        close(DATA);
    8641228
    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")) {
    8671230                $pid = <IN>;
    8681231                close(IN);
     
    8721235                my $count = 0;
    8731236                until (kill(0, $pid) == 0) {
    874                     # if no process sucessfully signalled, then we are done
    875                     sleep(1);
    876                     $count++;
    877                     last if $count > 20;
    878                 }
    879                
     1237                        # if no process sucessfully signalled, then we are done
     1238                        sleep(1);
     1239                        $count++;
     1240                        last if $count > 20;
     1241                }
     1242
    8801243                # If it is still around, kill it
    8811244                if ($count > 20) {
    882                     print "server process $pid took more than $count seconds to exit, killing\n";
    883                     kill 9, $pid;
     1245                        print "server process $pid took more than $count seconds to exit, killing\n";
     1246                        kill 9, $pid;
    8841247                }
    8851248        }
     
    9101273
    9111274        return "" if $out eq $title;
    912  
     1275
    9131276        return $out;
    9141277}
     
    9181281        my ($self, $envvars) = @_;
    9191282
    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});
    9251284}
    9261285
     
    9281287{
    9291288        my ($self, $envname, $path) = @_;
     1289
     1290        $ENV{ENVNAME} = $envname;
    9301291
    9311292        if ($envname eq "dc") {
    9321293                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});
    9331310        } elsif ($envname eq "member") {
    9341311                if (not defined($self->{vars}->{dc})) {
     
    9361313                }
    9371314                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;
    9381371        } 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
     1377sub setup_member($$$)
    9441378{
    9451379        my ($self, $path, $dc_vars) = @_;
     
    9471381        my $env = $self->provision_member($path, $dc_vars);
    9481382
    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
     1394sub 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
     1410sub 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
     1426sub 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
     1443sub 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
     1460sub 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
     1478sub 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
     1529sub 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));
    9501541
    9511542        $self->wait_for_start($env);
    9521543
     1544        $self->{vars}->{rodc} = $env;
     1545
    9531546        return $env;
    9541547}
    9551548
    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 
    97715491;
  • trunk/server/selftest/target/Template.pm

    r414 r745  
    4545}
    4646
    47 sub stop($)
    48 {
    49         my ($self) = @_;
    50 }
    51 
    52471;
  • trunk/server/selftest/test_samba4.pl

    r414 r745  
    77use Samba4;
    88
    9 my $s = new Samba4($RealBin."/../source4/bin", undef, $RealBin."/../setup");
     9my $s = new Samba4("bin", undef, $RealBin."/../setup");
    1010
    1111ok($s);
    1212
    13 is($RealBin."/../source4/bin", $s->{bindir});
     13is("bin", $s->{bindir});
    1414
    1515ok($s->write_ldb_file("tmpldb", "
Note: See TracChangeset for help on using the changeset viewer.