[SCM] Samba Shared Repository - branch master updated
Amitay Isaacs
amitay at samba.org
Mon Dec 12 19:29:02 MST 2011
The branch, master has been updated
via 2142405 s4-provision: Do not guess partition file names, use @PARTITION record
via 7f50890 s4-param: Added bin_dir(),sbin_dir() methods to get compiled in dirs
via a648563 s4-provision: Extract common utility routines in separate file
via 20789bf tdb: Fix python documentation for tdb module
via eee2191 s4-provision: CN=MicrosoftDNS,CN=System container is in forest and not domain
via f02e4eb s4-cldap: Set DS_DNS_CONTROLLER bit if we are running RPC dnsserver
from a77b0dd libcli: Remove an unused variable
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 21424056bb4ad914871b009aee3a7567a3efdec0
Author: Amitay Isaacs <amitay at gmail.com>
Date: Mon Dec 12 10:53:55 2011 +1100
s4-provision: Do not guess partition file names, use @PARTITION record
This is to avoid duplicating the logic of generating partition file
names. (partition file names are encoded partially as per RFC1738).
Also, use tdb_copy() instead of filesystem copy function to copy
database files, which guarantees correct database copy.
Autobuild-User: Amitay Isaacs <amitay at samba.org>
Autobuild-Date: Tue Dec 13 03:28:03 CET 2011 on sn-devel-104
commit 7f50890cd67fed69b049bde5328c4f662bab1806
Author: Amitay Isaacs <amitay at gmail.com>
Date: Mon Dec 12 14:18:21 2011 +1100
s4-param: Added bin_dir(),sbin_dir() methods to get compiled in dirs
commit a648563cb732bd357c3d3eac1b5064293e2738ac
Author: Amitay Isaacs <amitay at gmail.com>
Date: Sun Dec 11 17:00:03 2011 +1100
s4-provision: Extract common utility routines in separate file
commit 20789bfdde37ee3140422b5599d41a280c01d29f
Author: Amitay Isaacs <amitay at gmail.com>
Date: Sun Dec 11 16:09:32 2011 +1100
tdb: Fix python documentation for tdb module
commit eee2191076472db3773d9ef2a900c744abe2a768
Author: Amitay Isaacs <amitay at gmail.com>
Date: Thu Dec 8 17:34:57 2011 +1100
s4-provision: CN=MicrosoftDNS,CN=System container is in forest and not domain
commit f02e4ebfafa6e5911e3fe744b1780527ab12c970
Author: Amitay Isaacs <amitay at gmail.com>
Date: Thu Dec 8 09:28:45 2011 +1100
s4-cldap: Set DS_DNS_CONTROLLER bit if we are running RPC dnsserver
Till we have internal DNS server which appears in services, use
endpoint services to find out if we are running dns server.
-----------------------------------------------------------------------
Summary of changes:
lib/tdb/pytdb.c | 2 +-
source4/cldap_server/netlogon.c | 5 +
source4/param/pyparam.c | 20 ++-
.../scripting/python/samba/provision/__init__.py | 62 +-----
source4/scripting/python/samba/provision/common.py | 84 ++++++++
.../scripting/python/samba/provision/sambadns.py | 203 +++++++++----------
6 files changed, 213 insertions(+), 163 deletions(-)
create mode 100644 source4/scripting/python/samba/provision/common.py
Changeset truncated at 500 lines:
diff --git a/lib/tdb/pytdb.c b/lib/tdb/pytdb.c
index b1ca075..4892752 100644
--- a/lib/tdb/pytdb.c
+++ b/lib/tdb/pytdb.c
@@ -539,7 +539,7 @@ static PyMappingMethods tdb_object_mapping = {
.mp_ass_subscript = (objobjargproc)obj_setitem,
};
static PyTypeObject PyTdb = {
- .tp_name = "Tdb",
+ .tp_name = "tdb.Tdb",
.tp_basicsize = sizeof(PyTdbObject),
.tp_methods = tdb_object_methods,
.tp_getset = tdb_object_getsetters,
diff --git a/source4/cldap_server/netlogon.c b/source4/cldap_server/netlogon.c
index 9d9f45e..e9ec074 100644
--- a/source4/cldap_server/netlogon.c
+++ b/source4/cldap_server/netlogon.c
@@ -61,6 +61,7 @@ NTSTATUS fill_netlogon_samlogon_response(struct ldb_context *sam_ctx,
struct ldb_result *dom_res = NULL, *user_res = NULL;
int ret;
const char **services = lpcfg_server_services(lp_ctx);
+ const char **rpc_services = lpcfg_dcerpc_endpoint_servers(lp_ctx);
uint32_t server_type;
const char *pdc_name;
struct GUID domain_uuid;
@@ -246,6 +247,10 @@ NTSTATUS fill_netlogon_samlogon_response(struct ldb_context *sam_ctx,
server_type |= DS_SERVER_KDC;
}
+ if (str_list_check(rpc_services, "dnsserver")) {
+ server_type |= DS_DNS_CONTROLLER;
+ }
+
if (samdb_rodc(sam_ctx, &am_rodc) == LDB_SUCCESS && !am_rodc) {
server_type |= DS_SERVER_WRITABLE;
}
diff --git a/source4/param/pyparam.c b/source4/param/pyparam.c
index e7eb43f..4d246a7 100644
--- a/source4/param/pyparam.c
+++ b/source4/param/pyparam.c
@@ -451,17 +451,27 @@ PyTypeObject PyLoadparmService = {
static PyObject *py_default_path(PyObject *self)
{
- return PyString_FromString(lp_default_path());
+ return PyString_FromString(lp_default_path());
}
static PyObject *py_setup_dir(PyObject *self)
{
- return PyString_FromString(dyn_SETUPDIR);
+ return PyString_FromString(dyn_SETUPDIR);
}
static PyObject *py_modules_dir(PyObject *self)
{
- return PyString_FromString(dyn_MODULESDIR);
+ return PyString_FromString(dyn_MODULESDIR);
+}
+
+static PyObject *py_bin_dir(PyObject *self)
+{
+ return PyString_FromString(dyn_BINDIR);
+}
+
+static PyObject *py_sbin_dir(PyObject *self)
+{
+ return PyString_FromString(dyn_SBINDIR);
}
static PyMethodDef pyparam_methods[] = {
@@ -471,6 +481,10 @@ static PyMethodDef pyparam_methods[] = {
"Returns the compiled in location of provision tempates." },
{ "modules_dir", (PyCFunction)py_modules_dir, METH_NOARGS,
"Returns the compiled in location of modules." },
+ { "bin_dir", (PyCFunction)py_bin_dir, METH_NOARGS,
+ "Returns the compiled in BINDIR." },
+ { "sbin_dir", (PyCFunction)py_sbin_dir, METH_NOARGS,
+ "Returns the compiled in SBINDIR." },
{ NULL }
};
diff --git a/source4/scripting/python/samba/provision/__init__.py b/source4/scripting/python/samba/provision/__init__.py
index c3150a1..5c4866c 100644
--- a/source4/scripting/python/samba/provision/__init__.py
+++ b/source4/scripting/python/samba/provision/__init__.py
@@ -48,7 +48,6 @@ from samba.dsdb import DS_DOMAIN_FUNCTION_2000
from samba import (
Ldb,
check_all_substituted,
- read_and_sub_file,
setup_file,
substitute_var,
valid_netbios_name,
@@ -78,7 +77,16 @@ from samba.provision.descriptor import (
get_config_descriptor,
get_domain_descriptor
)
-from samba.provision.sambadns import setup_ad_dns, create_dns_update_list
+from samba.provision.common import (
+ setup_path,
+ setup_add_ldif,
+ setup_modify_ldif,
+ setup_ldb
+ )
+from samba.provision.sambadns import (
+ setup_ad_dns,
+ create_dns_update_list
+ )
import samba.param
import samba.registry
@@ -94,11 +102,6 @@ DEFAULTSITE = "Default-First-Site-Name"
LAST_PROVISION_USN_ATTRIBUTE = "lastProvisionUSN"
-def setup_path(file):
- """Return an absolute path to the provision tempate file specified by file"""
- return os.path.join(samba.param.setup_dir(), file)
-
-
class ProvisionPaths(object):
def __init__(self):
@@ -402,51 +405,6 @@ findnss_uid = lambda names: findnss(pwd.getpwnam, names)[2]
findnss_gid = lambda names: findnss(grp.getgrnam, names)[2]
-def setup_add_ldif(ldb, ldif_path, subst_vars=None,controls=["relax:0"]):
- """Setup a ldb in the private dir.
-
- :param ldb: LDB file to import data into
- :param ldif_path: Path of the LDIF file to load
- :param subst_vars: Optional variables to subsitute in LDIF.
- :param nocontrols: Optional list of controls, can be None for no controls
- """
- assert isinstance(ldif_path, str)
- data = read_and_sub_file(ldif_path, subst_vars)
- ldb.add_ldif(data, controls)
-
-
-def setup_modify_ldif(ldb, ldif_path, subst_vars=None,controls=["relax:0"]):
- """Modify a ldb in the private dir.
-
- :param ldb: LDB object.
- :param ldif_path: LDIF file path.
- :param subst_vars: Optional dictionary with substitution variables.
- """
- data = read_and_sub_file(ldif_path, subst_vars)
- ldb.modify_ldif(data, controls)
-
-
-def setup_ldb(ldb, ldif_path, subst_vars):
- """Import a LDIF a file into a LDB handle, optionally substituting
- variables.
-
- :note: Either all LDIF data will be added or none (using transactions).
-
- :param ldb: LDB file to import into.
- :param ldif_path: Path to the LDIF file.
- :param subst_vars: Dictionary with substitution variables.
- """
- assert ldb is not None
- ldb.transaction_start()
- try:
- setup_add_ldif(ldb, ldif_path, subst_vars)
- except Exception:
- ldb.transaction_cancel()
- raise
- else:
- ldb.transaction_commit()
-
-
def provision_paths_from_lp(lp, dnsdomain):
"""Set the default paths for provisioning.
diff --git a/source4/scripting/python/samba/provision/common.py b/source4/scripting/python/samba/provision/common.py
new file mode 100644
index 0000000..04bdb0f
--- /dev/null
+++ b/source4/scripting/python/samba/provision/common.py
@@ -0,0 +1,84 @@
+
+# Unix SMB/CIFS implementation.
+# utility functions for provisioning a Samba4 server
+
+# Copyright (C) Jelmer Vernooij <jelmer at samba.org> 2007-2010
+# Copyright (C) Andrew Bartlett <abartlet at samba.org> 2008-2009
+# Copyright (C) Oliver Liebel <oliver at itc.li> 2008-2009
+#
+# Based on the original in EJS:
+# Copyright (C) Andrew Tridgell <tridge at samba.org> 2005
+#
+# 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/>.
+#
+
+"""Functions for setting up a Samba configuration."""
+
+__docformat__ = "restructuredText"
+
+import os
+import tdb
+import ldb
+from samba import read_and_sub_file
+from samba.param import setup_dir
+
+
+def setup_path(file):
+ """Return an absolute path to the provision tempate file specified by file"""
+ return os.path.join(setup_dir(), file)
+
+
+def setup_add_ldif(ldb, ldif_path, subst_vars=None,controls=["relax:0"]):
+ """Setup a ldb in the private dir.
+
+ :param ldb: LDB file to import data into
+ :param ldif_path: Path of the LDIF file to load
+ :param subst_vars: Optional variables to subsitute in LDIF.
+ :param nocontrols: Optional list of controls, can be None for no controls
+ """
+ assert isinstance(ldif_path, str)
+ data = read_and_sub_file(ldif_path, subst_vars)
+ ldb.add_ldif(data, controls)
+
+
+def setup_modify_ldif(ldb, ldif_path, subst_vars=None,controls=["relax:0"]):
+ """Modify a ldb in the private dir.
+
+ :param ldb: LDB object.
+ :param ldif_path: LDIF file path.
+ :param subst_vars: Optional dictionary with substitution variables.
+ """
+ data = read_and_sub_file(ldif_path, subst_vars)
+ ldb.modify_ldif(data, controls)
+
+
+def setup_ldb(ldb, ldif_path, subst_vars):
+ """Import a LDIF a file into a LDB handle, optionally substituting
+ variables.
+
+ :note: Either all LDIF data will be added or none (using transactions).
+
+ :param ldb: LDB file to import into.
+ :param ldif_path: Path to the LDIF file.
+ :param subst_vars: Dictionary with substitution variables.
+ """
+ assert ldb is not None
+ ldb.transaction_start()
+ try:
+ setup_add_ldif(ldb, ldif_path, subst_vars)
+ except Exception:
+ ldb.transaction_cancel()
+ raise
+ else:
+ ldb.transaction_commit()
diff --git a/source4/scripting/python/samba/provision/sambadns.py b/source4/scripting/python/samba/provision/sambadns.py
index bffb621..335ea8d 100644
--- a/source4/scripting/python/samba/provision/sambadns.py
+++ b/source4/scripting/python/samba/provision/sambadns.py
@@ -41,42 +41,14 @@ from samba.provision.descriptor import (
get_domain_descriptor,
get_dns_partition_descriptor
)
+from samba.provision.common import (
+ setup_path,
+ setup_add_ldif,
+ setup_modify_ldif,
+ setup_ldb
+ )
-def add_ldif(ldb, ldif_file, subst_vars, controls=["relax:0"]):
- ldif_file_path = os.path.join(samba.param.setup_dir(), ldif_file)
- data = read_and_sub_file(ldif_file_path, subst_vars)
- ldb.add_ldif(data, controls)
-
-def modify_ldif(ldb, ldif_file, subst_vars, controls=["relax:0"]):
- ldif_file_path = os.path.join(samba.param.setup_dir(), ldif_file)
- data = read_and_sub_file(ldif_file_path, subst_vars)
- ldb.modify_ldif(data, controls)
-
-def setup_ldb(ldb, ldif_path, subst_vars):
- """Import a LDIF a file into a LDB handle, optionally substituting
- variables.
-
- :note: Either all LDIF data will be added or none (using transactions).
-
- :param ldb: LDB file to import into.
- :param ldif_path: Path to the LDIF file.
- :param subst_vars: Dictionary with substitution variables.
- """
- assert ldb is not None
- ldb.transaction_start()
- try:
- add_ldif(ldb, ldif_path, subst_vars)
- except Exception:
- ldb.transaction_cancel()
- raise
- else:
- ldb.transaction_commit()
-
-def setup_path(file):
- """Return an absolute path to the provision tempate file specified by file"""
- return os.path.join(samba.param.setup_dir(), file)
-
def get_domainguid(samdb, domaindn):
res = samdb.search(base=domaindn, scope=ldb.SCOPE_BASE, attrs=["objectGUID"])
domainguid = str(ndr_unpack(misc.GUID, res[0]["objectGUID"][0]))
@@ -173,7 +145,7 @@ def setup_dns_partitions(samdb, domainsid, domaindn, forestdn, configdn, serverd
domainzone_dn = "DC=DomainDnsZones,%s" % domaindn
forestzone_dn = "DC=ForestDnsZones,%s" % forestdn
descriptor = get_dns_partition_descriptor(domainsid)
- add_ldif(samdb, "provision_dnszones_partitions.ldif", {
+ setup_add_ldif(samdb, setup_path("provision_dnszones_partitions.ldif"), {
"DOMAINZONE_DN": domainzone_dn,
"FORESTZONE_DN": forestzone_dn,
"SECDESC" : b64encode(descriptor)
@@ -188,7 +160,7 @@ def setup_dns_partitions(samdb, domainsid, domaindn, forestdn, configdn, serverd
domainzone_dns = ldb.Dn(samdb, domainzone_dn).canonical_ex_str().strip()
forestzone_dns = ldb.Dn(samdb, forestzone_dn).canonical_ex_str().strip()
- add_ldif(samdb, "provision_dnszones_add.ldif", {
+ setup_add_ldif(samdb, setup_path("provision_dnszones_add.ldif"), {
"DOMAINZONE_DN": domainzone_dn,
"FORESTZONE_DN": forestzone_dn,
"DOMAINZONE_GUID": domainzone_guid,
@@ -199,7 +171,7 @@ def setup_dns_partitions(samdb, domainsid, domaindn, forestdn, configdn, serverd
"SERVERDN": serverdn,
})
- modify_ldif(samdb, "provision_dnszones_modify.ldif", {
+ setup_modify_ldif(samdb, setup_path("provision_dnszones_modify.ldif"), {
"CONFIGDN": configdn,
"SERVERDN": serverdn,
"DOMAINZONE_DN": domainzone_dn,
@@ -208,7 +180,7 @@ def setup_dns_partitions(samdb, domainsid, domaindn, forestdn, configdn, serverd
def add_dns_accounts(samdb, domaindn):
- add_ldif(samdb, "provision_dns_accounts_add.ldif", {
+ setup_add_ldif(samdb, setup_path("provision_dns_accounts_add.ldif"), {
"DOMAINDN": domaindn,
})
@@ -624,66 +596,88 @@ def create_zone_file(lp, logger, paths, targetdir, dnsdomain,
if targetdir is None:
os.system(rndc + " unfreeze " + lp.get("realm"))
+def tdb_copy(logger, file1, file2):
+ """Copy tdb file using tdbbackup utility and rename it
+ """
+ # Find the location of tdbbackup tool
+ dirs = ["bin", samba.param.bin_dir()]
+ for d in dirs:
+ toolpath = os.path.join(d, "tdbbackup")
+ if os.path.exists(toolpath):
+ break
+ status = os.system("%s -s '.dns' %s" % (toolpath, file1))
+ if status == 0:
+ os.rename("%s.dns" % file1, file2)
+ else:
+ raise Exception("Error copying %s" % file1)
-def create_samdb_copy(logger, paths, names, domainsid, domainguid):
+def create_samdb_copy(samdb, logger, paths, names, domainsid, domainguid):
"""Create a copy of samdb and give write permissions to named for dns partitions
"""
private_dir = paths.private_dir
samldb_dir = os.path.join(private_dir, "sam.ldb.d")
dns_dir = os.path.dirname(paths.dns)
dns_samldb_dir = os.path.join(dns_dir, "sam.ldb.d")
- domainpart_file = "%s.ldb" % names.domaindn.upper()
- configpart_file = "%s.ldb" % names.configdn.upper()
- schemapart_file = "%s.ldb" % names.schemadn.upper()
- domainzone_file = "DC=DOMAINDNSZONES,%s.ldb" % names.domaindn.upper()
- forestzone_file = "DC=FORESTDNSZONES,%s.ldb" % names.rootdn.upper()
- metadata_file = "metadata.tdb"
- # Copy config, schema partitions, create empty domain partition
+ # Find the partitions and corresponding filenames
+ partfile = {}
+ res = samdb.search(base="@PARTITION", scope=ldb.SCOPE_BASE, attrs=["partition"])
+ for tmp in res[0]["partition"]:
+ (nc, fname) = tmp.split(':')
+ partfile[nc.upper()] = fname
+
+ # Create empty domain partition
+ domaindn = names.domaindn.upper()
+ domainpart_file = os.path.join(dns_dir, partfile[domaindn])
try:
- shutil.copyfile(os.path.join(private_dir, "sam.ldb"),
- os.path.join(dns_dir, "sam.ldb"))
os.mkdir(dns_samldb_dir)
- file(os.path.join(dns_samldb_dir, domainpart_file), 'w').close()
- shutil.copyfile(os.path.join(samldb_dir, configpart_file),
- os.path.join(dns_samldb_dir, configpart_file))
- shutil.copyfile(os.path.join(samldb_dir, schemapart_file),
- os.path.join(dns_samldb_dir, schemapart_file))
+ file(domainpart_file, 'w').close()
+
+ # Fill the basedn and @OPTION records in domain partition
+ dom_ldb = samba.Ldb(domainpart_file)
+ domainguid_line = "objectGUID: %s\n-" % domainguid
+ descr = b64encode(get_domain_descriptor(domainsid))
+ setup_add_ldif(dom_ldb, setup_path("provision_basedn.ldif"), {
+ "DOMAINDN" : names.domaindn,
+ "DOMAINGUID" : domainguid_line,
+ "DOMAINSID" : str(domainsid),
+ "DESCRIPTOR" : descr})
+ setup_add_ldif(dom_ldb, setup_path("provision_basedn_options.ldif"), None)
except:
logger.error("Failed to setup database for BIND, AD based DNS cannot be used")
raise
+ del partfile[domaindn]
- # Link metadata and dns partitions
+ # Link dns partitions and metadata
+ domainzonedn = "DC=DOMAINDNSZONES,%s" % names.domaindn.upper()
+ forestzonedn = "DC=FORESTDNSZONES,%s" % names.rootdn.upper()
+ domainzone_file = partfile[domainzonedn]
+ forestzone_file = partfile[forestzonedn]
+ metadata_file = "metadata.tdb"
try:
os.link(os.path.join(samldb_dir, metadata_file),
os.path.join(dns_samldb_dir, metadata_file))
- os.link(os.path.join(samldb_dir, domainzone_file),
- os.path.join(dns_samldb_dir, domainzone_file))
- os.link(os.path.join(samldb_dir, forestzone_file),
- os.path.join(dns_samldb_dir, forestzone_file))
- except OSError, e:
- try:
- os.symlink(os.path.join(samldb_dir, metadata_file),
- os.path.join(dns_samldb_dir, metadata_file))
- os.symlink(os.path.join(samldb_dir, domainzone_file),
- os.path.join(dns_samldb_dir, domainzone_file))
- os.symlink(os.path.join(samldb_dir, forestzone_file),
- os.path.join(dns_samldb_dir, forestzone_file))
- except OSError, e:
- logger.error("Failed to setup database for BIND, AD based DNS cannot be used")
- raise
-
- # Fill the basedn and @OPTION records in domain partition
+ os.link(os.path.join(private_dir, domainzone_file),
+ os.path.join(dns_dir, domainzone_file))
+ os.link(os.path.join(private_dir, forestzone_file),
+ os.path.join(dns_dir, forestzone_file))
+ except OSError:
+ logger.error("Failed to setup database for BIND, AD based DNS cannot be used")
+ raise
+ del partfile[domainzonedn]
+ del partfile[forestzonedn]
+
+ # Copy root, config, schema partitions (and any other if any)
+ # Since samdb is open in the current process, copy them in a child process
try:
- ldb = samba.Ldb(os.path.join(dns_samldb_dir, domainpart_file))
- domainguid_line = "objectGUID: %s\n-" % domainguid
- descr = b64encode(get_domain_descriptor(domainsid))
- add_ldif(ldb, "provision_basedn.ldif", {
- "DOMAINDN" : names.domaindn,
- "DOMAINGUID" : domainguid_line,
- "DOMAINSID" : str(domainsid),
- "DESCRIPTOR" : descr})
- add_ldif(ldb, "provision_basedn_options.ldif", None)
+ tdb_copy(logger,
+ os.path.join(private_dir, "sam.ldb"),
+ os.path.join(dns_dir, "sam.ldb"))
+ for nc in partfile:
+ pfile = partfile[nc]
+ tdb_copy(logger,
+ os.path.join(private_dir, pfile),
+ os.path.join(dns_dir, pfile))
except:
logger.error("Failed to setup database for BIND, AD based DNS cannot be used")
raise
@@ -693,22 +687,17 @@ def create_samdb_copy(logger, paths, names, domainsid, domainguid):
try:
os.chown(samldb_dir, -1, paths.bind_gid)
os.chmod(samldb_dir, 0750)
- os.chown(os.path.join(dns_dir, "sam.ldb"), -1, paths.bind_gid)
- os.chmod(os.path.join(dns_dir, "sam.ldb"), 0660)
- os.chown(dns_samldb_dir, -1, paths.bind_gid)
- os.chmod(dns_samldb_dir, 0770)
- os.chown(os.path.join(dns_samldb_dir, domainpart_file), -1, paths.bind_gid)
- os.chmod(os.path.join(dns_samldb_dir, domainpart_file), 0660)
- os.chown(os.path.join(dns_samldb_dir, configpart_file), -1, paths.bind_gid)
- os.chmod(os.path.join(dns_samldb_dir, configpart_file), 0660)
- os.chown(os.path.join(dns_samldb_dir, schemapart_file), -1, paths.bind_gid)
- os.chmod(os.path.join(dns_samldb_dir, schemapart_file), 0660)
--
Samba Shared Repository
More information about the samba-cvs
mailing list