5 # Copyright Jelmer Vernooij 2010
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
21 import samba.getopt as options
23 from samba.net import Net, LIBNET_JOIN_AUTOMATIC
24 from samba.netcmd import Command, CommandError, Option
25 from samba.dcerpc.misc import SEC_CHAN_WKSTA, SEC_CHAN_BDC
26 from samba.join import join_rodc
28 class cmd_join(Command):
29 """Joins domain as either member or backup domain controller [server connection needed]"""
31 synopsis = "%prog join <dnsdomain> [BDC | MEMBER | RODC] [options]"
33 takes_optiongroups = {
34 "sambaopts": options.SambaOptions,
35 "versionopts": options.VersionOptions,
36 "credopts": options.CredentialsOptions,
40 Option("--server", help="DC to join", type=str),
41 Option("--site", help="site to join", type=str),
44 takes_args = ["domain", "role?"]
46 def run(self, domain, role=None, sambaopts=None, credopts=None,
47 versionopts=None, server=None, site=None):
48 lp = sambaopts.get_loadparm()
49 creds = credopts.get_credentials(lp)
53 site = "Default-First-Site-Name"
55 netbios_name = lp.get("netbios name")
60 if domain.find('.') == -1:
61 raise CommandError("Please use the full DNS domain name, not the short form for '%s'" % domain)
64 secure_channel_type = SEC_CHAN_WKSTA
66 secure_channel_type = SEC_CHAN_BDC
67 elif role == "MEMBER":
68 secure_channel_type = SEC_CHAN_WKSTA
70 join_rodc(server=server, creds=creds, lp=lp, domain=domain,
71 site=site, netbios_name=netbios_name)
74 raise CommandError("Invalid role %s (possible values: MEMBER, BDC, RODC)" % role)
76 (join_password, sid, domain_name) = net.join(domain,
79 LIBNET_JOIN_AUTOMATIC)
81 self.outf.write("Joined domain %s (%s)\n" % (domain_name, sid))