s4-rodc: use python finddc code to avoid the need for --server
authorAndrew Tridgell <tridge@samba.org>
Tue, 14 Sep 2010 08:22:13 +0000 (18:22 +1000)
committerAndrew Tridgell <tridge@samba.org>
Wed, 15 Sep 2010 05:39:35 +0000 (15:39 +1000)
The DC is now found via DNS/CLDAP

Pair-Programmed-With: Andrew Bartlett <abartlet@samba.org>

source4/scripting/python/samba/join.py

index ecc225ae3be05fb143bbd52854ffb72caf05fb4e..36732d692ddc79c5c98eb6f161130b94384ca37d 100644 (file)
@@ -25,7 +25,7 @@ from samba import gensec, Ldb
 import ldb, samba, sys
 from samba.ndr import ndr_pack, ndr_unpack, ndr_print
 from samba.dcerpc import security
-from samba.dcerpc import drsuapi, misc, netlogon
+from samba.dcerpc import drsuapi, misc, netlogon, nbt
 from samba.credentials import Credentials, DONT_USE_KERBEROS
 from samba.provision import secretsdb_self_join, provision, FILL_DRS, find_setup_dir
 from samba.net import Net
@@ -43,9 +43,6 @@ def join_rodc(server=None, creds=None, lp=None, site=None, netbios_name=None,
               targetdir=None, domain=None):
     """join as a RODC"""
 
-    if server is None:
-        raise Exception("You must supply a server for a RODC join")
-
     def del_noerror(samdb, dn):
         try:
             samdb.delete(dn)
@@ -69,6 +66,11 @@ def join_rodc(server=None, creds=None, lp=None, site=None, netbios_name=None,
         except:
             pass
 
+    def find_dc(ctx, domain):
+        '''find a writeable DC for the given domain'''
+        return ctx.net.finddc(domain, nbt.NBT_SERVER_LDAP | nbt.NBT_SERVER_DS | nbt.NBT_SERVER_WRITABLE)
+
+
     def get_dsServiceName(samdb):
         res = samdb.search(base="", scope=ldb.SCOPE_BASE, attrs=["dsServiceName"])
         return res[0]["dsServiceName"][0]
@@ -285,14 +287,18 @@ def join_rodc(server=None, creds=None, lp=None, site=None, netbios_name=None,
     ctx.site = site
     ctx.netbios_name = netbios_name
     ctx.targetdir = targetdir
-    ctx.server = server
 
     ctx.creds.set_gensec_features(creds.get_gensec_features() | gensec.FEATURE_SEAL)
+    ctx.net = Net(creds=ctx.creds, lp=ctx.lp)
+
+    if server is not None:
+        ctx.server = server
+    else:
+        ctx.server = find_dc(ctx, domain)
 
     ctx.samdb = SamDB(url="ldap://%s" % ctx.server,
                       session_info=system_session(),
                       credentials=ctx.creds, lp=ctx.lp)
-    ctx.net = Net(creds=ctx.creds, lp=ctx.lp)
 
     ctx.myname = netbios_name
     ctx.samname = "%s$" % ctx.myname