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 optparse
2008-12-11 20:51:28 +03:00
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
2009-02-11 20:44:57 +03:00
from samba.provision import provision, FILL_FULL, FILL_NT4SYNC, FILL_DRS, find_setup_dir
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)
2009-02-11 18:58:00 +03:00
parser.add_option("--interactive", help="Ask for names", action="store_true")
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)")
2009-08-14 03:37:50 +04:00
parser.add_option("--ldapadminpass", type="string", metavar="PASSWORD",
help="choose password to set between Samba and it's LDAP backend (otherwise random)")
2008-02-21 03:22:20 +03:00
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("--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")
2009-08-13 11:01:27 +04:00
parser.add_option("--ldap-backend-extra-port", type="int", metavar="LDAP-BACKEND-EXTRA-PORT",
help="Additional TCP port for LDAP backend server (to use for replication)")
2008-02-21 03:22:20 +03:00
parser.add_option("--ldap-backend-type", type="choice", metavar="LDAP-BACKEND-TYPE",
2009-08-13 11:01:27 +04:00
help="LDAP backend type (fedora-ds or openldap)",
2008-02-21 03:22:20 +03:00
choices=["fedora-ds", "openldap"])
2009-08-13 11:01:27 +04:00
parser.add_option("--ldap-backend-nosync", help="Configure LDAP backend not to call fsync() (for performance in test environments)", action="store_true")
2008-02-21 03:22:20 +03:00
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")
2009-08-13 11:01:27 +04:00
parser.add_option("--ol-mmr-urls", type="string", metavar="LDAPSERVER",
help="List of LDAP-URLS [ ldap://<FQHN>:<PORT>/ (where <PORT> has to be different than 389!) ] separated with whitespaces for use with OpenLDAP-MMR (Multi-Master-Replication)")
parser.add_option("--slapd-path", type="string", metavar="SLAPD-PATH",
help="Path to slapd for LDAP backend [e.g.:'/usr/local/libexec/slapd']. Required for Setup with LDAP-Backend. OpenLDAP Version >= 2.4.17 should be used.")
parser.add_option("--setup-ds-path", type="string", metavar="SETUP_DS-PATH",
help="Path to setup-ds.pl script for Fedora DS LDAP backend [e.g.:'/usr/sbin/setup-ds.pl']. Required for Setup with Fedora DS backend.")
parser.add_option("--nosync", help="Configure LDAP backend not to call fsync() (for performance in test environments)", action="store_true")
parser.add_option("--ldap-dryrun-mode", help="Configure LDAP backend, but do not run any binaries and exit early. Used only for the test environment. DO NOT USE", action="store_true")
2008-02-21 03:22:20 +03:00
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 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
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:
2009-01-19 23:14:37 +03:00
server_role = opts.server_role
2008-03-07 02:57:52 +03:00
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:
2009-02-11 20:44:57 +03:00
setup_dir = find_setup_dir()
2008-02-21 03:22:20 +03:00
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,
2009-08-13 11:01:27 +04:00
wheel=opts.wheel, users=opts.users,
serverrole=server_role,
ldap_backend_extra_port=opts.ldap_backend_extra_port,
ldap_backend_type=opts.ldap_backend_type,
2009-08-14 03:37:50 +04:00
ldapadminpass=opts.ldapadminpass,
2009-08-13 11:01:27 +04:00
ol_mmr_urls=opts.ol_mmr_urls,
slapd_path=opts.slapd_path,
setup_ds_path=opts.setup_ds_path,
nosync=opts.nosync,
ldap_dryrun_mode=opts.ldap_dryrun_mode)