[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Fri May 24 05:13:04 UTC 2019


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 <gary at 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 <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    
    Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date(master): Fri May 24 05:12:14 UTC 2019 on sn-devel-184

commit 6ccf74cf878c295903673e3a1d1ed924a5e87547
Author: Gary Lockyer <gary at 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 <gary at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 163897f12538ae12dbc2bd556adcc1abc4f0f438
Author: Tim Beale <timbeale at 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 <timbeale at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit b976502d496cca0e8e04a2e5f2c72383efb296a7
Author: Tim Beale <timbeale at 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 <timbeale at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 746e137777e559afb7851a359d56580c58231ddd
Author: Tim Beale <timbeale at 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 <timbeale at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit ae3e33d492904ae05d4ff24c3d8f50fecaca2971
Author: Tim Beale <timbeale at 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 <timbeale at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c79f0c197558e86fe4f9e27b0c4682441bb55b0b
Author: Tim Beale <timbeale at 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 <timbeale at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit ad30fdc6ba28374b84dbe94af92c5694bff6f86e
Author: Tim Beale <timbeale at 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 <timbeale at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit ba9323abde060c832274e84f1e8a6b79fccc5fce
Author: Tim Beale <timbeale at 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 <timbeale at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 0fd3685cfd8f6613517552685f649c649fe4cd08
Author: Tim Beale <timbeale at catalyst.net.nz>
Date:   Wed May 22 09:33:34 2019 +1200

    selftest: remove unused variable (@optargs)
    
    Signed-off-by: Tim Beale <timbeale at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit a60e59735c20f8e342fa1b00ae5715f1673f22be
Author: Tim Beale <timbeale at 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 <timbeale at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit d2f54775d3fe5e3ef6d00121ac7ab382dd58ddcd
Author: Andrew Bartlett <abartlet at 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 <abartlet at samba.org>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>

commit 773e476203fcd15a20032d49e3377417ccd237fe
Author: Andrew Bartlett <abartlet at 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 <abartlet at samba.org>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>

commit 8dd0421a4284e23f756dfafa32d2831ceb6d1b88
Author: Andrew Bartlett <abartlet at 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 <abartlet at samba.org>
    Reviewed-by: Gary Lockyer <gary at catalyst.net.nz>

commit 430968b32dc7d14876b8ed3bbbcfdc4d34a1263b
Author: Andrew Bartlett <abartlet at 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 <abartlet at samba.org>
    Reviewed-by: Gary Lockyer <gary at 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



More information about the samba-cvs mailing list