2008-02-21 03:22:20 +03:00
#!/usr/bin/python
#
# Unix SMB/CIFS implementation.
# provision a Samba4 server
# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007-2008
# Copyright (C) Andrew Bartlett <abartlet@samba.org> 2008
#
# Based on the original in EJS:
# Copyright (C) Andrew Tridgell 2005
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import getopt
import optparse
2008-12-11 20:51:28 +03:00
import os
import sys
2008-02-21 03:22:20 +03:00
2008-05-11 07:45:49 +04:00
# Find right directory when running from source tree
sys.path.insert(0, "bin/python")
2008-05-11 07:29:20 +04:00
2008-02-21 03:22:20 +03:00
import samba
2008-07-15 09:15:12 +04:00
from samba.credentials import DONT_USE_KERBEROS
2008-05-22 01:59:34 +04:00
from samba.auth import system_session
2008-02-21 03:22:20 +03:00
import samba.getopt as options
2008-05-22 01:59:34 +04:00
from samba import param
2008-12-19 23:47:31 +03:00
from samba.provision import provision, FILL_FULL, FILL_NT4SYNC, FILL_DRS
2008-02-21 03:22:20 +03:00
2008-04-14 21:09:57 +04:00
# how do we make this case insensitive??
2008-02-21 03:22:20 +03:00
parser = optparse.OptionParser("provision [options]")
sambaopts = options.SambaOptions(parser)
parser.add_option_group(sambaopts)
parser.add_option_group(options.VersionOptions(parser))
credopts = options.CredentialsOptions(parser)
parser.add_option_group(credopts)
2008-12-11 20:51:28 +03:00
parser.add_option("--interactive", help="Ask for names")
2008-02-21 03:22:20 +03:00
parser.add_option("--setupdir", type="string", metavar="DIR",
help="directory with setup files")
parser.add_option("--realm", type="string", metavar="REALM", help="set realm")
parser.add_option("--domain", type="string", metavar="DOMAIN",
help="set domain")
parser.add_option("--domain-guid", type="string", metavar="GUID",
help="set domainguid (otherwise random)")
parser.add_option("--domain-sid", type="string", metavar="SID",
help="set domainsid (otherwise random)")
parser.add_option("--policy-guid", type="string", metavar="GUID",
help="set policy guid")
2008-04-02 04:38:58 +04:00
parser.add_option("--invocationid", type="string", metavar="GUID",
help="set invocationid (otherwise random)")
2008-02-21 03:22:20 +03:00
parser.add_option("--host-name", type="string", metavar="HOSTNAME",
help="set hostname")
parser.add_option("--host-ip", type="string", metavar="IPADDRESS",
2008-04-02 04:51:24 +04:00
help="set IPv4 ipaddress")
parser.add_option("--host-ip6", type="string", metavar="IP6ADDRESS",
help="set IPv6 ipaddress")
2008-02-21 03:22:20 +03:00
parser.add_option("--adminpass", type="string", metavar="PASSWORD",
help="choose admin password (otherwise random)")
parser.add_option("--krbtgtpass", type="string", metavar="PASSWORD",
help="choose krbtgt password (otherwise random)")
parser.add_option("--machinepass", type="string", metavar="PASSWORD",
help="choose machine password (otherwise random)")
parser.add_option("--dnspass", type="string", metavar="PASSWORD",
help="choose dns password (otherwise random)")
parser.add_option("--root", type="string", metavar="USERNAME",
help="choose 'root' unix username")
parser.add_option("--nobody", type="string", metavar="USERNAME",
help="choose 'nobody' user")
parser.add_option("--nogroup", type="string", metavar="GROUPNAME",
help="choose 'nogroup' group")
parser.add_option("--wheel", type="string", metavar="GROUPNAME",
help="choose 'wheel' privileged group")
parser.add_option("--users", type="string", metavar="GROUPNAME",
help="choose 'users' group")
parser.add_option("--quiet", help="Be quiet", action="store_true")
parser.add_option("--blank", action="store_true",
help="do not add users or groups, just the structure")
parser.add_option("--ldap-backend", type="string", metavar="LDAPSERVER",
help="LDAP server to use for this provision")
parser.add_option("--ldap-backend-type", type="choice", metavar="LDAP-BACKEND-TYPE",
help="LDB mapping module to use for the LDAP backend",
choices=["fedora-ds", "openldap"])
parser.add_option("--aci", type="string", metavar="ACI",
help="An arbitary LDIF fragment, particularly useful to loading a backend ACI value into a target LDAP server. You must provide at least a realm and domain")
parser.add_option("--server-role", type="choice", metavar="ROLE",
2008-03-07 02:57:52 +03:00
choices=["domain controller", "dc", "member server", "member", "standalone"],
2008-02-21 03:22:20 +03:00
help="Set server role to provision for (default standalone)")
parser.add_option("--partitions-only",
help="Configure Samba's partitions, but do not modify them (ie, join a BDC)", action="store_true")
parser.add_option("--targetdir", type="string", metavar="DIR",
help="Set target directory")
opts = parser.parse_args()[0]
def message(text):
"""print a message if quiet is not set."""
if not opts.quiet:
print text
2008-12-11 20:51:28 +03:00
if len(sys.argv) == 1:
opts.interactive = True
if not opts.interactive and (opts.realm is None or opts.domain is None):
2008-02-21 03:22:20 +03:00
if opts.realm is None:
print >>sys.stderr, "No realm set"
if opts.domain is None:
print >>sys.stderr, "No domain set"
parser.print_usage()
sys.exit(1)
2008-12-11 20:51:28 +03:00
if opts.interactive:
from getpass import getpass
import readline
import socket
def ask(prompt, default=None):
if default is not None:
print "%s [%s]: " % (prompt,default),
else:
print "%s: " % (prompt,),
return sys.stdin.readline().rstrip("\n") or default
2009-01-14 12:31:58 +03:00
try:
opts.realm = ask("Realm", socket.getfqdn().split(".", 1)[1].upper())
except IndexError:
print >>sys.stderr, "Cannot guess realm from %s" % ( socket.getfqdn())
sys.exit(1)
try:
opts.domain = ask("Domain", opts.realm.split(".")[0])
except IndexError:
print >>sys.stderr, "Cannot guess domain from %s" % ( opts.realm())
sys.exit(1)
2008-12-11 20:51:28 +03:00
opts.server_role = ask("Server Role (dc, member, standalone)", "dc")
for i in range(3):
opts.adminpass = getpass("Administrator password: ")
if not opts.adminpass:
print >>sys.stderr, "Invalid administrator password."
else:
break
2008-03-28 13:57:15 +03:00
lp = sambaopts.get_loadparm()
2008-12-21 18:39:17 +03:00
smbconf = lp.configfile
2008-02-21 03:22:20 +03:00
if opts.aci is not None:
print "set ACI: %s" % opts.aci
2008-03-07 02:57:52 +03:00
if opts.server_role == "dc":
server_role = "domain controller"
elif opts.server_role == "member":
server_role = "member server"
else:
server_role = opts.server_role
2008-03-28 13:57:15 +03:00
creds = credopts.get_credentials(lp)
2008-02-21 03:22:20 +03:00
2008-07-15 09:15:12 +04:00
creds.set_kerberos_state(DONT_USE_KERBEROS)
2008-02-21 03:22:20 +03:00
setup_dir = opts.setupdir
if setup_dir is None:
setup_dir = "setup"
samdb_fill = FILL_FULL
if opts.blank:
samdb_fill = FILL_NT4SYNC
elif opts.partitions_only:
samdb_fill = FILL_DRS
2008-12-21 09:34:27 +03:00
session = system_session()
Make Samba4 pass the NET-API-BECOMEDC test against Win2k3 (again).
To make Samba4, using the python provision system, pass this test
required some major rework. Untested code is broken code, and some of
the refactoring for a seperate provision test (which also now passes)
broke things.
Similarly, the iconv work has compiled, but these codepaths have never
been run (NULL pointer de-reference).
In working to use a local, rather than global, loadparm context, and
to support using a target directory, a few things needed to be
reworked, particularly around path handling.
Andrew Bartlett
(This used to be commit 1169e8d7bee20477b0efbfea3534ac63c83fb3d6)
2008-03-06 13:55:26 +03:00
provision(setup_dir, message,
2008-12-21 09:34:27 +03:00
session, creds, smbconf=smbconf, targetdir=opts.targetdir,
2008-03-07 02:57:52 +03:00
samdb_fill=samdb_fill, realm=opts.realm, domain=opts.domain,
2008-02-21 03:22:20 +03:00
domainguid=opts.domain_guid, domainsid=opts.domain_sid,
policyguid=opts.policy_guid, hostname=opts.host_name,
2008-04-02 05:03:03 +04:00
hostip=opts.host_ip, hostip6=opts.host_ip6,
2008-02-21 03:22:20 +03:00
invocationid=opts.invocationid, adminpass=opts.adminpass,
krbtgtpass=opts.krbtgtpass, machinepass=opts.machinepass,
dnspass=opts.dnspass, root=opts.root, nobody=opts.nobody,
nogroup=opts.nogroup, wheel=opts.wheel, users=opts.users,
2008-03-07 02:57:52 +03:00
aci=opts.aci, serverrole=server_role,
2008-02-21 03:22:20 +03:00
ldap_backend=opts.ldap_backend,
ldap_backend_type=opts.ldap_backend_type)