use POSIX;
use target::Samba;
+sub have_ads($) {
+ my ($self) = @_;
+ my $found_ads = 0;
+ my $smbd_build_options = Samba::bindir_path($self, "smbd") . " -b|";
+ open(IN, $smbd_build_options) or die("Unable to run $smbd_build_options: $!");
+
+ while (<IN>) {
+ if (/WITH_ADS/) {
+ $found_ads = 1;
+ }
+ }
+ close IN;
+
+ # If we were not built with ADS support, pretend we were never even available
+ return $found_ads;
+}
+
sub new($$) {
- my ($classname, $bindir, $binary_mapping, $srcdir, $exeext, $server_maxtime) = @_;
- $exeext = "" unless defined($exeext);
+ my ($classname, $bindir, $binary_mapping, $srcdir, $server_maxtime) = @_;
my $self = { vars => {},
bindir => $bindir,
binary_mapping => $binary_mapping,
srcdir => $srcdir,
- exeext => $exeext,
server_maxtime => $server_maxtime
};
bless $self;
sub teardown_env($$)
{
my ($self, $envvars) = @_;
+ my $count = 0;
+
+ # This should cause smbd to terminate gracefully
+ close($envvars->{STDIN_PIPE});
+
+ my $smbdpid = $envvars->{SMBD_TL_PID};
+ my $nmbdpid = $envvars->{NMBD_TL_PID};
+ my $winbinddpid = $envvars->{WINBINDD_TL_PID};
+
+ # This should give it time to write out the gcov data
+ until ($count > 20) {
+ my $smbdchild = Samba::cleanup_child($smbdpid, "smbd");
+ my $nmbdchild = Samba::cleanup_child($nmbdpid, "nmbd");
+ my $winbinddchild = Samba::cleanup_child($winbinddpid, "winbindd");
+ if ($smbdchild == -1
+ && $nmbdchild == -1
+ && $winbinddchild == -1) {
+ last;
+ }
+ sleep(1);
+ $count++;
+ }
- my $smbdpid = read_pid($envvars, "smbd");
- my $nmbdpid = read_pid($envvars, "nmbd");
- my $winbinddpid = read_pid($envvars, "winbindd");
+ if ($count <= 20 && kill(0, $smbdpid, $nmbdpid, $winbinddpid) == 0) {
+ return;
+ }
$self->stop_sig_term($smbdpid);
$self->stop_sig_term($nmbdpid);
$self->stop_sig_term($winbinddpid);
- sleep(2);
+ $count = 0;
+ until ($count > 10) {
+ my $smbdchild = Samba::cleanup_child($smbdpid, "smbd");
+ my $nmbdchild = Samba::cleanup_child($nmbdpid, "nmbd");
+ my $winbinddchild = Samba::cleanup_child($winbinddpid, "winbindd");
+ if ($smbdchild == -1
+ && $nmbdchild == -1
+ && $winbinddchild == -1) {
+ last;
+ }
+ sleep(1);
+ $count++;
+ }
+ if ($count <= 10 && kill(0, $smbdpid, $nmbdpid, $winbinddpid) == 0) {
+ return;
+ }
+
+ warn("timelimit process did not quit on SIGTERM, sending SIGKILL");
$self->stop_sig_kill($smbdpid);
$self->stop_sig_kill($nmbdpid);
$self->stop_sig_kill($winbinddpid);
{
my ($self, $envvars) = @_;
+ my $childpid = waitpid(-1, WNOHANG);
+
# TODO ...
return 1;
}
{
my ($self, $envname, $path) = @_;
+ if (defined($self->{vars}->{$envname})) {
+ return $self->{vars}->{$envname};
+ }
+
if ($envname eq "s3dc") {
return $self->setup_s3dc("$path/s3dc");
- } elsif ($envname eq "secshare") {
- return $self->setup_secshare("$path/secshare");
+ } elsif ($envname eq "simpleserver") {
+ return $self->setup_simpleserver("$path/simpleserver");
} 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}->{s3dc})) {
if (not defined($self->setup_s3dc("$path/s3dc"))) {
}
return $self->setup_member("$path/member", $self->{vars}->{s3dc});
} else {
- return undef;
+ return "UNKNOWN";
}
}
domain master = yes
domain logons = yes
lanman auth = yes
+
+ rpc_server:epmapper = external
+ rpc_server:spoolss = external
+ rpc_server:lsarpc = external
+ rpc_server:samr = external
+ rpc_server:netlogon = external
+ rpc_server:register_embedded_np = yes
+
+ rpc_daemon:epmd = fork
+ rpc_daemon:spoolssd = fork
+ rpc_daemon:lsasd = fork
";
my $vars = $self->provision($path,
"LOCALS3DC2",
- 2,
"locals3dc2pass",
$s3dc_options);
";
my $ret = $self->provision($prefix,
"LOCALMEMBER3",
- 3,
"localmember3pass",
$member_options);
sub setup_admember($$$$)
{
- my ($self, $prefix, $dcvars, $iface) = @_;
+ my ($self, $prefix, $dcvars) = @_;
+
+ # If we didn't build with ADS, pretend this env was never available
+ if (not $self->have_ads()) {
+ return "UNKNOWN";
+ }
- print "PROVISIONING S3 AD MEMBER$iface...";
+ print "PROVISIONING S3 AD MEMBER...";
my $member_options = "
security = ads
";
my $ret = $self->provision($prefix,
- "LOCALADMEMBER$iface",
- $iface,
- "loCalMember${iface}Pass",
+ "LOCALADMEMBER",
+ "loCalMemberPass",
$member_options);
$ret or return undef;
$ctx->{realm} = $dcvars->{REALM};
$ctx->{dnsname} = lc($dcvars->{REALM});
$ctx->{kdc_ipv4} = $dcvars->{SERVER_IP};
- Samba::mk_krb5_conf($ctx);
+ Samba::mk_krb5_conf($ctx, "");
$ret->{KRB5_CONFIG} = $ctx->{krb5_conf};
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_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;
-}
-
-sub setup_secshare($$)
+sub setup_simpleserver($$)
{
my ($self, $path) = @_;
+ my $vfs_modulesdir_abs = $ENV{VFSLIBDIR};
print "PROVISIONING server with security=share...";
- my $secshare_options = "
- security = share
+ my $prefix_abs = abs_path($path);
+
+ my $simpleserver_options = "
lanman auth = yes
+ vfs objects = $vfs_modulesdir_abs/xattr_tdb.so $vfs_modulesdir_abs/streams_depot.so
+
+[vfs_aio_fork]
+ path = $prefix_abs/share
+ vfs objects = $vfs_modulesdir_abs/aio_fork.so
+ read only = no
+ vfs_aio_fork:erratic_testing_mode=yes
";
my $vars = $self->provision($path,
"LOCALSHARE4",
- 4,
"local4pass",
- $secshare_options);
+ $simpleserver_options);
$vars or return undef;
return undef;
}
- $self->{vars}->{secshare} = $vars;
+ $self->{vars}->{simpleserver} = $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) = @_;
+ # If we didn't build with ADS, pretend this env was never available
+ if (not $self->have_ads()) {
+ return "UNKNOWN";
+ }
+
print "PROVISIONING server with security=ads...";
my $ktest_options = "
realm = ktest.samba.example.com
security = ads
username map = $prefix/lib/username.map
+ server signing = required
";
my $ret = $self->provision($prefix,
"LOCALKTEST6",
- 6,
"localktest6pass",
$ktest_options);
$ctx->{realm} = "KTEST.SAMBA.EXAMPLE.COM";
$ctx->{dnsname} = lc($ctx->{realm});
$ctx->{kdc_ipv4} = "0.0.0.0";
- Samba::mk_krb5_conf($ctx);
+ Samba::mk_krb5_conf($ctx, "");
$ret->{KRB5_CONFIG} = $ctx->{krb5_conf};
#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");
- }
+ 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:
system("cp $self->{srcdir}/source3/selftest/ktest-krb5_ccache-3 $prefix/krb5_ccache-3");
chmod 0600, "$prefix/krb5_ccache-3";
+ # We need world access to this share, as otherwise the domain
+ # administrator from the AD domain provided by ktest can't
+ # access the share for tests.
+ chmod 0777, "$prefix/share";
+
$self->check_or_start($ret, "yes", "no", "yes");
if (not $self->wait_for_start($ret)) {
my $vars = $self->provision($path,
"maptoguest",
- 7,
"maptoguestpass",
$options);
return $pid;
}
-sub check_or_start($$$$) {
+sub check_or_start($$$$$) {
my ($self, $env_vars, $nmbd, $winbindd, $smbd) = @_;
+ # use a pipe for stdin in the child processes. This allows
+ # those processes to monitor the pipe for EOF to ensure they
+ # exit when the test script exits
+ pipe(STDIN_READER, $env_vars->{STDIN_PIPE});
+
unlink($env_vars->{NMBD_TEST_LOG});
print "STARTING NMBD...";
my $pid = fork();
$ENV{NSS_WRAPPER_GROUP} = $env_vars->{NSS_WRAPPER_GROUP};
$ENV{NSS_WRAPPER_WINBIND_SO_PATH} = $env_vars->{NSS_WRAPPER_WINBIND_SO_PATH};
+ $ENV{UID_WRAPPER} = "1";
+
if ($nmbd ne "yes") {
$SIG{USR1} = $SIG{ALRM} = $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub {
my $signame = shift;
@preargs = split(/ /, $ENV{NMBD_VALGRIND});
}
+ close($env_vars->{STDIN_PIPE});
+ open STDIN, ">&", \*STDIN_READER or die "can't dup STDIN_READER to STDIN: $!";
+
exec(@preargs, Samba::bindir_path($self, "nmbd"), "-F", "--no-process-group", "--log-stdout", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start nmbd: $!");
}
+ $env_vars->{NMBD_TL_PID} = $pid;
write_pid($env_vars, "nmbd", $pid);
print "DONE\n";
$ENV{NSS_WRAPPER_GROUP} = $env_vars->{NSS_WRAPPER_GROUP};
$ENV{NSS_WRAPPER_WINBIND_SO_PATH} = $env_vars->{NSS_WRAPPER_WINBIND_SO_PATH};
+ $ENV{UID_WRAPPER} = "1";
+
if ($winbindd ne "yes") {
$SIG{USR1} = $SIG{ALRM} = $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub {
my $signame = shift;
@preargs = split(/ /, $ENV{WINBINDD_VALGRIND});
}
- print "Starting winbindd with config $env_vars->{SERVERCONFFILE})\n";
+ print "Starting winbindd with config $env_vars->{SERVERCONFFILE}\n";
+
+ close($env_vars->{STDIN_PIPE});
+ open STDIN, ">&", \*STDIN_READER or die "can't dup STDIN_READER to STDIN: $!";
exec(@preargs, Samba::bindir_path($self, "winbindd"), "-F", "--no-process-group", "--stdout", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start winbindd: $!");
}
+ $env_vars->{WINBINDD_TL_PID} = $pid;
write_pid($env_vars, "winbindd", $pid);
print "DONE\n";
$ENV{NSS_WRAPPER_GROUP} = $env_vars->{NSS_WRAPPER_GROUP};
$ENV{NSS_WRAPPER_WINBIND_SO_PATH} = $env_vars->{NSS_WRAPPER_WINBIND_SO_PATH};
+ $ENV{UID_WRAPPER} = "1";
+
if ($smbd ne "yes") {
$SIG{USR1} = $SIG{ALRM} = $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub {
my $signame = shift;
if(defined($ENV{SMBD_VALGRIND})) {
@preargs = split(/ /,$ENV{SMBD_VALGRIND});
}
+
+ close($env_vars->{STDIN_PIPE});
+ open STDIN, ">&", \*STDIN_READER or die "can't dup STDIN_READER to STDIN: $!";
+
exec(@preargs, Samba::bindir_path($self, "smbd"), "-F", "--no-process-group", "--log-stdout", "-s", $env_vars->{SERVERCONFFILE}, @optargs) or die("Unable to start smbd: $!");
}
+ $env_vars->{SMBD_TL_PID} = $pid;
write_pid($env_vars, "smbd", $pid);
print "DONE\n";
+ close(STDIN_READER);
+
return 0;
}
-sub provision($$$$$$$)
+sub provision($$$$$$)
{
- my ($self, $prefix, $server, $swiface, $password, $extra_options, $no_delete_prefix) = @_;
+ my ($self, $prefix, $server, $password, $extra_options, $no_delete_prefix) = @_;
##
## setup the various environment variables we need
##
+ my $swiface = Samba::get_interface($server);
my %ret = ();
my $server_ip = "127.0.0.$swiface";
my $domain = "SAMBA-TEST";
##
my ($max_uid, $max_gid);
- my ($uid_nobody, $uid_root);
+ my ($uid_nobody, $uid_root, $uid_pdbtest);
my ($gid_nobody, $gid_nogroup, $gid_root, $gid_domusers);
if ($unix_uid < 0xffff - 2) {
$uid_root = $max_uid - 1;
$uid_nobody = $max_uid - 2;
+ $uid_pdbtest = $max_uid - 3;
if ($unix_gids[0] < 0xffff - 3) {
$max_gid = 0xffff;
interfaces = $server_ip/8
bind interfaces only = yes
panic action = $self->{srcdir}/selftest/gdb_backtrace %d %\$(MAKE_TEST_BINARY)
+ smbd:suicide mode = yes
workgroup = $domain
pid directory = $piddir
lock directory = $lockdir
log file = $logdir/log.\%m
- log level = 0
+ log level = 1
debug pid = yes
max log size = 0
# min receivefile size = 4000
- max protocol = SMB2
read only = no
server signing = auto
smbd:sharedelay = 100000
-# smbd:writetimeupdatedelay = 500000
+ smbd:writetimeupdatedelay = 500000
map hidden = no
map system = no
map readonly = no
store dos attributes = yes
- create mask = 755
- vfs objects = $vfs_modulesdir_abs/xattr_tdb.so $vfs_modulesdir_abs/streams_depot.so
+ create mask = 0777
+ directory mask = 0777
+ dos filemode = yes
+ vfs objects = $vfs_modulesdir_abs/acl_xattr.so $vfs_modulesdir_abs/fake_acls.so $vfs_modulesdir_abs/xattr_tdb.so $vfs_modulesdir_abs/streams_depot.so
printing = vlp
print command = $bindir_abs/vlp tdbfile=$lockdir/vlp.tdb print %p %s
lpq cache time = 0
ncalrpc dir = $prefix_abs/ncalrpc
- rpc_server:epmapper = daemon
- rpc_server:spoolss = daemon
- rpc_server:tcpip = yes
-
resolv:host file = $dns_host_file
# The samba3.blackbox.smbclient_s3 test uses this to test that
[tmp]
path = $shrdir
comment = smb username is [%U]
+[tmpenc]
+ path = $shrdir
+ comment = encrypt smb username is [%U]
+ smb encrypt = required
[tmpguest]
path = $shrdir
guest ok = yes
[hideunwrite]
copy = tmp
hide unwriteable files = yes
+[durable]
+ copy = tmp
+ kernel share modes = no
+ kernel oplocks = no
+ posix locking = no
[print1]
copy = tmp
printable = yes
copy = print1
[print3]
copy = print1
+ default devmode = no
[lp]
copy = print1
+[xcopy_share]
+ path = $shrdir
+ comment = smb username is [%U]
+ create mask = 777
+ force create mode = 777
+[posix_share]
+ path = $shrdir
+ comment = smb username is [%U]
+ create mask = 0777
+ force create mode = 0
+ directory mask = 0777
+ force directory mode = 0
+ vfs objects = $vfs_modulesdir_abs/xattr_tdb.so
+
[print\$]
copy = tmp
";
}
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
+pdbtest:x:$uid_pdbtest:$gid_nogroup:pdbtest gecos:$prefix_abs:/bin/false
";
if ($unix_uid != 0) {
print PASSWD "root:x:$uid_root:$gid_root:root gecos:$prefix_abs:/bin/false";
}
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);
+ open(DNS_UPDATE_LIST, ">$prefix/dns_update_list") or die("Unable to open $$prefix/dns_update_list");
+ print DNS_UPDATE_LIST "A $server. $server_ip";
+ close(DNS_UPDATE_LIST);
+
+ if (system("$ENV{SRCDIR_ABS}/source4/scripting/bin/samba_dnsupdate --all-interfaces --use-file=$dns_host_file -s $conffile --update-list=$prefix/dns_update_list --no-substiutions --no-credentials") != 0) {
+ die "Unable to update hostname into $dns_host_file";
+ }
$ret{SERVER_IP} = $server_ip;
$ret{NMBD_TEST_LOG} = "$prefix/nmbd_test.log";
$ret{SOCKET_WRAPPER_DEFAULT_IFACE} = $swiface;
$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{NSS_WRAPPER_WINBIND_SO_PATH} = Samba::nss_wrapper_winbind_so_path($self);
$ret{LOCAL_PATH} = "$shrdir";
return \%ret;
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(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}");
+ my $nmblookup = Samba::bindir_path($self, "nmblookup3");
+ system("$nmblookup $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} __SAMBA__");
+ system("$nmblookup $envvars->{CONFIGURATION} __SAMBA__");
+ system("$nmblookup $envvars->{CONFIGURATION} -U 127.255.255.255 __SAMBA__");
+ system("$nmblookup $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} $envvars->{SERVER}");
+ system("$nmblookup $envvars->{CONFIGURATION} $envvars->{SERVER}");
# make sure smbd is also up set
print "wait for smbd\n";