[SCM] Samba Shared Repository - branch master updated

Andrew Tridgell tridge at samba.org
Thu Feb 11 03:05:13 MST 2010


The branch, master has been updated
       via  2cf97c4... s4-dns: don't leave behind a tmp file
       via  1e1b081... s4-selftest: don't run rndc reload in selftest
       via  89b6a80... s4-dns: added a dns update task
       via  6bfb216... s4-provision: cope with umask in creating private/dns
       via  ae95d61... util: added file_compare() utility function
       via  d6fb64c... libreplace: added replacements for dprintf() and vdprintf()
       via  c986bfb... s4-provision: pre-create a named.conf.update file
       via  5a72eca... s4-provision: move zone file to dns subdirectory
      from  5a2ff4d... s4:provision Be more polite to long-suffering Samba testers.

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


- Log -----------------------------------------------------------------
commit 2cf97c403f73946693bb147daa6a618af6fdb526
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Feb 11 20:49:29 2010 +1100

    s4-dns: don't leave behind a tmp file
    
    If the dns update file doesn't need updating we need to delete the tmp
    file

commit 1e1b081189a7dafa0717e3e3deb4a46e079b146e
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Feb 11 20:48:47 2010 +1100

    s4-selftest: don't run rndc reload in selftest
    
    We don't want rndc calls on the build farm

commit 89b6a80e7261422011e92d8ef1bc7ef2f2fd06af
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Feb 11 20:21:15 2010 +1100

    s4-dns: added a dns update task
    
    This task watches for changes in the list of DCs, and creates a bind9
    formatted file that grants update permission to all DCs, plus to the
    administration, and machines update for their own names.
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit 6bfb216293e7416e1164766d6f96c769d76fca8d
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Feb 11 20:20:11 2010 +1100

    s4-provision: cope with umask in creating private/dns

commit ae95d611b6e0754f130707f23fa6ae0997c40b66
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Feb 11 20:19:40 2010 +1100

    util: added file_compare() utility function
    
    file_compare() returns true if two files are the same. It is meant for
    small files.
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit d6fb64c51244529388b1f79ba8220ff608e1e4de
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Feb 11 20:18:50 2010 +1100

    libreplace: added replacements for dprintf() and vdprintf()
    
    these are very useful for writing files with formatted writes
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit c986bfb22ec6ee1bda8a7c4053770831f582cbb3
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Feb 11 15:25:13 2010 +1100

    s4-provision: pre-create a named.conf.update file
    
    The named.conf.update file will be filled in at runtime by Samba to
    contain the list of bind9 grant rules for granting DNS dynamic update
    permissions on the domain.

commit 5a72eca574f2cb330a0d62936ca901b8ebee4194
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Feb 11 13:17:09 2010 +1100

    s4-provision: move zone file to dns subdirectory
    
    This allows the permissions to be correctly set for bind to write to
    a journal file. It also sets the right group ownership and permissions
    on the files that bind needs to access.
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

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

Summary of changes:
 lib/replace/libreplace.m4                   |    2 +-
 lib/replace/replace.c                       |   31 ++++
 lib/util/util.h                             |    5 +
 lib/util/util_file.c                        |   22 +++
 selftest/target/Samba4.pm                   |    4 +-
 source4/dsdb/config.mk                      |   13 ++
 source4/dsdb/dns/dns_update.c               |  224 +++++++++++++++++++++++++++
 source4/param/loadparm.c                    |    2 +-
 source4/scripting/python/samba/provision.py |   70 +++++++--
 source4/setup/named.conf                    |   43 +-----
 source4/setup/named.conf.update             |    4 +
 source4/smbd/server.c                       |    1 +
 12 files changed, 369 insertions(+), 52 deletions(-)
 create mode 100644 source4/dsdb/dns/dns_update.c
 create mode 100644 source4/setup/named.conf.update


Changeset truncated at 500 lines:

diff --git a/lib/replace/libreplace.m4 b/lib/replace/libreplace.m4
index 1353c1f..7a26deb 100644
--- a/lib/replace/libreplace.m4
+++ b/lib/replace/libreplace.m4
@@ -108,7 +108,7 @@ AC_CHECK_HEADERS(unix.h)
 AC_CHECK_FUNCS(seteuid setresuid setegid setresgid chroot bzero strerror)
 AC_CHECK_FUNCS(vsyslog setlinebuf mktime ftruncate chsize rename)
 AC_CHECK_FUNCS(waitpid wait4 strlcpy strlcat initgroups memmove strdup)
-AC_CHECK_FUNCS(pread pwrite strndup strcasestr strtok_r mkdtemp dup2)
+AC_CHECK_FUNCS(pread pwrite strndup strcasestr strtok_r mkdtemp dup2 dprintf vdprintf)
 AC_CHECK_FUNCS(isatty chown lchown link readlink symlink realpath)
 AC_HAVE_DECL(setresuid, [#include <unistd.h>])
 AC_HAVE_DECL(setresgid, [#include <unistd.h>])
diff --git a/lib/replace/replace.c b/lib/replace/replace.c
index df29185..6f0851d 100644
--- a/lib/replace/replace.c
+++ b/lib/replace/replace.c
@@ -704,3 +704,34 @@ void *rep_memmem(const void *haystack, size_t haystacklen,
 }
 #endif
 
+#ifndef HAVE_VDPRINTF
+int vdprintf(int fd, const char *format, va_list ap)
+{
+	char *s = NULL;
+	int ret;
+
+	vasprintf(&s, format, ap);
+	if (s == NULL) {
+		errno = ENOMEM;
+		return -1;
+	}
+	ret = write(fd, s, strlen(s));
+	free(s);
+	return ret;
+}
+#endif
+
+#ifndef HAVE_DPRINTF
+int dprintf(int fd, const char *format, ...)
+{
+	int ret;
+	va_list ap;
+
+	va_start(ap, format);
+	ret = vdprintf(fd, format, ap);
+	va_end(ap);
+
+	return ret;
+}
+#endif
+
diff --git a/lib/util/util.h b/lib/util/util.h
index 729190a..da97761 100644
--- a/lib/util/util.h
+++ b/lib/util/util.h
@@ -601,6 +601,11 @@ _PUBLIC_ int vfdprintf(int fd, const char *format, va_list ap) PRINTF_ATTRIBUTE(
 _PUBLIC_ int fdprintf(int fd, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
 _PUBLIC_ bool large_file_support(const char *path);
 
+/*
+  compare two files, return true if the two files have the same content
+ */
+bool file_compare(const char *path1, const char *path2);
+
 /* The following definitions come from lib/util/util.c  */
 
 
diff --git a/lib/util/util_file.c b/lib/util/util_file.c
index 7466004..aa0b2d5 100644
--- a/lib/util/util_file.c
+++ b/lib/util/util_file.c
@@ -435,3 +435,25 @@ _PUBLIC_ bool large_file_support(const char *path)
 }
 
 
+/*
+  compare two files, return true if the two files have the same content
+ */
+bool file_compare(const char *path1, const char *path2)
+{
+	size_t size1, size2;
+	char *p1, *p2;
+	TALLOC_CTX *mem_ctx = talloc_new(NULL);
+
+	p1 = file_load(path1, &size1, 0, mem_ctx);
+	p2 = file_load(path2, &size2, 0, mem_ctx);
+	if (!p1 || !p2 || size1 != size2) {
+		talloc_free(mem_ctx);
+		return false;
+	}
+	if (memcmp(p1, p2, size1) != 0) {
+		talloc_free(mem_ctx);
+		return false;
+	}
+	talloc_free(mem_ctx);
+	return true;
+}
diff --git a/selftest/target/Samba4.pm b/selftest/target/Samba4.pm
index e6ed0ab..b3f1e58 100644
--- a/selftest/target/Samba4.pm
+++ b/selftest/target/Samba4.pm
@@ -580,7 +580,9 @@ sub provision_raw_step1($$)
 #We don't want to pass our self-tests if the PAC code is wrong
 	gensec:require_pac = true
 	log level = $ctx->{server_loglevel}
-	lanman auth = Yes";
+	lanman auth = Yes
+	dnsupdate:rndc reload command = /bin/true
+";
 
 	if (defined($ctx->{sid_generator}) && $ctx->{sid_generator} ne "internal") {
 		print CONFFILE "
diff --git a/source4/dsdb/config.mk b/source4/dsdb/config.mk
index 5ea31c3..b038b5e 100644
--- a/source4/dsdb/config.mk
+++ b/source4/dsdb/config.mk
@@ -90,3 +90,16 @@ KCC_SRV_OBJ_FILES = $(addprefix $(dsdbsrcdir)/kcc/, \
 
 $(eval $(call proto_header_template,$(dsdbsrcdir)/kcc/kcc_service_proto.h,$(KCC_SRV_OBJ_FILES:.o=.c)))
 
+#######################
+# Start SUBSYSTEM DNS_UPDATE_SRV
+[MODULE::DNS_UPDATE_SRV]
+INIT_FUNCTION = server_service_dnsupdate_init
+SUBSYSTEM = service
+PRIVATE_DEPENDENCIES = \
+		SAMDB \
+		process_model
+# End SUBSYSTEM DNS_UPDATE_SRV
+#######################
+
+DNS_UPDATE_SRV_OBJ_FILES = $(addprefix $(dsdbsrcdir)/dns/, \
+		dns_update.o)
diff --git a/source4/dsdb/dns/dns_update.c b/source4/dsdb/dns/dns_update.c
new file mode 100644
index 0000000..13f37e3
--- /dev/null
+++ b/source4/dsdb/dns/dns_update.c
@@ -0,0 +1,224 @@
+/*
+   Unix SMB/CIFS mplementation.
+
+   DNS udpate service
+
+   Copyright (C) Andrew Tridgell 2009
+
+   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/>.
+
+*/
+
+/*
+  this module auto-creates the named.conf.update file, which tells
+  bind9 what KRB5 principals it should accept for updates to our zone
+ */
+
+#include "includes.h"
+#include "dsdb/samdb/samdb.h"
+#include "auth/auth.h"
+#include "smbd/service.h"
+#include "lib/events/events.h"
+#include "lib/messaging/irpc.h"
+#include "lib/ldb/include/ldb_errors.h"
+#include "param/param.h"
+#include "system/filesys.h"
+#include "lib/tevent/tevent.h"
+
+struct dnsupdate_service {
+	struct task_server *task;
+	struct auth_session_info *system_session_info;
+	struct ldb_context *samdb;
+
+	struct {
+		uint32_t interval;
+		struct tevent_timer *te;
+	} periodic;
+};
+
+/*
+  called every dnsupdate:interval seconds
+ */
+static void dnsupdate_rebuild(struct dnsupdate_service *service)
+{
+	int ret;
+	struct ldb_result *res;
+	const char *tmp_path, *path;
+	int fd, i;
+	const char *attrs[] = { "sAMAccountName", NULL };
+	const char *realm = lp_realm(service->task->lp_ctx);
+	TALLOC_CTX *tmp_ctx = talloc_new(service);
+	const char *rndc_cmd;
+
+	ret = ldb_search(service->samdb, tmp_ctx, &res, NULL, LDB_SCOPE_SUBTREE,
+			 attrs, "(&(primaryGroupID=%u)(objectClass=computer))",
+			 DOMAIN_RID_DCS);
+	if (ret != LDB_SUCCESS) {
+		DEBUG(0,(__location__ ": Unable to find DCs list - %s", ldb_errstring(service->samdb)));
+		talloc_free(tmp_ctx);
+		return;
+	}
+
+	path = lp_parm_string(service->task->lp_ctx, NULL, "dnsupdate", "path");
+	if (path == NULL) {
+		path = private_path(tmp_ctx, service->task->lp_ctx, "named.conf.update");
+	}
+
+	tmp_path = talloc_asprintf(tmp_ctx, "%s.tmp", path);
+	if (path == NULL || tmp_path == NULL) {
+		DEBUG(0,(__location__ ": Unable to get paths"));
+		talloc_free(tmp_ctx);
+		return;
+	}
+
+	unlink(tmp_path);
+	fd = open(tmp_path, O_CREAT|O_TRUNC|O_WRONLY, 0444);
+	if (fd == -1) {
+		DEBUG(1,(__location__ ": Unable to open %s - %s\n", tmp_path, strerror(errno)));
+		talloc_free(tmp_ctx);
+		return;
+	}
+
+	dprintf(fd, "/* this file is auto-generated - do not edit */\n");
+	dprintf(fd, "update-policy {\n");
+	dprintf(fd, "\tgrant %s ms-self * A AAAA;\n", realm);
+	dprintf(fd, "\tgrant administrator@%s wildcard * A AAAA SRV CNAME TXT;\n", realm);
+
+	for (i=0; i<res->count; i++) {
+		const char *acctname;
+		acctname = ldb_msg_find_attr_as_string(res->msgs[i],
+						       "sAMAccountName", NULL);
+		if (!acctname) continue;
+		dprintf(fd, "\tgrant %s@%s wildcard * A AAAA SRV CNAME;\n",
+			acctname, realm);
+	}
+	dprintf(fd, "};\n");
+	close(fd);
+
+	if (file_compare(tmp_path, path) == true) {
+		unlink(tmp_path);
+		talloc_free(tmp_ctx);
+		return;
+	}
+
+	if (rename(tmp_path, path) != 0) {
+		DEBUG(0,(__location__ ": Failed to rename %s to %s - %s\n",
+			 tmp_path, path, strerror(errno)));
+		talloc_free(tmp_ctx);
+		return;
+	}
+
+	DEBUG(1,("Loaded new DNS update grant rules\n"));
+
+	rndc_cmd = lp_parm_string(service->task->lp_ctx, NULL, "dnsupdate", "rndc reload command");
+	if (!rndc_cmd) {
+		rndc_cmd = "/usr/sbin/rndc reload";
+	}
+	ret = system(rndc_cmd);
+	if (ret != 0) {
+		DEBUG(0,(__location__ ": Failed rndc reload command: '%s' - %d\n",
+			 rndc_cmd, ret));
+	}
+
+	talloc_free(tmp_ctx);
+}
+
+static NTSTATUS dnsupdate_periodic_schedule(struct dnsupdate_service *service);
+
+/*
+  called every dnsupdate:interval seconds
+ */
+static void dnsupdate_periodic_handler_te(struct tevent_context *ev, struct tevent_timer *te,
+					  struct timeval t, void *ptr)
+{
+	struct dnsupdate_service *service = talloc_get_type(ptr, struct dnsupdate_service);
+
+	dnsupdate_rebuild(service);
+	dnsupdate_periodic_schedule(service);
+}
+
+
+static NTSTATUS dnsupdate_periodic_schedule(struct dnsupdate_service *service)
+{
+	service->periodic.te = tevent_add_timer(service->task->event_ctx, service,
+						timeval_current_ofs(service->periodic.interval, 0),
+						dnsupdate_periodic_handler_te, service);
+	NT_STATUS_HAVE_NO_MEMORY(service->periodic.te);
+	return NT_STATUS_OK;
+}
+
+/*
+  startup the dns update task
+*/
+static void dnsupdate_task_init(struct task_server *task)
+{
+	NTSTATUS status;
+	struct dnsupdate_service *service;
+
+	if (lp_server_role(task->lp_ctx) != ROLE_DOMAIN_CONTROLLER) {
+		/* not useful for non-DC */
+		return;
+	}
+
+	task_server_set_title(task, "task[dnsupdate]");
+
+	service = talloc_zero(task, struct dnsupdate_service);
+	if (!service) {
+		task_server_terminate(task, "dnsupdate_task_init: out of memory", true);
+		return;
+	}
+	service->task		= task;
+	task->private_data	= service;
+
+	service->system_session_info = system_session(service->task->lp_ctx);
+	if (!service->system_session_info) {
+		task_server_terminate(task,
+				      "dnsupdate: Failed to obtain server credentials\n",
+				      true);
+		return;
+	}
+
+	service->samdb = samdb_connect(service, service->task->event_ctx, task->lp_ctx,
+				       service->system_session_info);
+	if (!service->samdb) {
+		task_server_terminate(task, "dnsupdate: Failed to connect to local samdb\n",
+				      true);
+		return;
+	}
+
+	service->periodic.interval	= lp_parm_int(task->lp_ctx, NULL,
+						      "dnsupdate", "interval", 60); /* in seconds */
+
+	status = dnsupdate_periodic_schedule(service);
+	if (!NT_STATUS_IS_OK(status)) {
+		task_server_terminate(task, talloc_asprintf(task,
+				      "dnsupdate: Failed to periodic schedule: %s\n",
+							    nt_errstr(status)), true);
+		return;
+	}
+
+	irpc_add_name(task->msg_ctx, "dnsupdate");
+
+	/* create the intial file */
+	dnsupdate_rebuild(service);
+
+}
+
+/*
+  register ourselves as a available server
+*/
+NTSTATUS server_service_dnsupdate_init(void)
+{
+	return register_server_service("dnsupdate", dnsupdate_task_init);
+}
diff --git a/source4/param/loadparm.c b/source4/param/loadparm.c
index f31d216..cb23cea 100644
--- a/source4/param/loadparm.c
+++ b/source4/param/loadparm.c
@@ -2329,7 +2329,7 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx)
 	lp_do_global_parameter(lp_ctx, "max connections", "-1");
 
 	lp_do_global_parameter(lp_ctx, "dcerpc endpoint servers", "epmapper srvsvc wkssvc rpcecho samr netlogon lsarpc spoolss drsuapi winreg dssetup unixinfo browser");
-	lp_do_global_parameter(lp_ctx, "server services", "smb rpc nbt wrepl ldap cldap kdc drepl winbind ntp_signd kcc");
+	lp_do_global_parameter(lp_ctx, "server services", "smb rpc nbt wrepl ldap cldap kdc drepl winbind ntp_signd kcc dnsupdate");
 	lp_do_global_parameter(lp_ctx, "ntptr providor", "simple_ldb");
 	lp_do_global_parameter(lp_ctx, "auth methods:domain controller", "anonymous sam_ignoredomain");
 	lp_do_global_parameter(lp_ctx, "auth methods:member server", "anonymous sam winbind");
diff --git a/source4/scripting/python/samba/provision.py b/source4/scripting/python/samba/provision.py
index 2ea4613..86f1d9c 100644
--- a/source4/scripting/python/samba/provision.py
+++ b/source4/scripting/python/samba/provision.py
@@ -35,6 +35,7 @@ import socket
 import param
 import registry
 import urllib
+import shutil
 
 import ldb
 
@@ -294,8 +295,9 @@ def provision_paths_from_lp(lp, dnsdomain):
     paths.idmapdb = os.path.join(paths.private_dir, lp.get("idmap database") or "idmap.ldb")
     paths.secrets = os.path.join(paths.private_dir, lp.get("secrets database") or "secrets.ldb")
     paths.privilege = os.path.join(paths.private_dir, "privilege.ldb")
-    paths.dns = os.path.join(paths.private_dir, dnsdomain + ".zone")
+    paths.dns = os.path.join(paths.private_dir, "dns", dnsdomain + ".zone")
     paths.namedconf = os.path.join(paths.private_dir, "named.conf")
+    paths.namedconf_update = os.path.join(paths.private_dir, "named.conf.update")
     paths.namedtxt = os.path.join(paths.private_dir, "named.txt")
     paths.krb5conf = os.path.join(paths.private_dir, "krb5.conf")
     paths.winsdb = os.path.join(paths.private_dir, "wins.ldb")
@@ -646,7 +648,8 @@ def secretsdb_self_join(secretsdb, domain,
       secretsdb.add(msg)
 
 
-def secretsdb_setup_dns(secretsdb, setup_path, realm, dnsdomain, 
+def secretsdb_setup_dns(secretsdb, setup_path, private_dir,
+                        realm, dnsdomain,
                         dns_keytab_path, dnspass):
     """Add DNS specific bits to a secrets database.
     
@@ -654,6 +657,11 @@ def secretsdb_setup_dns(secretsdb, setup_path, realm, dnsdomain,
     :param setup_path: Setup path function
     :param machinepass: Machine password
     """
+    try:
+        os.unlink(os.path.join(private_dir, dns_keytab_path))
+    except OSError:
+        pass
+
     setup_ldb(secretsdb, setup_path("secrets_dns.ldif"), { 
             "REALM": realm,
             "DNSDOMAIN": dnsdomain,
@@ -1163,6 +1171,10 @@ def provision(setup_dir, message, session_info,
         wheel_gid = findnss_gid(["wheel", "adm"])
     else:
         wheel_gid = findnss_gid([wheel])
+    try:
+        bind_gid = findnss_gid(["bind", "named"])
+    except KeyError:
+        bind_gid = None
 
     if targetdir is not None:
         if (not os.path.exists(os.path.join(targetdir, "etc"))):
@@ -1195,6 +1207,8 @@ def provision(setup_dir, message, session_info,
 
     paths = provision_paths_from_lp(lp, names.dnsdomain)
 
+    paths.bind_gid = bind_gid
+
     if hostip is None:
         try:
             hostip = socket.getaddrinfo(names.hostname, None, socket.AF_INET, socket.AI_CANONNAME, socket.IPPROTO_IP)[0][-1][0]
@@ -1348,7 +1362,8 @@ def provision(setup_dir, message, session_info,
                             secure_channel_type=SEC_CHAN_BDC)
 
         if serverrole == "domain controller":
-            secretsdb_setup_dns(secrets_ldb, setup_path, 
+            secretsdb_setup_dns(secrets_ldb, setup_path,
+                                paths.private_dir,
                                 realm=names.realm, dnsdomain=names.dnsdomain,
                                 dns_keytab_path=paths.dns_keytab,
                                 dnspass=dnspass)
@@ -1358,13 +1373,13 @@ def provision(setup_dir, message, session_info,
 
             # Only make a zone file on the first DC, it should be replicated
             # with DNS replication
-            create_zone_file(paths.dns, setup_path, dnsdomain=names.dnsdomain,
+            create_zone_file(message, paths, setup_path, dnsdomain=names.dnsdomain,
                              hostip=hostip,
                              hostip6=hostip6, hostname=names.hostname,
                              realm=names.realm,
                              domainguid=domainguid, ntdsguid=names.ntdsguid)
 
-            create_named_conf(paths.namedconf, setup_path, realm=names.realm,
+            create_named_conf(paths, setup_path, realm=names.realm,
                               dnsdomain=names.dnsdomain, private_dir=paths.private_dir)
 
             create_named_txt(paths.namedtxt, setup_path, realm=names.realm,
@@ -1387,6 +1402,16 @@ def provision(setup_dir, message, session_info,
     #Now commit the secrets.ldb to disk
     secrets_ldb.transaction_commit()
 
+    # the commit creates the dns.keytab, now chown it
+    dns_keytab_path = os.path.join(paths.private_dir, paths.dns_keytab)
+    if (os.path.isfile(dns_keytab_path) and paths.bind_gid is not None):
+        try:
+            os.chmod(dns_keytab_path, 0640)
+            os.chown(dns_keytab_path, -1, paths.bind_gid)
+        except OSError:
+            message("Failed to chown %s to bind gid %u" % (dns_keytab_path, paths.bind_gid))
+
+
     message("Please install the phpLDAPadmin configuration located at %s into /etc/phpldapadmin/config.php" % paths.phpldapadminconfig)
 
     message("Once the above files are installed, your Samba4 server will be ready to use")
@@ -1459,12 +1484,12 @@ def create_phpldapadmin_config(path, setup_path, ldapi_uri):
             {"S4_LDAPI_URI": ldapi_uri})
 
 
-def create_zone_file(path, setup_path, dnsdomain, 
+def create_zone_file(message, paths, setup_path, dnsdomain,
                      hostip, hostip6, hostname, realm, domainguid,
                      ntdsguid):
     """Write out a DNS zone file, from the info in the current database.
 
-    :param path: Path of the new zone file.
+    :param paths: paths object
     :param setup_path: Setup path function.
     :param dnsdomain: DNS Domain name
     :param domaindn: DN of the Domain


-- 
Samba Shared Repository


More information about the samba-cvs mailing list