From 179bf9b51c9de5f9f8e78893bd20b9821e39e7e4 Mon Sep 17 00:00:00 2001 From: Matthias Dieter Wallnöfer Date: Tue, 22 Nov 2011 22:26:06 +0100 Subject: s4:libnet/py_net.c: "py_net_finddc" - add an "address" parameter This is useful for a new "samba-tool domain info" command. Patch inspired by Matthieu Patou. Signed-off-by: Stefan Metzmacher --- source4/libnet/py_net.c | 22 +++++++++++++++------- source4/scripting/bin/samba_spnupdate | 2 +- source4/scripting/python/samba/join.py | 2 +- source4/scripting/python/samba/netcmd/common.py | 13 ++++++++----- 4 files changed, 25 insertions(+), 14 deletions(-) (limited to 'source4') diff --git a/source4/libnet/py_net.c b/source4/libnet/py_net.c index a8db2976a6..7c90572e12 100644 --- a/source4/libnet/py_net.c +++ b/source4/libnet/py_net.c @@ -580,23 +580,31 @@ static PyObject *py_net_replicate_chunk(py_net_Object *self, PyObject *args, PyO /* find a DC given a domain name and server type */ -static PyObject *py_net_finddc(py_net_Object *self, PyObject *args) +static PyObject *py_net_finddc(py_net_Object *self, PyObject *args, PyObject *kwargs) { - const char *domain_name; + const char *domain = NULL, *address = NULL; unsigned server_type; NTSTATUS status; struct finddcs *io; TALLOC_CTX *mem_ctx; PyObject *ret; + const char * const kwnames[] = { "flags", "domain", "address", NULL }; - if (!PyArg_ParseTuple(args, "sI", &domain_name, &server_type)) { + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "I|ss", + discard_const_p(char *, kwnames), + &server_type, &domain, &address)) { return NULL; } mem_ctx = talloc_new(self->mem_ctx); io = talloc_zero(mem_ctx, struct finddcs); - io->in.domain_name = domain_name; + if (domain != NULL) { + io->in.domain_name = domain; + } + if (address != NULL) { + io->in.server_address = address; + } io->in.minimum_dc_flags = server_type; status = finddcs_cldap(io, io, @@ -624,8 +632,8 @@ static const char py_net_replicate_init_doc[] = "replicate_init(samdb, lp, drspi static const char py_net_replicate_chunk_doc[] = "replicate_chunk(state, level, ctr, schema)\n" "Process replication for one chunk"; -static const char py_net_finddc_doc[] = "finddc(domain, server_type)\n" - "find a DC with the specified server_type bits. Return the DNS name"; +static const char py_net_finddc_doc[] = "finddc(flags=server_type, domain=None, address=None)\n" + "Find a DC with the specified 'server_type' bits. The 'domain' and/or 'address' have to be used as additional search criteria. Returns the whole netlogon struct"; static PyMethodDef net_obj_methods[] = { {"join_member", (PyCFunction)py_net_join_member, METH_VARARGS|METH_KEYWORDS, py_net_join_member_doc}, @@ -638,7 +646,7 @@ static PyMethodDef net_obj_methods[] = { {"vampire", (PyCFunction)py_net_vampire, METH_VARARGS|METH_KEYWORDS, py_net_vampire_doc}, {"replicate_init", (PyCFunction)py_net_replicate_init, METH_VARARGS|METH_KEYWORDS, py_net_replicate_init_doc}, {"replicate_chunk", (PyCFunction)py_net_replicate_chunk, METH_VARARGS|METH_KEYWORDS, py_net_replicate_chunk_doc}, - {"finddc", (PyCFunction)py_net_finddc, METH_VARARGS, py_net_finddc_doc}, + {"finddc", (PyCFunction)py_net_finddc, METH_KEYWORDS, py_net_finddc_doc}, { NULL } }; diff --git a/source4/scripting/bin/samba_spnupdate b/source4/scripting/bin/samba_spnupdate index 10da1d917b..52a51d8b81 100755 --- a/source4/scripting/bin/samba_spnupdate +++ b/source4/scripting/bin/samba_spnupdate @@ -190,7 +190,7 @@ def call_rodc_update(d): net = Net(creds=creds, lp=lp) try: - cldap_ret = net.finddc(domain, nbt.NBT_SERVER_DS | nbt.NBT_SERVER_WRITABLE) + cldap_ret = net.finddc(domain=domain, flags=nbt.NBT_SERVER_DS | nbt.NBT_SERVER_WRITABLE) except Exception, reason: print("Unable to find writeable DC for domain '%s' to send DRS writeSPN to : %s" % (domain, reason)) sys.exit(1) diff --git a/source4/scripting/python/samba/join.py b/source4/scripting/python/samba/join.py index 4252a2d7d4..3ae1a2c81d 100644 --- a/source4/scripting/python/samba/join.py +++ b/source4/scripting/python/samba/join.py @@ -195,7 +195,7 @@ class dc_join(object): def find_dc(ctx, domain): '''find a writeable DC for the given domain''' try: - ctx.cldap_ret = ctx.net.finddc(domain, nbt.NBT_SERVER_LDAP | nbt.NBT_SERVER_DS | nbt.NBT_SERVER_WRITABLE) + ctx.cldap_ret = ctx.net.finddc(domain=domain, flags=nbt.NBT_SERVER_LDAP | nbt.NBT_SERVER_DS | nbt.NBT_SERVER_WRITABLE) except Exception: raise Exception("Failed to find a writeable DC for domain '%s'" % domain) if ctx.cldap_ret.client_site is not None and ctx.cldap_ret.client_site != "": diff --git a/source4/scripting/python/samba/netcmd/common.py b/source4/scripting/python/samba/netcmd/common.py index 234fad3c03..cc97fc523f 100644 --- a/source4/scripting/python/samba/netcmd/common.py +++ b/source4/scripting/python/samba/netcmd/common.py @@ -52,10 +52,13 @@ def netcmd_dnsname(lp): return lp.get('netbios name').lower() + "." + lp.get('realm').lower() -def netcmd_finddc(lp, creds): - '''return domain-name of a writable/ldap-capable DC for the domain.''' +def netcmd_finddc(lp, creds, realm=None): + '''Return domain-name of a writable/ldap-capable DC for the default + domain (parameter "realm" in smb.conf) unless another realm has been + specified as argument''' net = Net(creds=creds, lp=lp) - realm = lp.get('realm') - cldap_ret = net.finddc(realm, - nbt.NBT_SERVER_LDAP | nbt.NBT_SERVER_DS | nbt.NBT_SERVER_WRITABLE) + if realm is None: + realm = lp.get('realm') + cldap_ret = net.finddc(domain=realm, + flags=nbt.NBT_SERVER_LDAP | nbt.NBT_SERVER_DS | nbt.NBT_SERVER_WRITABLE) return cldap_ret.pdc_dns_name -- cgit