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:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/server

  • 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;
Note: See TracChangeset for help on using the changeset viewer.