[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Fri Nov 9 02:50:03 UTC 2018


The branch, master has been updated
       via  f21bc3a selftest: Test hide new files timeout
       via  593fdd2 smbd: Add "hide new files" option
      from  2d512b2 debug: Use debuglevel_(get|set) function

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit f21bc3addaafc857f0645378d4635d91c620c2f9
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Nov 8 13:27:58 2018 +0100

    selftest: Test hide new files timeout
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Fri Nov  9 03:49:55 CET 2018 on sn-devel-144

commit 593fdd21923b1065b7cfbedc69a214720f190e03
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Aug 23 13:51:26 2018 +0200

    smbd: Add "hide new files" option
    
    See the manpage for the description
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 .../smbdotconf/filename/hidenewfilestimeout.xml    |  15 ++
 selftest/target/Samba3.pm                          |   4 +
 source3/selftest/tests.py                          |  12 ++
 source3/smbd/dir.c                                 |  18 ++-
 source3/torture/proto.h                            |   1 +
 source3/torture/test_hidenewfiles.c                | 173 +++++++++++++++++++++
 source3/torture/torture.c                          |   1 +
 source3/wscript_build                              |   1 +
 8 files changed, 224 insertions(+), 1 deletion(-)
 create mode 100644 docs-xml/smbdotconf/filename/hidenewfilestimeout.xml
 create mode 100644 source3/torture/test_hidenewfiles.c


Changeset truncated at 500 lines:

diff --git a/docs-xml/smbdotconf/filename/hidenewfilestimeout.xml b/docs-xml/smbdotconf/filename/hidenewfilestimeout.xml
new file mode 100644
index 0000000..ca93e72
--- /dev/null
+++ b/docs-xml/smbdotconf/filename/hidenewfilestimeout.xml
@@ -0,0 +1,15 @@
+<samba:parameter name="hide new files timeout"
+                 context="S"
+                 type="integer"
+                 xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
+ <description>
+   <para>Setting this parameter to something but 0 hides files
+   that have been modified less than N seconds ago.</para>
+   <para>It can be used for ingest/process queue style workloads. A
+   processing application should only see files that are definitely
+   finished. As many applications do not have proper external workflow
+   control, this can be a way to make sure processing does not
+   interfere with file ingest.</para>
+</description>
+<value type="default">0</value>
+</samba:parameter>
diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm
index 9166511..569b5d6 100755
--- a/selftest/target/Samba3.pm
+++ b/selftest/target/Samba3.pm
@@ -838,6 +838,10 @@ sub setup_simpleserver
 	path = $prefix_abs/share
 	vfs objects =
 	smb encrypt = desired
+
+[hidenewfiles]
+	path = $prefix_abs/share
+	hide new files timeout = 5
 ";
 
 	my $vars = $self->provision($path, "WORKGROUP",
diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py
index 720485d..98d13d3 100755
--- a/source3/selftest/tests.py
+++ b/source3/selftest/tests.py
@@ -128,6 +128,18 @@ for t in tests:
     plantestsuite("samba3.smbtorture_s3.vfs_aio_pthread(simpleserver).%s" % t, "simpleserver", [os.path.join(samba3srcdir, "script/tests/test_smbtorture_s3.sh"), t, '//$SERVER_IP/vfs_aio_pthread', '$USERNAME', '$PASSWORD', smbtorture3, "", "-l $LOCAL_PATH"])
     plantestsuite("samba3.smbtorture_s3.vfs_aio_fork(simpleserver).%s" % t, "simpleserver", [os.path.join(samba3srcdir, "script/tests/test_smbtorture_s3.sh"), t, '//$SERVER_IP/vfs_aio_fork', '$USERNAME', '$PASSWORD', smbtorture3, "", "-l $LOCAL_PATH"])
 
+plantestsuite("samba3.smbtorture_s3.hidenewfiles(simpleserver)",
+              "simpleserver",
+              [os.path.join(samba3srcdir,
+                            "script/tests/test_smbtorture_s3.sh"),
+               'hide-new-files-timeout',
+               '//$SERVER_IP/hidenewfiles',
+               '$USERNAME',
+               '$PASSWORD',
+               smbtorture3,
+               "",
+               "-l $LOCAL_PATH"])
+
 shares = [
     "vfs_aio_pthread_async_dosmode_default1",
     "vfs_aio_pthread_async_dosmode_default2",
diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c
index c3af523..f05d7a2 100644
--- a/source3/smbd/dir.c
+++ b/source3/smbd/dir.c
@@ -1536,6 +1536,7 @@ bool is_visible_file(connection_struct *conn, const char *dir_path,
 	bool hide_unreadable = lp_hide_unreadable(SNUM(conn));
 	bool hide_unwriteable = lp_hide_unwriteable_files(SNUM(conn));
 	bool hide_special = lp_hide_special_files(SNUM(conn));
+	int hide_new_files_timeout = lp_hide_new_files_timeout(SNUM(conn));
 	char *entry = NULL;
 	struct smb_filename *smb_fname_base = NULL;
 	bool ret = false;
@@ -1550,7 +1551,11 @@ bool is_visible_file(connection_struct *conn, const char *dir_path,
 		return False;
 	}
 
-	if (hide_unreadable || hide_unwriteable || hide_special) {
+	if (hide_unreadable ||
+	    hide_unwriteable ||
+	    hide_special ||
+	    (hide_new_files_timeout != 0))
+	{
 		entry = talloc_asprintf(talloc_tos(), "%s/%s", dir_path, name);
 		if (!entry) {
 			ret = false;
@@ -1603,6 +1608,17 @@ bool is_visible_file(connection_struct *conn, const char *dir_path,
 			ret = false;
 			goto out;
 		}
+
+		if (hide_new_files_timeout != 0) {
+
+			double age = timespec_elapsed(
+				&smb_fname_base->st.st_ex_mtime);
+
+			if (age < (double)hide_new_files_timeout) {
+				ret = false;
+				goto out;
+			}
+		}
 	}
 
 	ret = true;
diff --git a/source3/torture/proto.h b/source3/torture/proto.h
index 1634da4..669e077 100644
--- a/source3/torture/proto.h
+++ b/source3/torture/proto.h
@@ -137,5 +137,6 @@ bool run_g_lock5(int dummy);
 bool run_g_lock6(int dummy);
 bool run_g_lock_ping_pong(int dummy);
 bool run_local_namemap_cache1(int dummy);
+bool run_hidenewfiles(int dummy);
 
 #endif /* __TORTURE_H__ */
diff --git a/source3/torture/test_hidenewfiles.c b/source3/torture/test_hidenewfiles.c
new file mode 100644
index 0000000..2f1638a
--- /dev/null
+++ b/source3/torture/test_hidenewfiles.c
@@ -0,0 +1,173 @@
+/*
+ * Unix SMB/CIFS implementation.
+ * Test pthreadpool_tevent
+ * Copyright (C) Volker Lendecke 2018
+ *
+ * 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/>.
+ */
+
+#include "includes.h"
+#include "torture/proto.h"
+#include "libsmb/libsmb.h"
+#include "libcli/security/security.h"
+
+static NTSTATUS servertime(
+	struct cli_state *cli, const char *fname, struct timeval *tv)
+{
+	struct smb_create_returns cr;
+	NTSTATUS status;
+	uint16_t fnum;
+
+	status = cli_ntcreate(
+		cli,
+		fname,
+		0,
+		FILE_GENERIC_WRITE|DELETE_ACCESS,
+		FILE_ATTRIBUTE_NORMAL,
+		0,
+		FILE_CREATE,
+		FILE_DELETE_ON_CLOSE,
+		0,
+		&fnum,
+		&cr);
+	if (!NT_STATUS_IS_OK(status)) {
+		d_printf("cli_ntcreate failed: %s\n", nt_errstr(status));
+		return status;
+	}
+
+	status = cli_close(cli, fnum);
+	if (!NT_STATUS_IS_OK(status)) {
+		d_printf("cli_close failed: %s\n", nt_errstr(status));
+		return status;
+	}
+
+	nttime_to_timeval(tv, cr.creation_time);
+
+	return NT_STATUS_OK;
+}
+
+struct have_file_state {
+	bool found;
+	const char *fname;
+};
+
+static NTSTATUS have_file_fn(const char *mntpoint,
+			     struct file_info *f,
+			     const char *mask,
+			     void *private_data)
+{
+	struct have_file_state *state = private_data;
+	state->found |= strequal(f->name, state->fname);
+	return NT_STATUS_OK;
+}
+
+static bool have_file(struct cli_state *cli, const char *fname)
+{
+	struct have_file_state state = { .fname = fname };
+	NTSTATUS status;
+
+	status = cli_list(
+		cli,
+		"*.*",
+		FILE_ATTRIBUTE_DIRECTORY|
+		FILE_ATTRIBUTE_SYSTEM|
+		FILE_ATTRIBUTE_HIDDEN,
+		have_file_fn,
+		&state);
+	if (!NT_STATUS_IS_OK(status)) {
+		d_printf("cli_list failed: %s\n", nt_errstr(status));
+		return false;
+	}
+
+	return state.found;
+}
+
+bool run_hidenewfiles(int dummy)
+{
+	const char *tsname = "timestamp.txt";
+	const char *fname = "new_hidden.txt";
+	struct cli_state *cli;
+	struct smb_create_returns cr;
+	struct timeval create_time;
+	uint16_t fnum;
+	NTSTATUS status;
+	bool ret = false;
+	bool gotit = false;
+	bool ok;
+
+	/* what is configure in smb.conf */
+	unsigned hideunreadable_seconds = 5;
+
+	ok = torture_open_connection(&cli, 0);
+	if (!ok) {
+		return false;
+	}
+
+	cli_unlink(cli, tsname, FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN);
+	cli_unlink(cli, fname, FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN);
+
+	status = cli_ntcreate(
+		cli,
+		fname,
+		0,
+		FILE_GENERIC_WRITE|DELETE_ACCESS,
+		FILE_ATTRIBUTE_NORMAL,
+		0,
+		FILE_CREATE,
+		0,
+		0,
+		&fnum,
+		&cr);
+	if (!NT_STATUS_IS_OK(status)) {
+		d_printf("cli_ntcreate failed: %s\n", nt_errstr(status));
+		return false;
+	}
+	nttime_to_timeval(&create_time, cr.last_write_time);
+
+	while (!gotit) {
+		struct timeval now;
+		double age;
+
+		gotit = have_file(cli, fname);
+
+		status = servertime(cli, tsname, &now);
+		if (!NT_STATUS_IS_OK(status)) {
+			d_printf("servertime failed: %s\n",
+				 nt_errstr(status));
+			goto fail;
+		}
+		age = timeval_elapsed2(&create_time, &now);
+
+		if ((age < hideunreadable_seconds) && gotit) {
+			d_printf("Found file at age of %f\n", age);
+			goto fail;
+		}
+		if ((age > (hideunreadable_seconds*10)) && !gotit) {
+			d_printf("Did not find file after %f seconds\n", age);
+			goto fail;
+		}
+		if (gotit) {
+			break;
+		}
+
+		smb_msleep(1000);
+	}
+
+	ret = true;
+fail:
+	cli_nt_delete_on_close(cli, fnum, true);
+	cli_close(cli, fnum);
+
+	return ret;
+}
diff --git a/source3/torture/torture.c b/source3/torture/torture.c
index 333b1f1..22810f0 100644
--- a/source3/torture/torture.c
+++ b/source3/torture/torture.c
@@ -11878,6 +11878,7 @@ static struct {
 	{ "LOCAL-CANONICALIZE-PATH", run_local_canonicalize_path, 0 },
 	{ "LOCAL-NAMEMAP-CACHE1", run_local_namemap_cache1, 0 },
 	{ "qpathinfo-bufsize", run_qpathinfo_bufsize, 0 },
+	{ "hide-new-files-timeout", run_hidenewfiles, 0 },
 	{NULL, NULL, 0}};
 
 /****************************************************************************
diff --git a/source3/wscript_build b/source3/wscript_build
index 50d675c..a8ea8e5 100644
--- a/source3/wscript_build
+++ b/source3/wscript_build
@@ -1196,6 +1196,7 @@ bld.SAMBA3_BINARY('smbtorture' + bld.env.suffix3,
                         torture/wbc_async.c
                         torture/test_g_lock.c
                         torture/test_namemap_cache.c
+                        torture/test_hidenewfiles.c
                         ''',
                  deps='''
                       talloc


-- 
Samba Shared Repository



More information about the samba-cvs mailing list