samba-tool: moved join to domain join
authorGiampaolo Lauria <lauria2@yahoo.com>
Tue, 28 Jun 2011 19:06:41 +0000 (15:06 -0400)
committerAndrew Tridgell <tridge@samba.org>
Thu, 21 Jul 2011 00:32:24 +0000 (10:32 +1000)
This is part of the samba-tool work to fit the object-action model

Signed-off-by: Andrew Tridgell <tridge@samba.org>
source4/scripting/python/samba/netcmd/domain.py

index d13f87e798dff7b7aa0d34b6668ab32e3c40af35..f56dd97b811ea3d8ea0fa8bdc1bae2dc73df4d73 100644 (file)
@@ -27,7 +27,9 @@ import samba.getopt as options
 import ldb
 import os
 from samba import Ldb
-from samba.net import Net
+from samba.net import Net, LIBNET_JOIN_AUTOMATIC
+from samba.dcerpc.misc import SEC_CHAN_WKSTA
+from samba.join import join_RODC, join_DC
 from samba.auth import system_session
 from samba.samdb import SamDB
 from samba.dcerpc.samr import DOMAIN_PASSWORD_COMPLEX, DOMAIN_PASSWORD_STORE_CLEARTEXT
@@ -70,6 +72,59 @@ class cmd_domain_dumpkeys(Command):
 
 
 
+class cmd_domain_join(Command):
+    """Joins domain as either member or backup domain controller [server connection needed]"""
+
+    synopsis = "%prog domain join <dnsdomain> [DC | RODC | MEMBER] [options]"
+
+    takes_optiongroups = {
+        "sambaopts": options.SambaOptions,
+        "versionopts": options.VersionOptions,
+        "credopts": options.CredentialsOptions,
+    }
+
+    takes_options = [
+        Option("--server", help="DC to join", type=str),
+        Option("--site", help="site to join", type=str),
+        Option("--targetdir", help="where to store provision", type=str),
+        ]
+
+    takes_args = ["domain", "role?"]
+
+    def run(self, domain, role=None, sambaopts=None, credopts=None,
+            versionopts=None, server=None, site=None, targetdir=None):
+        lp = sambaopts.get_loadparm()
+        creds = credopts.get_credentials(lp)
+        net = Net(creds, lp, server=credopts.ipaddress)
+
+        if site is None:
+            site = "Default-First-Site-Name"
+
+        netbios_name = lp.get("netbios name")
+
+        if not role is None:
+            role = role.upper()
+
+        if role is None or role == "MEMBER":
+            (join_password, sid, domain_name) = net.join_member(domain,
+                                                                netbios_name,
+                                                                LIBNET_JOIN_AUTOMATIC)
+
+            self.outf.write("Joined domain %s (%s)\n" % (domain_name, sid))
+            return
+        elif role == "DC":
+            join_DC(server=server, creds=creds, lp=lp, domain=domain,
+                    site=site, netbios_name=netbios_name, targetdir=targetdir)
+            return
+        elif role == "RODC":
+            join_RODC(server=server, creds=creds, lp=lp, domain=domain,
+                      site=site, netbios_name=netbios_name, targetdir=targetdir)
+            return
+        else:
+            raise CommandError("Invalid role %s (possible values: MEMBER, BDC, RODC)" % role)
+
+
+
 class cmd_domain_level(Command):
     """Raises domain and forest function levels"""
 
@@ -467,6 +522,7 @@ class cmd_domain(SuperCommand):
 
     subcommands = {}
     subcommands["dumpkeys"] = cmd_domain_dumpkeys()
+    subcommands["join"] = cmd_domain_join()
     subcommands["level"] = cmd_domain_level()
     subcommands["machinepassword"] = cmd_domain_machinepassword()
     subcommands["passwordsettings"] = cmd_domain_passwordsettings()