The branch, master has been updated via 1958cd8a7fb ldap server: generate correct referral schemes via 6ccf74cf878 ldap tests: test scheme for referrals via 163897f1253 selftest: Use scalar variable for new daemon_ctx hashmap via b976502d496 selftest: Add common fork_and_exec() function via 746e137777e selftest: Rework setting env variables for other forked binaries via ae3e33d4929 selftest: Rework setting env variables for nmbd via c79f0c19755 selftest: Store fork-and-exec daemon info in a hashmap via ad30fdc6ba2 selftest: Add helper function to build up s3 daemon cmd via ba9323abde0 selftest: Move fork cmd args up a level via 0fd3685cfd8 selftest: remove unused variable (@optargs) via a60e59735c2 selftest: Refactor duplicated code to set ENV vars via d2f54775d3f selftest: Run samba3.srvsvc tests covering more of the srvsvc server via 773e476203f selftest: Remove infinite client/server loop in srvsvc_NetNameValidate test via 8dd0421a428 selftest: Add more testing of wkssvc in source3 via 430968b32dc Run test for initshutdown from e7424897a12 ctdb: Make TDB_SEQNUM work synchronously with ctdb
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 1958cd8a7fb81ec51b81944ecf4dd0fb5c4208fa Author: Gary Lockyer <g...@catalyst.net.nz> Date: Tue May 21 13:17:22 2019 +1200 ldap server: generate correct referral schemes Ensure that the referrals returned in a search request use the same scheme as the request, i.e. referrals recieved via ldap are prefixed with "ldap://" and those over ldaps are prefixed with "ldaps://" BUG: https://bugzilla.samba.org/show_bug.cgi?id=12478 Signed-off-by: Gary Lockyer <g...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> Autobuild-User(master): Andrew Bartlett <abart...@samba.org> Autobuild-Date(master): Fri May 24 05:12:14 UTC 2019 on sn-devel-184 commit 6ccf74cf878c295903673e3a1d1ed924a5e87547 Author: Gary Lockyer <g...@catalyst.net.nz> Date: Tue May 21 13:14:08 2019 +1200 ldap tests: test scheme for referrals Ensure that the referrals returned in a search request use the same scheme as the request, i.e. referrals recieved via ldap are prefixed with "ldap://" and those over ldaps are prefixed with "ldaps://" BUG: https://bugzilla.samba.org/show_bug.cgi?id=12478 Signed-off-by: Gary Lockyer <g...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 163897f12538ae12dbc2bd556adcc1abc4f0f438 Author: Tim Beale <timbe...@catalyst.net.nz> Date: Thu May 23 16:58:20 2019 +1200 selftest: Use scalar variable for new daemon_ctx hashmap The selftest code typically stores hashmaps as scalar variables (i.e. it only ever uses references to hashmaps). So much so that using a regular hashmap (and passing it by reference via \%daemon_ctx) looks out of place. Using the hashmap directly made more sense when it was only being used locally, but now the hashmap is being passed by reference into a function anyway, so storing it as a scalar doesn't make much difference. Signed-off-by: Tim Beale <timbe...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit b976502d496cca0e8e04a2e5f2c72383efb296a7 Author: Tim Beale <timbe...@catalyst.net.nz> Date: Thu May 23 16:35:07 2019 +1200 selftest: Add common fork_and_exec() function Now the code has been refactored, we can move it into a common function. This reduces code duplication and means we have a common place where we start samba daemons from. Note that some daemons behave slightly different, but the $daemon_ctx allows us to customize their behaviour a bit. Signed-off-by: Tim Beale <timbe...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 746e137777e559afb7851a359d56580c58231ddd Author: Tim Beale <timbe...@catalyst.net.nz> Date: Thu May 23 15:47:46 2019 +1200 selftest: Rework setting env variables for other forked binaries Final refactor to merge the fork-and-exec code into a common function. We can now use $daemon_ctx{ENV_VARS} to customize differences between the forked binaries: - samba: add in extra env variables on top of the defaults. - dns_hub: there are no ENV variables we need to export. - winbindd/smbd: these use the defaults, so they pass through an undefined $daemon_ctx{ENV_VARS} (purely to make the code common across all 5 places). Signed-off-by: Tim Beale <timbe...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit ae3e33d492904ae05d4ff24c3d8f50fecaca2971 Author: Tim Beale <timbe...@catalyst.net.nz> Date: Thu May 23 15:47:46 2019 +1200 selftest: Rework setting env variables for nmbd Instead of having a special $skip_resolv_conf parameter just for nmbd, use the get_env_for_process() API and customize the hashmap returned. Pass the customized hashmap in as an optional part of the daemon_ctx. Signed-off-by: Tim Beale <timbe...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit c79f0c197558e86fe4f9e27b0c4682441bb55b0b Author: Tim Beale <timbe...@catalyst.net.nz> Date: Thu May 23 13:45:49 2019 +1200 selftest: Store fork-and-exec daemon info in a hashmap This intermediary refactor adds a hashmap that stores the values needed to run each samba daemon. This adds a bit more code in the short term, but it basically means the code in 5 different places now becomes identical, and we can extract it out to a common function. The converting FULL_CMD from an array reference back to an array is a bit ugly, but we can clean this up a bit once the code is all in one place. Signed-off-by: Tim Beale <timbe...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit ad30fdc6ba28374b84dbe94af92c5694bff6f86e Author: Tim Beale <timbe...@catalyst.net.nz> Date: Thu May 23 12:37:04 2019 +1200 selftest: Add helper function to build up s3 daemon cmd The s3 daemons all basically use the same command logic, it's just they use slightly different environment variables. This adds a common helper function, which we can pass the specific environment variables into. (Note the slight parameter difference for winbind with --stdout vs --log-stdout). Signed-off-by: Tim Beale <timbe...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit ba9323abde060c832274e84f1e8a6b79fccc5fce Author: Tim Beale <timbe...@catalyst.net.nz> Date: Thu May 23 12:12:44 2019 +1200 selftest: Move fork cmd args up a level This is a fairly simple move of code and is the first step in a larger refactor. It doesn't matter if we build up the command args prior to the fork (we only use them in the forked child). But moving the code means the code to handle the fork-and-exec becomes common code that is repeated in several places throughout Samba3.pm and Samba4.pm. Signed-off-by: Tim Beale <timbe...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 0fd3685cfd8f6613517552685f649c649fe4cd08 Author: Tim Beale <timbe...@catalyst.net.nz> Date: Wed May 22 09:33:34 2019 +1200 selftest: remove unused variable (@optargs) Signed-off-by: Tim Beale <timbe...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit a60e59735c20f8e342fa1b00ae5715f1673f22be Author: Tim Beale <timbe...@catalyst.net.nz> Date: Tue May 21 11:27:45 2019 +1200 selftest: Refactor duplicated code to set ENV vars Whenever we started a process, we basically used the same code to setup the ENV variables. The s4 ENVNAME may now be slightly different in the child process that runs samba (i.e. '$testenv.samba'), but that ENV var did not appeared to be used much. I'm not sure if the current difference in $skip_resolv_wrapper logic for nmbd was deliberate or accidental, but I've preserved the logic for now. Signed-off-by: Tim Beale <timbe...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit d2f54775d3fe5e3ef6d00121ac7ab382dd58ddcd Author: Andrew Bartlett <abart...@samba.org> Date: Thu May 23 12:21:46 2019 +1200 selftest: Run samba3.srvsvc tests covering more of the srvsvc server Found by LCOV. Some of the failures should be fixed by setting "restrict anonymous = 2" as requested by bug 12775 Signed-off-by: Andrew Bartlett <abart...@samba.org> Reviewed-by: Gary Lockyer <g...@catalyst.net.nz> commit 773e476203fcd15a20032d49e3377417ccd237fe Author: Andrew Bartlett <abart...@samba.org> Date: Thu May 23 12:20:35 2019 +1200 selftest: Remove infinite client/server loop in srvsvc_NetNameValidate test Signed-off-by: Andrew Bartlett <abart...@samba.org> Reviewed-by: Gary Lockyer <g...@catalyst.net.nz> commit 8dd0421a4284e23f756dfafa32d2831ceb6d1b88 Author: Andrew Bartlett <abart...@samba.org> Date: Thu May 23 11:19:10 2019 +1200 selftest: Add more testing of wkssvc in source3 The samba3.wkssvc test is not as comprehensive, but rpc.wkssvc needs to run against the ad_member environment to get past a builtin administrators check. Signed-off-by: Andrew Bartlett <abart...@samba.org> Reviewed-by: Gary Lockyer <g...@catalyst.net.nz> commit 430968b32dc7d14876b8ed3bbbcfdc4d34a1263b Author: Andrew Bartlett <abart...@samba.org> Date: Thu May 23 10:46:27 2019 +1200 Run test for initshutdown The test already existed but was not run. Found by LCOV Signed-off-by: Andrew Bartlett <abart...@samba.org> Reviewed-by: Gary Lockyer <g...@catalyst.net.nz> ----------------------------------------------------------------------- Summary of changes: lib/ldb/include/ldb_module.h | 5 + python/samba/tests/ldap_referrals.py | 91 ++++++++++ selftest/knownfail.d/initshutdown | 3 + selftest/knownfail.d/srvsvc | 24 +++ selftest/knownfail.d/wkssvc | 25 +++ selftest/target/Samba.pm | 100 +++++++++++ selftest/target/Samba3.pm | 258 +++++++++-------------------- selftest/target/Samba4.pm | 153 ++++++++--------- source3/selftest/tests.py | 8 +- source4/dsdb/samdb/ldb_modules/partition.c | 16 +- source4/ldap_server/ldap_backend.c | 18 ++ source4/ldap_server/ldap_server.c | 1 + source4/ldap_server/ldap_server.h | 6 + source4/selftest/tests.py | 8 + source4/torture/rpc/srvsvc.c | 7 + 15 files changed, 452 insertions(+), 271 deletions(-) create mode 100644 python/samba/tests/ldap_referrals.py create mode 100644 selftest/knownfail.d/initshutdown create mode 100644 selftest/knownfail.d/srvsvc create mode 100644 selftest/knownfail.d/wkssvc Changeset truncated at 500 lines: diff --git a/lib/ldb/include/ldb_module.h b/lib/ldb/include/ldb_module.h index 3b728614909..7f8b57dfeec 100644 --- a/lib/ldb/include/ldb_module.h +++ b/lib/ldb/include/ldb_module.h @@ -103,6 +103,11 @@ struct ldb_module; * attributes, not to be printed in trace messages */ #define LDB_SECRET_ATTRIBUTE_LIST_OPAQUE "LDB_SECRET_ATTRIBUTE_LIST" +/* + * The scheme to be used for referral entries, i.e. ldap or ldaps + */ +#define LDAP_REFERRAL_SCHEME_OPAQUE "LDAP_REFERRAL_SCHEME" + /* these function pointers define the operations that a ldb module can intercept */ diff --git a/python/samba/tests/ldap_referrals.py b/python/samba/tests/ldap_referrals.py new file mode 100644 index 00000000000..86a39d4e602 --- /dev/null +++ b/python/samba/tests/ldap_referrals.py @@ -0,0 +1,91 @@ +# Test that ldap referral entiries are created and formatted correctly +# +# Copyright (C) Andrew Bartlett 2019 +# +# Based on Unit tests for the notification control +# Copyright (C) Stefan Metzmacher 2016 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +from __future__ import print_function +import optparse +import os +import sys + +import samba +from samba.auth import system_session +import samba.getopt as options +from samba import ldb +from samba.samdb import SamDB +import samba.tests +from samba.tests.subunitrun import SubunitOptions + +sys.path.insert(0, "bin/python") +parser = optparse.OptionParser("ldap_referrals.py [options]") +sambaopts = options.SambaOptions(parser) +parser.add_option_group(sambaopts) +parser.add_option_group(options.VersionOptions(parser)) +# use command line creds if available +credopts = options.CredentialsOptions(parser) +parser.add_option_group(credopts) +subunitopts = SubunitOptions(parser) +parser.add_option_group(subunitopts) +opts, args = parser.parse_args() + +lp = sambaopts.get_loadparm() +creds = credopts.get_credentials(lp) + + +class LdapReferralTest(samba.tests.TestCase): + + def setUp(self): + super(LdapReferralTest, self).setUp() + + # The referral entries for an ldap request should have the ldap scheme + # i.e. then should all start with "ldap://" + def test_ldap_search(self): + server = os.environ["SERVER"] + url = "ldap://{0}".format(server) + db = SamDB( + url, credentials=creds, session_info=system_session(lp), lp=lp) + res = db.search( + base=db.domain_dn(), + expression="(objectClass=nonexistent)", + scope=ldb.SCOPE_SUBTREE, + attrs=["objectGUID", "samAccountName"]) + + referals = res.referals + for referal in referals: + self.assertTrue( + referal.startswith("ldap://"), + "{0} does not start with ldap://".format(referal)) + + # The referral entries for an ldaps request should have the ldaps scheme + # i.e. then should all start with "ldaps://" + def test_ldaps_search(self): + server = os.environ["SERVER"] + url = "ldaps://{0}".format(server) + db = SamDB( + url, credentials=creds, session_info=system_session(lp), lp=lp) + res = db.search( + base=db.domain_dn(), + expression="(objectClass=nonexistent)", + scope=ldb.SCOPE_SUBTREE, + attrs=["objectGUID", "samAccountName"]) + + referals = res.referals + for referal in referals: + self.assertTrue( + referal.startswith("ldaps://"), + "{0} does not start with ldaps://".format(referal)) diff --git a/selftest/knownfail.d/initshutdown b/selftest/knownfail.d/initshutdown new file mode 100644 index 00000000000..0e8d76adc4b --- /dev/null +++ b/selftest/knownfail.d/initshutdown @@ -0,0 +1,3 @@ +# the initshutdown pipe is not provided by the AD DC +^samba3.rpc.initshutdown.initshutdown.InitEx\(ad_dc\) +^samba3.rpc.initshutdown.initshutdown.Init\(ad_dc\) diff --git a/selftest/knownfail.d/srvsvc b/selftest/knownfail.d/srvsvc new file mode 100644 index 00000000000..63444c8eda0 --- /dev/null +++ b/selftest/knownfail.d/srvsvc @@ -0,0 +1,24 @@ +# Except where noted these are missing RPCs with just give a simple +# fault (mapped to NT_STATUS_RPC_PROCNUM_OUT_OF_RANGE\) +^samba3.rpc.srvsvc.srvsvc \(admin access\).NetShareGetInfo\(ad_member\) +# Level 501 is supported in the s3 srvsrv server +^samba3.rpc.srvsvc.srvsvc \(admin access\).NetShareEnum\(ad_member\) +^samba3.rpc.srvsvc.srvsvc \(admin access\).NetTransportEnum\(ad_member\) +^samba3.rpc.srvsvc.srvsvc \(admin access\).NetShareEnumAll\(ad_member\) +^samba3.rpc.srvsvc.srvsvc \(admin access\).NetCharDevQEnum\(ad_member\) +^samba3.rpc.srvsvc.srvsvc \(admin access\).NetCharDevEnum\(ad_member\) +^samba3.rpc.srvsvc.srvsvc anonymous access.NetShareGetInfo\(ad_member\) +^samba3.rpc.srvsvc.srvsvc anonymous access.NetShareEnum\(ad_member\) +^samba3.rpc.srvsvc.srvsvc anonymous access.NetShareEnumAll\(ad_member\) +^samba3.rpc.srvsvc.srvsvc \(admin access\).NetShareGetInfo\(ad_dc\) +# Level 501 is supported in the s3 srvsrv server +^samba3.rpc.srvsvc.srvsvc \(admin access\).NetShareEnum\(ad_dc\) +^samba3.rpc.srvsvc.srvsvc \(admin access\).NetTransportEnum\(ad_dc\) +^samba3.rpc.srvsvc.srvsvc \(admin access\).NetShareEnumAll\(ad_dc\) +^samba3.rpc.srvsvc.srvsvc \(admin access\).NetCharDevQEnum\(ad_dc\) +^samba3.rpc.srvsvc.srvsvc \(admin access\).NetCharDevEnum\(ad_dc\) +# These should be fixed by setting 'restrict anonymous = 2' by default +# per https://bugzilla.samba.org/show_bug.cgi?id=12775 +^samba3.rpc.srvsvc.srvsvc anonymous access.NetShareGetInfo\(ad_dc\) +^samba3.rpc.srvsvc.srvsvc anonymous access.NetShareEnum\(ad_dc\) +^samba3.rpc.srvsvc.srvsvc anonymous access.NetShareEnumAll\(ad_dc\) diff --git a/selftest/knownfail.d/wkssvc b/selftest/knownfail.d/wkssvc new file mode 100644 index 00000000000..37a0e6774ce --- /dev/null +++ b/selftest/knownfail.d/wkssvc @@ -0,0 +1,25 @@ +# We do not have a full implementation of wkssvc in source3, but we +# have something worth testing +samba3.rpc.wkssvc.wkssvc.NetrMessageBufferSend\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrWorkstationStatisticsGet\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrGetJoinableOus2\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrGetJoinableOus\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrGetJoinInformation\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrUnjoinDomain\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrJoinDomain\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrEnumerateComputerNames\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrAddAlternateComputerName\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrRemoveAlternateComputerName\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrLogonDomainNameAdd\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrLogonDomainNameDel\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrValidateName2\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrValidateName\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrUseAdd\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrUseEnum\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrUseGetInfo\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrUseDel\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrWkstaUserGetInfo\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrWkstaTransportAdd\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetrWkstaTransportDel\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetWkstaTransportEnum\(ad_member\) +samba3.rpc.wkssvc.wkssvc.NetWkstaGetInfo\(ad_member\) diff --git a/selftest/target/Samba.pm b/selftest/target/Samba.pm index 38b38669dac..6fd8d01da06 100644 --- a/selftest/target/Samba.pm +++ b/selftest/target/Samba.pm @@ -580,6 +580,106 @@ sub random_domain_sid() return $domain_sid; } +# sets the environment variables ready for running a given process +sub set_env_for_process +{ + my ($proc_name, $env_vars, $proc_envs) = @_; + + if (not defined($proc_envs)) { + $proc_envs = get_env_for_process($proc_name, $env_vars); + } + + foreach my $key (keys %{ $proc_envs }) { + $ENV{$key} = $proc_envs->{$key}; + } +} + +sub get_env_for_process +{ + my ($proc_name, $env_vars) = @_; + my $proc_envs = { + KRB5_CONFIG => $env_vars->{KRB5_CONFIG}, + KRB5CCNAME => "$env_vars->{KRB5_CCACHE}.$proc_name", + SELFTEST_WINBINDD_SOCKET_DIR => $env_vars->{SELFTEST_WINBINDD_SOCKET_DIR}, + NMBD_SOCKET_DIR => $env_vars->{NMBD_SOCKET_DIR}, + NSS_WRAPPER_PASSWD => $env_vars->{NSS_WRAPPER_PASSWD}, + NSS_WRAPPER_GROUP => $env_vars->{NSS_WRAPPER_GROUP}, + NSS_WRAPPER_HOSTS => $env_vars->{NSS_WRAPPER_HOSTS}, + NSS_WRAPPER_HOSTNAME => $env_vars->{NSS_WRAPPER_HOSTNAME}, + NSS_WRAPPER_MODULE_SO_PATH => $env_vars->{NSS_WRAPPER_MODULE_SO_PATH}, + NSS_WRAPPER_MODULE_FN_PREFIX => $env_vars->{NSS_WRAPPER_MODULE_FN_PREFIX}, + UID_WRAPPER_ROOT => "1", + ENVNAME => "$ENV{ENVNAME}.$proc_name", + }; + + if (defined($env_vars->{RESOLV_WRAPPER_CONF})) { + $proc_envs->{RESOLV_WRAPPER_CONF} = $env_vars->{RESOLV_WRAPPER_CONF}; + } else { + $proc_envs->{RESOLV_WRAPPER_HOSTS} = $env_vars->{RESOLV_WRAPPER_HOSTS}; + } + return $proc_envs; +} + +sub fork_and_exec +{ + my ($self, $env_vars, $daemon_ctx, $STDIN_READER) = @_; + + unlink($daemon_ctx->{LOG_FILE}); + print "STARTING $daemon_ctx->{NAME} for $ENV{ENVNAME}..."; + + my $pid = fork(); + + # exec the daemon in the child process + if ($pid == 0) { + # redirect the daemon's stdout/stderr to a log file + if (defined($daemon_ctx->{TEE_STDOUT})) { + # in some cases, we want out from samba to go to the log file, + # but also to the users terminal when running 'make test' on the + # command line. This puts it on stderr on the terminal + open STDOUT, "| tee $daemon_ctx->{LOG_FILE} 1>&2"; + } else { + open STDOUT, ">$daemon_ctx->{LOG_FILE}"; + } + open STDERR, '>&STDOUT'; + + SocketWrapper::set_default_iface($env_vars->{SOCKET_WRAPPER_DEFAULT_IFACE}); + if (defined($daemon_ctx->{PCAP_FILE})) { + SocketWrapper::setup_pcap($daemon_ctx->{PCAP_FILE}); + } + + # setup ENV variables in the child process + set_env_for_process($daemon_ctx->{NAME}, $env_vars, + $daemon_ctx->{ENV_VARS}); + + # not all s3 daemons run in all testenvs (e.g. fileserver doesn't + # run winbindd). In which case, the child process just sleeps + if (defined($daemon_ctx->{SKIP_DAEMON})) { + $SIG{USR1} = $SIG{ALRM} = $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub { + my $signame = shift; + print("Skip $daemon_ctx->{NAME} received signal $signame"); + exit 0; + }; + sleep($self->{server_maxtime}); + exit 0; + } + + $ENV{MAKE_TEST_BINARY} = $daemon_ctx->{BINARY_PATH}; + + # we close the child's write-end of the pipe and redirect the read-end + # to its stdin. That way the daemon will receive an EOF on stdin when + # parent selftest process closes its write-end. + close($env_vars->{STDIN_PIPE}); + open STDIN, ">&", $STDIN_READER or die "can't dup STDIN_READER to STDIN: $!"; + + # the command args are stored as an array reference (because...Perl), + # so convert the reference back to an array + my @full_cmd = @{ $daemon_ctx->{FULL_CMD} }; + exec(@full_cmd) or die("Unable to start $ENV{MAKE_TEST_BINARY}: $!"); + } + print "DONE ($pid)\n"; + return $pid; +} + my @exported_envvars = ( # domain stuff "DOMAIN", diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm index a9c554fc50e..5e28253dc4e 100755 --- a/selftest/target/Samba3.pm +++ b/selftest/target/Samba3.pm @@ -1234,204 +1234,108 @@ sub read_pid($$) return $pid; } +# builds up the cmd args to run an s3 binary (i.e. smbd, nmbd, etc) +sub make_bin_cmd +{ + my ($self, $binary, $env_vars, $options, $valgrind, $dont_log_stdout) = @_; + + my @optargs = ("-d0"); + if (defined($options)) { + @optargs = split(/ /, $options); + } + my @preargs = (Samba::bindir_path($self, "timelimit"), $self->{server_maxtime}); + + if (defined($valgrind)) { + @preargs = split(/ /, $valgrind); + } + my @args = ("-F", "--no-process-group", + "-s", $env_vars->{SERVERCONFFILE}, + "-l", $env_vars->{LOGDIR}); + + if (not defined($dont_log_stdout)) { + push(@args, "--log-stdout"); + } + return (@preargs, $binary, @args, @optargs); +} + sub check_or_start($$$$$) { my ($self, $env_vars, $nmbd, $winbindd, $smbd) = @_; + my $STDIN_READER; # 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(); - if ($pid == 0) { - open STDOUT, ">$env_vars->{NMBD_TEST_LOG}"; - open STDERR, '>&STDOUT'; - - SocketWrapper::set_default_iface($env_vars->{SOCKET_WRAPPER_DEFAULT_IFACE}); - - $ENV{KRB5_CONFIG} = $env_vars->{KRB5_CONFIG}; - $ENV{KRB5CCNAME} = "$env_vars->{KRB5_CCACHE}.nmbd"; - $ENV{SELFTEST_WINBINDD_SOCKET_DIR} = $env_vars->{SELFTEST_WINBINDD_SOCKET_DIR}; - $ENV{NMBD_SOCKET_DIR} = $env_vars->{NMBD_SOCKET_DIR}; - - $ENV{NSS_WRAPPER_PASSWD} = $env_vars->{NSS_WRAPPER_PASSWD}; - $ENV{NSS_WRAPPER_GROUP} = $env_vars->{NSS_WRAPPER_GROUP}; - $ENV{NSS_WRAPPER_HOSTS} = $env_vars->{NSS_WRAPPER_HOSTS}; - $ENV{NSS_WRAPPER_HOSTNAME} = $env_vars->{NSS_WRAPPER_HOSTNAME}; - $ENV{NSS_WRAPPER_MODULE_SO_PATH} = $env_vars->{NSS_WRAPPER_MODULE_SO_PATH}; - $ENV{NSS_WRAPPER_MODULE_FN_PREFIX} = $env_vars->{NSS_WRAPPER_MODULE_FN_PREFIX}; - $ENV{UID_WRAPPER_ROOT} = "1"; - - $ENV{ENVNAME} = "$ENV{ENVNAME}.nmbd"; - - if ($nmbd ne "yes") { - $SIG{USR1} = $SIG{ALRM} = $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub { - my $signame = shift; - print("Skip nmbd received signal $signame"); - exit 0; - }; - sleep($self->{server_maxtime}); - exit 0; - } - - $ENV{MAKE_TEST_BINARY} = Samba::bindir_path($self, "nmbd"); - my @optargs = ("-d0"); - if (defined($ENV{NMBD_OPTIONS})) { - @optargs = split(/ /, $ENV{NMBD_OPTIONS}); - } - my @preargs = (Samba::bindir_path($self, "timelimit"), $self->{server_maxtime}); - if(defined($ENV{NMBD_VALGRIND})) { - @preargs = split(/ /, $ENV{NMBD_VALGRIND}); - } - my @args = ("-F", "--no-process-group", - "-s", $env_vars->{SERVERCONFFILE}, - "-l", $env_vars->{LOGDIR}); - if (not defined($ENV{NMBD_DONT_LOG_STDOUT})) { - push(@args, "--log-stdout"); - } - - close($env_vars->{STDIN_PIPE}); - open STDIN, ">&", \*STDIN_READER or die "can't dup STDIN_READER to STDIN: $!"; - - exec(@preargs, $ENV{MAKE_TEST_BINARY}, @args, @optargs) - or die("Unable to start $ENV{MAKE_TEST_BINARY}: $!"); + pipe($STDIN_READER, $env_vars->{STDIN_PIPE}); + + my $binary = Samba::bindir_path($self, "nmbd"); + my @full_cmd = $self->make_bin_cmd($binary, $env_vars, + $ENV{NMBD_OPTIONS}, $ENV{NMBD_VALGRIND}, + $ENV{NMBD_DONT_LOG_STDOUT}); + my $nmbd_envs = Samba::get_env_for_process("nmbd", $env_vars); + delete $nmbd_envs->{RESOLV_WRAPPER_CONF}; + delete $nmbd_envs->{RESOLV_WRAPPER_HOSTS}; + + # fork and exec() nmbd in the child process + my $daemon_ctx = { + NAME => "nmbd", + BINARY_PATH => $binary, + FULL_CMD => [ @full_cmd ], + LOG_FILE => $env_vars->{NMBD_TEST_LOG}, + ENV_VARS => $nmbd_envs, + }; + if ($nmbd ne "yes") { + $daemon_ctx->{SKIP_DAEMON} = 1; } + my $pid = Samba::fork_and_exec($self, $env_vars, $daemon_ctx, $STDIN_READER); + $env_vars->{NMBD_TL_PID} = $pid; write_pid($env_vars, "nmbd", $pid); - print "DONE\n"; - unlink($env_vars->{WINBINDD_TEST_LOG}); - print "STARTING WINBINDD..."; - $pid = fork(); - if ($pid == 0) { - open STDOUT, ">$env_vars->{WINBINDD_TEST_LOG}"; - open STDERR, '>&STDOUT'; - - SocketWrapper::set_default_iface($env_vars->{SOCKET_WRAPPER_DEFAULT_IFACE}); - - $ENV{KRB5_CONFIG} = $env_vars->{KRB5_CONFIG}; - $ENV{KRB5CCNAME} = "$env_vars->{KRB5_CCACHE}.winbindd"; - $ENV{SELFTEST_WINBINDD_SOCKET_DIR} = $env_vars->{SELFTEST_WINBINDD_SOCKET_DIR}; - $ENV{NMBD_SOCKET_DIR} = $env_vars->{NMBD_SOCKET_DIR}; - - $ENV{NSS_WRAPPER_PASSWD} = $env_vars->{NSS_WRAPPER_PASSWD}; - $ENV{NSS_WRAPPER_GROUP} = $env_vars->{NSS_WRAPPER_GROUP}; - $ENV{NSS_WRAPPER_HOSTS} = $env_vars->{NSS_WRAPPER_HOSTS}; - $ENV{NSS_WRAPPER_HOSTNAME} = $env_vars->{NSS_WRAPPER_HOSTNAME}; - $ENV{NSS_WRAPPER_MODULE_SO_PATH} = $env_vars->{NSS_WRAPPER_MODULE_SO_PATH}; - $ENV{NSS_WRAPPER_MODULE_FN_PREFIX} = $env_vars->{NSS_WRAPPER_MODULE_FN_PREFIX}; - if (defined($env_vars->{RESOLV_WRAPPER_CONF})) { - $ENV{RESOLV_WRAPPER_CONF} = $env_vars->{RESOLV_WRAPPER_CONF}; - } else { - $ENV{RESOLV_WRAPPER_HOSTS} = $env_vars->{RESOLV_WRAPPER_HOSTS}; - } - $ENV{UID_WRAPPER_ROOT} = "1"; - - $ENV{ENVNAME} = "$ENV{ENVNAME}.winbindd"; - - if ($winbindd ne "yes") { - $SIG{USR1} = $SIG{ALRM} = $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub { - my $signame = shift; - print("Skip winbindd received signal $signame"); - exit 0; - }; - sleep($self->{server_maxtime}); - exit 0; - } - - $ENV{MAKE_TEST_BINARY} = Samba::bindir_path($self, "winbindd"); - my @optargs = ("-d0"); - if (defined($ENV{WINBINDD_OPTIONS})) { - @optargs = split(/ /, $ENV{WINBINDD_OPTIONS}); - } - my @preargs = (Samba::bindir_path($self, "timelimit"), $self->{server_maxtime}); - if(defined($ENV{WINBINDD_VALGRIND})) { - @preargs = split(/ /, $ENV{WINBINDD_VALGRIND}); - } - my @args = ("-F", "--no-process-group", - "-s", $env_vars->{SERVERCONFFILE}, - "-l", $env_vars->{LOGDIR}); - if (not defined($ENV{WINBINDD_DONT_LOG_STDOUT})) { - push(@args, "--stdout"); - } + $binary = Samba::bindir_path($self, "winbindd"); + @full_cmd = $self->make_bin_cmd($binary, $env_vars, + $ENV{WINBINDD_OPTIONS}, $ENV{WINBINDD_VALGRIND}, "N/A"); - close($env_vars->{STDIN_PIPE}); - open STDIN, ">&", \*STDIN_READER or die "can't dup STDIN_READER to STDIN: $!"; + if (not defined($ENV{WINBINDD_DONT_LOG_STDOUT})) { + push(@full_cmd, "--stdout"); + } - exec(@preargs, $ENV{MAKE_TEST_BINARY}, @args, @optargs) - or die("Unable to start $ENV{MAKE_TEST_BINARY}: $!"); + # fork and exec() winbindd in the child process + $daemon_ctx = { + NAME => "winbindd", + BINARY_PATH => $binary, + FULL_CMD => [ @full_cmd ], + LOG_FILE => $env_vars->{WINBINDD_TEST_LOG}, + }; + if ($winbindd ne "yes") { + $daemon_ctx->{SKIP_DAEMON} = 1; } + my $pid = Samba::fork_and_exec($self, $env_vars, $daemon_ctx, $STDIN_READER); + $env_vars->{WINBINDD_TL_PID} = $pid; write_pid($env_vars, "winbindd", $pid); - print "DONE\n"; - unlink($env_vars->{SMBD_TEST_LOG}); -- Samba Shared Repository