X-Git-Url: http://git.samba.org/?p=amitay%2Fsamba.git;a=blobdiff_plain;f=selftest%2Ftarget%2FSamba3.pm;h=d0ca0a17de5ce8c9e468e931bea3aa99ef32552b;hp=4d60a52002715a17ad66c83ef5bc83ec6a9e70b0;hb=1f181476b4bd27dda9823e99961c4954ad968244;hpb=a82d9e4e72d624916b1e12393a73a4d79ae080d2 diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm old mode 100644 new mode 100755 index 4d60a520027..d0ca0a17de5 --- a/selftest/target/Samba3.pm +++ b/selftest/target/Samba3.pm @@ -9,23 +9,18 @@ use strict; use Cwd qw(abs_path); use FindBin qw($RealBin); use POSIX; - -sub binpath($$) -{ - my ($self, $binary) = @_; - - if (defined($self->{bindir})) { - my $path = "$self->{bindir}/$binary"; - -f $path or die("File $path doesn't exist"); - return $path; - } - - return $binary; -} +use target::Samba; sub new($$) { - my ($classname, $bindir) = @_; - my $self = { bindir => $bindir }; + my ($classname, $bindir, $binary_mapping, $srcdir, $exeext, $server_maxtime) = @_; + $exeext = "" unless defined($exeext); + my $self = { vars => {}, + bindir => $bindir, + binary_mapping => $binary_mapping, + srcdir => $srcdir, + exeext => $exeext, + server_maxtime => $server_maxtime + }; bless $self; return $self; } @@ -96,43 +91,59 @@ sub setup_env($$$) { my ($self, $envname, $path) = @_; - if ($envname eq "dc") { - return $self->setup_dc("$path/dc"); + if ($envname eq "s3dc") { + return $self->setup_s3dc("$path/s3dc"); } elsif ($envname eq "secshare") { return $self->setup_secshare("$path/secshare"); + } elsif ($envname eq "maptoguest") { + return $self->setup_maptoguest("$path/maptoguest"); + } elsif ($envname eq "ktest") { + return $self->setup_ktest("$path/ktest"); + } elsif ($envname eq "secserver") { + if (not defined($self->{vars}->{s3dc})) { + if (not defined($self->setup_s3dc("$path/s3dc"))) { + return undef; + } + } + return $self->setup_secserver("$path/secserver", $self->{vars}->{s3dc}); } elsif ($envname eq "member") { - if (not defined($self->{vars}->{dc})) { - $self->setup_dc("$path/dc"); + if (not defined($self->{vars}->{s3dc})) { + if (not defined($self->setup_s3dc("$path/s3dc"))) { + return undef; + } } - return $self->setup_member("$path/member", $self->{vars}->{dc}); + return $self->setup_member("$path/member", $self->{vars}->{s3dc}); } else { return undef; } } -sub setup_dc($$) +sub setup_s3dc($$) { my ($self, $path) = @_; - print "PROVISIONING DC..."; + print "PROVISIONING S3DC..."; - my $dc_options = " + my $s3dc_options = " domain master = yes domain logons = yes lanman auth = yes "; my $vars = $self->provision($path, - "LOCALDC2", + "LOCALS3DC2", 2, - "localdc2pass", - $dc_options); + "locals3dc2pass", + $s3dc_options); + + $vars or return undef; $self->check_or_start($vars, - ($ENV{SMBD_MAXTIME} or 2700), "yes", "yes", "yes"); - $self->wait_for_start($vars); + if (not $self->wait_for_start($vars)) { + return undef; + } $vars->{DC_SERVER} = $vars->{SERVER}; $vars->{DC_SERVER_IP} = $vars->{SERVER_IP}; @@ -140,14 +151,14 @@ sub setup_dc($$) $vars->{DC_USERNAME} = $vars->{USERNAME}; $vars->{DC_PASSWORD} = $vars->{PASSWORD}; - $self->{vars}->{dc} = $vars; + $self->{vars}->{s3dc} = $vars; return $vars; } sub setup_member($$$) { - my ($self, $prefix, $dcvars) = @_; + my ($self, $prefix, $s3dcvars) = @_; print "PROVISIONING MEMBER..."; @@ -161,19 +172,90 @@ sub setup_member($$$) "localmember3pass", $member_options); - $ret or die("Unable to provision"); + $ret or return undef; + + my $net = Samba::bindir_path($self, "net"); + my $cmd = ""; + $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" "; + $cmd .= "$net join $ret->{CONFIGURATION} $s3dcvars->{DOMAIN} member"; + $cmd .= " -U$s3dcvars->{USERNAME}\%$s3dcvars->{PASSWORD}"; + + if (system($cmd) != 0) { + warn("Join failed\n$cmd"); + return undef; + } + + $self->check_or_start($ret, "yes", "yes", "yes"); + + if (not $self->wait_for_start($ret)) { + return undef; + } + + $ret->{DC_SERVER} = $s3dcvars->{SERVER}; + $ret->{DC_SERVER_IP} = $s3dcvars->{SERVER_IP}; + $ret->{DC_NETBIOSNAME} = $s3dcvars->{NETBIOSNAME}; + $ret->{DC_USERNAME} = $s3dcvars->{USERNAME}; + $ret->{DC_PASSWORD} = $s3dcvars->{PASSWORD}; + + return $ret; +} + +sub setup_admember($$$$) +{ + my ($self, $prefix, $dcvars, $iface) = @_; + + print "PROVISIONING S3 AD MEMBER$iface..."; + + my $member_options = " + security = ads + server signing = on + workgroup = $dcvars->{DOMAIN} + realm = $dcvars->{REALM} +"; + + my $ret = $self->provision($prefix, + "LOCALADMEMBER$iface", + $iface, + "loCalMember${iface}Pass", + $member_options); + + $ret or return undef; + + close(USERMAP); + $ret->{DOMAIN} = $dcvars->{DOMAIN}; + $ret->{REALM} = $dcvars->{REALM}; - my $net = $self->binpath("net"); + my $ctx; + my $prefix_abs = abs_path($prefix); + $ctx = {}; + $ctx->{krb5_conf} = "$prefix_abs/lib/krb5.conf"; + $ctx->{domain} = $dcvars->{DOMAIN}; + $ctx->{realm} = $dcvars->{REALM}; + $ctx->{dnsname} = lc($dcvars->{REALM}); + $ctx->{kdc_ipv4} = $dcvars->{SERVER_IP}; + Samba::mk_krb5_conf($ctx, ""); + + $ret->{KRB5_CONFIG} = $ctx->{krb5_conf}; + + my $net = Samba::bindir_path($self, "net"); my $cmd = ""; $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" "; - $cmd .= "$net join $ret->{CONFIGURATION} $dcvars->{DOMAIN} member"; + $cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" "; + $cmd .= "$net join $ret->{CONFIGURATION}"; $cmd .= " -U$dcvars->{USERNAME}\%$dcvars->{PASSWORD}"; - system($cmd) == 0 or die("Join failed\n$cmd"); + if (system($cmd) != 0) { + warn("Join failed\n$cmd"); + return undef; + } + + # We need world access to this share, as otherwise the domain + # administrator from the AD domain provided by Samba4 can't + # access the share for tests. + chmod 0777, "$prefix/share"; $self->check_or_start($ret, - ($ENV{SMBD_MAXTIME} or 2700), - "yes", "yes", "yes"); + "yes", "yes", "yes"); $self->wait_for_start($ret); @@ -183,6 +265,62 @@ sub setup_member($$$) $ret->{DC_USERNAME} = $dcvars->{USERNAME}; $ret->{DC_PASSWORD} = $dcvars->{PASSWORD}; + # Special case, this is called from Samba4.pm but needs to use the Samba3 check_env and get_log_env + $ret->{target} = $self; + + return $ret; +} + +sub setup_plugin_s4_dc($$$$) +{ + my ($self, $prefix, $dcvars, $iface) = @_; + + print "PROVISIONING S4 PLUGIN AD DC$iface..."; + + my $plugin_s4_dc_options = " + workgroup = $dcvars->{DOMAIN} + realm = $dcvars->{REALM} + security=ads + passdb backend = samba4 + auth methods = guest samba4 + domain logons = yes + rpc_server:epmapper = external + rpc_daemon:epmd = disabled + rpc_daemon:lsasd = disabled + rpc_server:tcpip = no + rpc_server:lsass = external + rpc_server:lsarpc = external + rpc_server:netlogon = external + rpc_server:samr = external + server signing = on +"; + + my $ret = $self->provision($prefix, + "plugindc", + $iface, + "pluGin${iface}Pass", + $plugin_s4_dc_options, 1); + + $ret or return undef; + + close(USERMAP); + $ret->{DOMAIN} = $dcvars->{DOMAIN}; + $ret->{REALM} = $dcvars->{REALM}; + $ret->{KRB5_CONFIG} = $dcvars->{KRB5_CONFIG}; + + # We need world access to this share, as otherwise the domain + # administrator from the AD domain provided by Samba4 can't + # access the share for tests. + chmod 0777, "$prefix/share"; + + $self->check_or_start($ret, + "no", "no", "yes"); + + $self->wait_for_start($ret); + + # Special case, this is called from Samba4.pm but needs to use the Samba3 check_env and get_log_env + $ret->{target} = $self; + return $ret; } @@ -203,13 +341,168 @@ sub setup_secshare($$) "local4pass", $secshare_options); + $vars or return undef; + + $self->check_or_start($vars, "yes", "no", "yes"); + + if (not $self->wait_for_start($vars)) { + return undef; + } + + $self->{vars}->{secshare} = $vars; + + return $vars; +} + +sub setup_secserver($$$) +{ + my ($self, $prefix, $s3dcvars) = @_; + + print "PROVISIONING server with security=server..."; + + my $secserver_options = " + security = server + password server = $s3dcvars->{SERVER_IP} +"; + + my $ret = $self->provision($prefix, + "LOCALSERVER5", + 5, + "localserver5pass", + $secserver_options); + + $ret or return undef; + + $self->check_or_start($ret, "yes", "no", "yes"); + + if (not $self->wait_for_start($ret)) { + return undef; + } + + $ret->{DC_SERVER} = $s3dcvars->{SERVER}; + $ret->{DC_SERVER_IP} = $s3dcvars->{SERVER_IP}; + $ret->{DC_NETBIOSNAME} = $s3dcvars->{NETBIOSNAME}; + $ret->{DC_USERNAME} = $s3dcvars->{USERNAME}; + $ret->{DC_PASSWORD} = $s3dcvars->{PASSWORD}; + + return $ret; +} + +sub setup_ktest($$$) +{ + my ($self, $prefix) = @_; + + print "PROVISIONING server with security=ads..."; + + my $ktest_options = " + workgroup = KTEST + realm = ktest.samba.example.com + security = ads + username map = $prefix/lib/username.map +"; + + my $ret = $self->provision($prefix, + "LOCALKTEST6", + 6, + "localktest6pass", + $ktest_options); + + $ret or return undef; + + my $ctx; + my $prefix_abs = abs_path($prefix); + $ctx = {}; + $ctx->{krb5_conf} = "$prefix_abs/lib/krb5.conf"; + $ctx->{domain} = "KTEST"; + $ctx->{realm} = "KTEST.SAMBA.EXAMPLE.COM"; + $ctx->{dnsname} = lc($ctx->{realm}); + $ctx->{kdc_ipv4} = "0.0.0.0"; + Samba::mk_krb5_conf($ctx, ""); + + $ret->{KRB5_CONFIG} = $ctx->{krb5_conf}; + + open(USERMAP, ">$prefix/lib/username.map") or die("Unable to open $prefix/lib/username.map"); + print USERMAP " +$ret->{USERNAME} = KTEST\\Administrator +"; + close(USERMAP); + +#This is the secrets.tdb created by 'net ads join' from Samba3 to a +#Samba4 DC with the same parameters as are being used here. The +#domain SID is S-1-5-21-1071277805-689288055-3486227160 + + if (defined($ENV{BUILD_TDB2})) { + system("cp $self->{srcdir}/source3/selftest/ktest-secrets.tdb2 $prefix/private/secrets.tdb"); + } else { + system("cp $self->{srcdir}/source3/selftest/ktest-secrets.tdb $prefix/private/secrets.tdb"); + } + chmod 0600, "$prefix/private/secrets.tdb"; + +#This uses a pre-calculated krb5 credentials cache, obtained by running Samba4 with: +# "--option=kdc:service ticket lifetime=239232" "--option=kdc:user ticket lifetime=239232" "--option=kdc:renewal lifetime=239232" +# +#and having in krb5.conf: +# ticket_lifetime = 799718400 +# renew_lifetime = 799718400 +# +# The commands for the -2 keytab where were: +# kinit administrator@KTEST.SAMBA.EXAMPLE.COM +# kvno host/localktest6@KTEST.SAMBA.EXAMPLE.COM +# kvno cifs/localktest6@KTEST.SAMBA.EXAMPLE.COM +# kvno host/LOCALKTEST6@KTEST.SAMBA.EXAMPLE.COM +# kvno cifs/LOCALKTEST6@KTEST.SAMBA.EXAMPLE.COM +# +# and then for the -3 keytab, I did +# +# net changetrustpw; kdestroy and the same again. +# +# This creates a credential cache with a very long lifetime (2036 at +# at 2011-04), and shows that running 'net changetrustpw' does not +# break existing logins (for the secrets.tdb method at least). +# + + $ret->{KRB5_CCACHE}="FILE:$prefix/krb5_ccache"; + + system("cp $self->{srcdir}/source3/selftest/ktest-krb5_ccache-2 $prefix/krb5_ccache-2"); + chmod 0600, "$prefix/krb5_ccache-2"; + + system("cp $self->{srcdir}/source3/selftest/ktest-krb5_ccache-3 $prefix/krb5_ccache-3"); + chmod 0600, "$prefix/krb5_ccache-3"; + + $self->check_or_start($ret, "yes", "no", "yes"); + + if (not $self->wait_for_start($ret)) { + return undef; + } + return $ret; +} + +sub setup_maptoguest($$) +{ + my ($self, $path) = @_; + + print "PROVISIONING maptoguest..."; + + my $options = " +map to guest = bad user +"; + + my $vars = $self->provision($path, + "maptoguest", + 7, + "maptoguestpass", + $options); + + $vars or return undef; + $self->check_or_start($vars, - ($ENV{SMBD_MAXTIME} or 2700), "yes", "no", "yes"); - $self->wait_for_start($vars); + if (not $self->wait_for_start($vars)) { + return undef; + } - $self->{vars}->{secshare} = $vars; + $self->{vars}->{s3maptoguest} = $vars; return $vars; } @@ -243,8 +536,8 @@ sub read_pid($$) return $pid; } -sub check_or_start($$$$$) { - my ($self, $env_vars, $maxtime, $nmbd, $winbindd, $smbd) = @_; +sub check_or_start($$$$) { + my ($self, $env_vars, $nmbd, $winbindd, $smbd) = @_; unlink($env_vars->{NMBD_TEST_LOG}); print "STARTING NMBD..."; @@ -255,6 +548,7 @@ sub check_or_start($$$$$) { SocketWrapper::set_default_iface($env_vars->{SOCKET_WRAPPER_DEFAULT_IFACE}); + $ENV{KRB5_CONFIG} = $env_vars->{KRB5_CONFIG}; $ENV{WINBINDD_SOCKET_DIR} = $env_vars->{WINBINDD_SOCKET_DIR}; $ENV{NMBD_SOCKET_DIR} = $env_vars->{NMBD_SOCKET_DIR}; @@ -268,7 +562,7 @@ sub check_or_start($$$$$) { print("Skip nmbd received signal $signame"); exit 0; }; - sleep($maxtime); + sleep($self->{server_maxtime}); exit 0; } @@ -277,14 +571,14 @@ sub check_or_start($$$$$) { @optargs = split(/ /, $ENV{NMBD_OPTIONS}); } - $ENV{MAKE_TEST_BINARY} = $self->binpath("nmbd"); + $ENV{MAKE_TEST_BINARY} = Samba::bindir_path($self, "nmbd"); - my @preargs = ($self->binpath("timelimit"), $maxtime); + my @preargs = (Samba::bindir_path($self, "timelimit"), $self->{server_maxtime}); if(defined($ENV{NMBD_VALGRIND})) { @preargs = split(/ /, $ENV{NMBD_VALGRIND}); } - exec(@preargs, $self->binpath("nmbd"), "-F", "--no-process-group", "-S", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start nmbd: $!"); + exec(@preargs, Samba::bindir_path($self, "nmbd"), "-F", "--no-process-group", "--log-stdout", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start nmbd: $!"); } write_pid($env_vars, "nmbd", $pid); print "DONE\n"; @@ -298,6 +592,7 @@ sub check_or_start($$$$$) { SocketWrapper::set_default_iface($env_vars->{SOCKET_WRAPPER_DEFAULT_IFACE}); + $ENV{KRB5_CONFIG} = $env_vars->{KRB5_CONFIG}; $ENV{WINBINDD_SOCKET_DIR} = $env_vars->{WINBINDD_SOCKET_DIR}; $ENV{NMBD_SOCKET_DIR} = $env_vars->{NMBD_SOCKET_DIR}; @@ -311,7 +606,7 @@ sub check_or_start($$$$$) { print("Skip winbindd received signal $signame"); exit 0; }; - sleep($maxtime); + sleep($self->{server_maxtime}); exit 0; } @@ -320,14 +615,16 @@ sub check_or_start($$$$$) { @optargs = split(/ /, $ENV{WINBINDD_OPTIONS}); } - $ENV{MAKE_TEST_BINARY} = $self->binpath("winbindd"); + $ENV{MAKE_TEST_BINARY} = Samba::bindir_path($self, "winbindd"); - my @preargs = ($self->binpath("timelimit"), $maxtime); + my @preargs = (Samba::bindir_path($self, "timelimit"), $self->{server_maxtime}); if(defined($ENV{WINBINDD_VALGRIND})) { @preargs = split(/ /, $ENV{WINBINDD_VALGRIND}); } - exec(@preargs, $self->binpath("winbindd"), "-F", "--no-process-group", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start winbindd: $!"); + print "Starting winbindd with config $env_vars->{SERVERCONFFILE})\n"; + + exec(@preargs, Samba::bindir_path($self, "winbindd"), "-F", "--no-process-group", "--stdout", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start winbindd: $!"); } write_pid($env_vars, "winbindd", $pid); print "DONE\n"; @@ -341,6 +638,7 @@ sub check_or_start($$$$$) { SocketWrapper::set_default_iface($env_vars->{SOCKET_WRAPPER_DEFAULT_IFACE}); + $ENV{KRB5_CONFIG} = $env_vars->{KRB5_CONFIG}; $ENV{WINBINDD_SOCKET_DIR} = $env_vars->{WINBINDD_SOCKET_DIR}; $ENV{NMBD_SOCKET_DIR} = $env_vars->{NMBD_SOCKET_DIR}; @@ -354,20 +652,20 @@ sub check_or_start($$$$$) { print("Skip smbd received signal $signame"); exit 0; }; - sleep($maxtime); + sleep($self->{server_maxtime}); exit 0; } - $ENV{MAKE_TEST_BINARY} = $self->binpath("smbd"); + $ENV{MAKE_TEST_BINARY} = Samba::bindir_path($self, "smbd"); my @optargs = ("-d0"); if (defined($ENV{SMBD_OPTIONS})) { @optargs = split(/ /, $ENV{SMBD_OPTIONS}); } - my @preargs = ($self->binpath("timelimit"), $maxtime); + my @preargs = (Samba::bindir_path($self, "timelimit"), $self->{server_maxtime}); if(defined($ENV{SMBD_VALGRIND})) { @preargs = split(/ /,$ENV{SMBD_VALGRIND}); } - exec(@preargs, $self->binpath("smbd"), "-F", "--no-process-group", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start smbd: $!"); + exec(@preargs, Samba::bindir_path($self, "smbd"), "-F", "--no-process-group", "--log-stdout", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start smbd: $!"); } write_pid($env_vars, "smbd", $pid); print "DONE\n"; @@ -375,9 +673,9 @@ sub check_or_start($$$$$) { return 0; } -sub provision($$$$$$) +sub provision($$$$$$$) { - my ($self, $prefix, $server, $swiface, $password, $extra_options) = @_; + my ($self, $prefix, $server, $swiface, $password, $extra_options, $no_delete_prefix) = @_; ## ## setup the various environment variables we need @@ -397,6 +695,8 @@ sub provision($$$$$$) my $bindir_abs = abs_path($self->{bindir}); my $vfs_modulesdir_abs = ($ENV{VFSLIBDIR} or $bindir_abs); + my $dns_host_file = "$ENV{SELFTEST_PREFIX}/dns_host_file"; + my @dirs = (); my $shrdir="$prefix_abs/share"; @@ -453,7 +753,9 @@ sub provision($$$$$$) mkdir($prefix_abs, 0777); print "CREATE TEST ENVIRONMENT IN '$prefix'..."; - system("rm -rf $prefix_abs/*"); + if (not defined($no_delete_prefix) or not $no_delete_prefix) { + system("rm -rf $prefix_abs/*"); + } mkdir($_, 0777) foreach(@dirs); ## @@ -462,12 +764,18 @@ sub provision($$$$$$) chmod 0755, $ro_shrdir; my $unreadable_file = "$ro_shrdir/unreadable_file"; - open(UNREADABLE_FILE, ">$unreadable_file") or die("Unable to open $unreadable_file"); + unless (open(UNREADABLE_FILE, ">$unreadable_file")) { + warn("Unable to open $unreadable_file"); + return undef; + } close(UNREADABLE_FILE); chmod 0600, $unreadable_file; my $msdfs_target = "$ro_shrdir/msdfs-target"; - open(MSDFS_TARGET, ">$msdfs_target") or die("Unable to open $msdfs_target"); + unless (open(MSDFS_TARGET, ">$msdfs_target")) { + warn("Unable to open $msdfs_target"); + return undef; + } close(MSDFS_TARGET); chmod 0666, $msdfs_target; symlink "msdfs:$server_ip\\ro-tmp", "$msdfs_shrdir/msdfs-src1"; @@ -475,11 +783,11 @@ sub provision($$$$$$) my $conffile="$libdir/server.conf"; - my $nss_wrapper_pl = "$ENV{PERL} $RealBin/../lib/nss_wrapper/nss_wrapper.pl"; + my $nss_wrapper_pl = "$ENV{PERL} $self->{srcdir}/lib/nss_wrapper/nss_wrapper.pl"; my $nss_wrapper_passwd = "$privatedir/passwd"; my $nss_wrapper_group = "$privatedir/group"; - my $mod_printer_pl = "$ENV{PERL} $RealBin/../source3/script/tests/printing/modprinter.pl"; + my $mod_printer_pl = "$ENV{PERL} $self->{srcdir}/source3/script/tests/printing/modprinter.pl"; my @eventlog_list = ("dns server", "application"); @@ -515,13 +823,16 @@ sub provision($$$$$$) ## create conffile ## - open(CONF, ">$conffile") or die("Unable to open $conffile"); + unless (open(CONF, ">$conffile")) { + warn("Unable to open $conffile"); + return undef; + } print CONF " [global] netbios name = $server interfaces = $server_ip/8 bind interfaces only = yes - panic action = $RealBin/gdb_backtrace %d %\$(MAKE_TEST_BINARY) + panic action = $self->{srcdir}/selftest/gdb_backtrace %d %\$(MAKE_TEST_BINARY) workgroup = $domain @@ -530,8 +841,8 @@ sub provision($$$$$$) lock directory = $lockdir log file = $logdir/log.\%m log level = 0 - - name resolve order = bcast + debug pid = yes + max log size = 0 state directory = $lockdir cache directory = $lockdir @@ -562,8 +873,7 @@ sub provision($$$$$$) winbindd:socket dir = $wbsockdir nmbd:socket dir = $nmbdsockdir - idmap uid = 100000-200000 - idmap gid = 100000-200000 + idmap config * : range = 100000-200000 winbind enum users = yes winbind enum groups = yes @@ -592,7 +902,24 @@ sub provision($$$$$$) queue resume command = $bindir_abs/vlp tdbfile=$lockdir/vlp.tdb queueresume %p lpq cache time = 0 - rpc_server:epmapper = embedded + ncalrpc dir = $prefix_abs/ncalrpc + rpc_server:epmapper = external + rpc_server:spoolss = external + rpc_server:lsass = external + rpc_server:lsarpc = external + rpc_server:samr = external + rpc_server:netlogon = external + rpc_server:tcpip = yes + + rpc_daemon:epmd = fork + rpc_daemon:spoolssd = fork + rpc_daemon:lsasd = fork + + resolv:host file = $dns_host_file + + # The samba3.blackbox.smbclient_s3 test uses this to test that + # sending messages works, and that the %m sub works. + message command = mv %s $shrdir/message.%m # Begin extra options $extra_options @@ -608,6 +935,7 @@ sub provision($$$$$$) print CONF " [tmp] path = $shrdir + comment = smb username is [%U] [tmpguest] path = $shrdir guest ok = yes @@ -658,7 +986,10 @@ sub provision($$$$$$) ## create a test account ## - open(PASSWD, ">$nss_wrapper_passwd") or die("Unable to open $nss_wrapper_passwd"); + unless (open(PASSWD, ">$nss_wrapper_passwd")) { + warn("Unable to open $nss_wrapper_passwd"); + return undef; + } print PASSWD "nobody:x:$uid_nobody:$gid_nobody:nobody gecos:$prefix_abs:/bin/false $unix_name:x:$unix_uid:$unix_gids[0]:$unix_name gecos:$prefix_abs:/bin/false "; @@ -667,7 +998,10 @@ $unix_name:x:$unix_uid:$unix_gids[0]:$unix_name gecos:$prefix_abs:/bin/false } close(PASSWD); - open(GROUP, ">$nss_wrapper_group") or die("Unable to open $nss_wrapper_group"); + unless (open(GROUP, ">$nss_wrapper_group")) { + warn("Unable to open $nss_wrapper_group"); + return undef; + } print GROUP "nobody:x:$gid_nobody: nogroup:x:$gid_nogroup:nobody $unix_name-group:x:$unix_gids[0]: @@ -688,12 +1022,23 @@ domusers:X:$gid_domusers: $ENV{NSS_WRAPPER_PASSWD} = $nss_wrapper_passwd; $ENV{NSS_WRAPPER_GROUP} = $nss_wrapper_group; - open(PWD, "|".$self->binpath("smbpasswd")." -c $conffile -L -s -a $unix_name >/dev/null"); + my $cmd = Samba::bindir_path($self, "smbpasswd")." -c $conffile -L -s -a $unix_name > /dev/null"; + unless (open(PWD, "|$cmd")) { + warn("Unable to set password for test account\n$cmd"); + return undef; + } print PWD "$password\n$password\n"; - close(PWD) or die("Unable to set password for test account"); - + unless (close(PWD)) { + warn("Unable to set password for test account\n$cmd"); + return undef; + } print "DONE\n"; + open(HOSTS, ">>$ENV{SELFTEST_PREFIX}/dns_host_file") or die("Unable to open $ENV{SELFTEST_PREFIX}/dns_host_file"); + print HOSTS "A $server. $server_ip +"; + close(HOSTS); + $ret{SERVER_IP} = $server_ip; $ret{NMBD_TEST_LOG} = "$prefix/nmbd_test.log"; $ret{NMBD_TEST_LOG_POS} = 0; @@ -717,6 +1062,9 @@ domusers:X:$gid_domusers: $ret{NSS_WRAPPER_PASSWD} = $nss_wrapper_passwd; $ret{NSS_WRAPPER_GROUP} = $nss_wrapper_group; $ret{NSS_WRAPPER_WINBIND_SO_PATH} = $ENV{NSS_WRAPPER_WINBIND_SO_PATH}; + if (not defined($ret{NSS_WRAPPER_WINBIND_SO_PATH})) { + $ret{NSS_WRAPPER_WINBIND_SO_PATH} = Samba::bindir_path($self, "default/nsswitch/libnss-winbind.so"); + } $ret{LOCAL_PATH} = "$shrdir"; return \%ret; @@ -730,20 +1078,38 @@ sub wait_for_start($$) print "delaying for nbt name registration\n"; sleep(10); # This will return quickly when things are up, but be slow if we need to wait for (eg) SSL init - system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} __SAMBA__"); - system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} __SAMBA__"); - system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} -U 127.255.255.255 __SAMBA__"); - system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} $envvars->{SERVER}"); - system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} $envvars->{SERVER}"); + system(Samba::bindir_path($self, "nmblookup3") ." $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} __SAMBA__"); + system(Samba::bindir_path($self, "nmblookup3") ." $envvars->{CONFIGURATION} __SAMBA__"); + system(Samba::bindir_path($self, "nmblookup3") ." $envvars->{CONFIGURATION} -U 127.255.255.255 __SAMBA__"); + system(Samba::bindir_path($self, "nmblookup3") ." $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} $envvars->{SERVER}"); + system(Samba::bindir_path($self, "nmblookup3") ." $envvars->{CONFIGURATION} $envvars->{SERVER}"); + # make sure smbd is also up set print "wait for smbd\n"; - system($self->binpath("smbclient") ." $envvars->{CONFIGURATION} -L $envvars->{SERVER_IP} -U% -p 139 | head -2"); - system($self->binpath("smbclient") ." $envvars->{CONFIGURATION} -L $envvars->{SERVER_IP} -U% -p 139 | head -2"); + my $count = 0; + my $ret; + do { + $ret = system(Samba::bindir_path($self, "smbclient3") ." $envvars->{CONFIGURATION} -L $envvars->{SERVER} -U% -p 139"); + if ($ret != 0) { + sleep(2); + } + $count++ + } while ($ret != 0 && $count < 10); + if ($count == 10) { + print "SMBD failed to start up in a reasonable time (20sec)\n"; + teardown_env($self, $envvars); + return 0; + } # Ensure we have domain users mapped. - system($self->binpath("net") ." $envvars->{CONFIGURATION} groupmap add rid=513 unixgroup=domusers type=domain"); + $ret = system(Samba::bindir_path($self, "net") ." $envvars->{CONFIGURATION} groupmap add rid=513 unixgroup=domusers type=domain"); + if ($ret != 0) { + return 1; + } print $self->getlog_env($envvars); + + return 1; } 1;