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
26 from samba
.join
import join_RODC
, join_DC
28 class cmd_join(Command
):
29 """Joins domain as either member or backup domain controller [server connection needed]"""
31 synopsis
= "%prog join <dnsdomain> [DC | RODC | MEMBER] [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),
42 Option("--targetdir", help="where to store provision", type=str),
45 takes_args
= ["domain", "role?"]
47 def run(self
, domain
, role
=None, sambaopts
=None, credopts
=None,
48 versionopts
=None, server
=None, site
=None, targetdir
=None):
49 lp
= sambaopts
.get_loadparm()
50 creds
= credopts
.get_credentials(lp
)
51 net
= Net(creds
, lp
, server
=credopts
.ipaddress
)
54 site
= "Default-First-Site-Name"
56 netbios_name
= lp
.get("netbios name")
61 if role
is None or role
== "MEMBER":
62 secure_channel_type
= SEC_CHAN_WKSTA
64 join_DC(server
=server
, creds
=creds
, lp
=lp
, domain
=domain
,
65 site
=site
, netbios_name
=netbios_name
, targetdir
=targetdir
)
68 join_RODC(server
=server
, creds
=creds
, lp
=lp
, domain
=domain
,
69 site
=site
, netbios_name
=netbios_name
, targetdir
=targetdir
)
72 raise CommandError("Invalid role %s (possible values: MEMBER, BDC, RODC)" % role
)
74 (join_password
, sid
, domain_name
) = net
.join(domain
,
77 LIBNET_JOIN_AUTOMATIC
)
79 self
.outf
.write("Joined domain %s (%s)\n" % (domain_name
, sid
))