1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-08 04:58:40 +03:00

r26596: Fixed upgrade.py.

Added blackbox tests for provision and upgrade Python scripts.
Clean up temporary files created by the Python tests.
(This used to be commit 2227fb6df62240cae64d27a1920d878316f819fc)
This commit is contained in:
Jelmer Vernooij 2007-12-25 16:36:44 -06:00 committed by Stefan Metzmacher
parent cea31e3216
commit 533cc583ed
11 changed files with 68 additions and 49 deletions

View File

@ -35,7 +35,12 @@ class HelperTests(unittest.TestCase):
class HiveTests(samba.tests.TestCaseInTempDir): class HiveTests(samba.tests.TestCaseInTempDir):
def setUp(self): def setUp(self):
super(HiveTests, self).setUp() super(HiveTests, self).setUp()
self.hive = registry.open_ldb(os.path.join(self.tempdir, "ldb_new.ldb")) self.hive_path = os.path.join(self.tempdir, "ldb_new.ldb")
self.hive = registry.open_ldb(self.hive_path)
def tearDown(self):
del self.hive
os.unlink(self.hive_path)
def test_ldb_new(self): def test_ldb_new(self):
self.assertTrue(self.hive is not None) self.assertTrue(self.hive is not None)

View File

@ -59,6 +59,8 @@ typedef struct loadparm_context {
bool is_myname(const char *name) { return lp_is_myname($self, name); } bool is_myname(const char *name) { return lp_is_myname($self, name); }
int use(struct param_context *param_ctx) { return param_use($self, param_ctx); } int use(struct param_context *param_ctx) { return param_use($self, param_ctx); }
bool set(const char *parm_name, const char *parm_value) { bool set(const char *parm_name, const char *parm_value) {
if (parm_value == NULL)
return false;
return lp_set_cmdline($self, parm_name, parm_value); return lp_set_cmdline($self, parm_name, parm_value);
} }

View File

@ -2643,6 +2643,8 @@ SWIGINTERN bool loadparm_context_is_mydomain(loadparm_context *self,char const *
SWIGINTERN bool loadparm_context_is_myname(loadparm_context *self,char const *name){ return lp_is_myname(self, name); } SWIGINTERN bool loadparm_context_is_myname(loadparm_context *self,char const *name){ return lp_is_myname(self, name); }
SWIGINTERN int loadparm_context_use(loadparm_context *self,struct param_context *param_ctx){ return param_use(self, param_ctx); } SWIGINTERN int loadparm_context_use(loadparm_context *self,struct param_context *param_ctx){ return param_use(self, param_ctx); }
SWIGINTERN bool loadparm_context_set(loadparm_context *self,char const *parm_name,char const *parm_value){ SWIGINTERN bool loadparm_context_set(loadparm_context *self,char const *parm_name,char const *parm_value){
if (parm_value == NULL)
return false;
return lp_set_cmdline(self, parm_name, parm_value); return lp_set_cmdline(self, parm_name, parm_value);
} }
SWIGINTERN PyObject *loadparm_context_get(loadparm_context *self,char const *param_name,char const *service_name){ SWIGINTERN PyObject *loadparm_context_get(loadparm_context *self,char const *param_name,char const *service_name){

View File

@ -164,9 +164,9 @@ class Ldb(ldb.Ldb):
self.add(msg) self.add(msg)
def modify_ldif(self, ldif): def modify_ldif(self, ldif):
for (changetype, msg) in ldb.parse_ldif(data): for (changetype, msg) in self.parse_ldif(ldif):
assert changetype == CHANGETYPE_MODIFY assert changetype == ldb.CHANGETYPE_MODIFY
ldb.modify(msg) self.modify(msg)
def substitute_var(text, values): def substitute_var(text, values):

View File

@ -95,7 +95,7 @@ def setup_add_ldif(ldb, ldif_path, subst_vars=None):
assert "${" not in data assert "${" not in data
ldb.load_ldif_add(data) ldb.add_ldif(data)
def setup_modify_ldif(ldb, ldif_path, substvars=None): def setup_modify_ldif(ldb, ldif_path, substvars=None):
@ -140,7 +140,7 @@ def setup_file(template, fname, substvars):
open(f, 'w').write(data) open(f, 'w').write(data)
def provision_default_paths(lp, dnsdomain): def provision_paths_from_lp(lp, dnsdomain):
"""Set the default paths for provisioning. """Set the default paths for provisioning.
:param lp: Loadparm context. :param lp: Loadparm context.
@ -605,7 +605,7 @@ def provision(lp, setup_dir, message, blank, paths, session_info,
realm = lp.get("realm") realm = lp.get("realm")
else: else:
if lp.get("realm").upper() != realm.upper(): if lp.get("realm").upper() != realm.upper():
raise Error("realm '%s' in smb.conf must match chosen realm '%s'\n" % raise Exception("realm '%s' in smb.conf must match chosen realm '%s'\n" %
(lp.get("realm"), realm)) (lp.get("realm"), realm))
assert realm is not None assert realm is not None

View File

@ -67,7 +67,12 @@ class SubstituteVarTestCase(unittest.TestCase):
class LdbExtensionTests(TestCaseInTempDir): class LdbExtensionTests(TestCaseInTempDir):
def test_searchone(self): def test_searchone(self):
l = samba.Ldb(self.tempdir + "/searchone.ldb") path = self.tempdir + "/searchone.ldb"
l.add({"dn": "foo=dc", "bar": "bla"}) l = samba.Ldb(path)
self.assertEquals("bla", l.searchone(ldb.Dn(l, "foo=dc"), "bar")) try:
l.add({"dn": "foo=dc", "bar": "bla"})
self.assertEquals("bla", l.searchone(ldb.Dn(l, "foo=dc"), "bar"))
finally:
del l
os.unlink(path)

View File

@ -29,10 +29,14 @@ def setup_path(file):
class ProvisionTestCase(samba.tests.TestCaseInTempDir): class ProvisionTestCase(samba.tests.TestCaseInTempDir):
def test_setup_secretsdb(self): def test_setup_secretsdb(self):
ldb = setup_secretsdb(os.path.join(self.tempdir, "secrets.ldb"), path = os.path.join(self.tempdir, "secrets.ldb")
setup_path, None, None, None) ldb = setup_secretsdb(path, setup_path, None, None, None)
self.assertEquals("LSA Secrets", try:
self.assertEquals("LSA Secrets",
ldb.searchone(Dn(ldb, "CN=LSA Secrets"), "CN")) ldb.searchone(Dn(ldb, "CN=LSA Secrets"), "CN"))
finally:
del ldb
os.unlink(path)
class Disabled: class Disabled:

View File

@ -8,7 +8,6 @@
"""Support code for upgrading from Samba 3 to Samba 4.""" """Support code for upgrading from Samba 3 to Samba 4."""
from provision import findnss, provision from provision import findnss, provision
import provision
import grp import grp
import pwd import pwd
import uuid import uuid
@ -255,7 +254,7 @@ maxVersion: %llu
return ldif return ldif
def upgrade_provision(samba3, setup_dir, message, credentials, session_info, paths): def upgrade_provision(samba3, setup_dir, message, credentials, session_info, lp, paths):
oldconf = samba3.get_conf() oldconf = samba3.get_conf()
if oldconf.get("domain logons") == "True": if oldconf.get("domain logons") == "True":
@ -266,7 +265,11 @@ def upgrade_provision(samba3, setup_dir, message, credentials, session_info, pat
else: else:
serverrole = "member server" serverrole = "member server"
lp.set("server role", serverrole)
domainname = oldconf.get("workgroup") domainname = oldconf.get("workgroup")
if domainname:
domainname = str(domainname)
lp.set("workgroup", domainname)
realm = oldconf.get("realm") realm = oldconf.get("realm")
netbiosname = oldconf.get("netbios name") netbiosname = oldconf.get("netbios name")
@ -279,18 +282,19 @@ def upgrade_provision(samba3, setup_dir, message, credentials, session_info, pat
if realm is None: if realm is None:
realm = domainname.lower() realm = domainname.lower()
message("No realm specified in smb.conf file, assuming '%s'\n" % realm) message("No realm specified in smb.conf file, assuming '%s'\n" % realm)
lp.set("realm", realm)
domainguid = secrets_db.get_domain_guid(domainname) domainguid = secrets_db.get_domain_guid(domainname)
domainsid = secrets_db.get_sid(domainsid) domainsid = secrets_db.get_sid(domainname)
if domainsid is None: if domainsid is None:
message("Can't find domain secrets for '%s'; using random SID\n" % domainname) message("Can't find domain secrets for '%s'; using random SID\n" % domainname)
if netbiosname is not None: if netbiosname is not None:
machinepass = secrets_db.get_machine_password(netbiosname) machinepass = secrets_db.get_machine_password(netbiosname)
else: else:
netbiosname = None machinepass = None
provision(lp, setup_dir, message, blank=True, paths=path, session_info=session_info, provision(lp=lp, setup_dir=setup_dir, message=message, blank=True, ldapbackend=None, paths=paths, session_info=session_info,
credentials=credentials, realm=realm, domain=domainname, credentials=credentials, realm=realm, domain=domainname,
domainsid=domainsid, domainguid=domainguid, machinepass=machinepass, serverrole=serverrole) domainsid=domainsid, domainguid=domainguid, machinepass=machinepass, serverrole=serverrole)
@ -500,18 +504,6 @@ data: %d
return ret return ret
def upgrade_verify(subobj, samba3, paths, message):
message("Verifying account policies")
samldb = Ldb(paths.samdb)
for account in samba3.samaccounts:
msg = samldb.search("(&(sAMAccountName=" + account.nt_username + ")(objectclass=user))")
assert(len(msg) >= 1)
# FIXME
def enable_samba3sam(samdb): def enable_samba3sam(samdb):
samdb.modify(""" samdb.modify("""

View File

@ -297,7 +297,11 @@ then
plantest "samba3.python" none PYTHONPATH=bin/python:scripting/python $PYTHON scripting/bin/subunitrun samba.tests.samba3 plantest "samba3.python" none PYTHONPATH=bin/python:scripting/python $PYTHON scripting/bin/subunitrun samba.tests.samba3
plantest "samba3sam.python" none PYTHONPATH=bin/python:scripting/python $PYTHON dsdb/samdb/ldb_modules/tests/samba3sam.py `pwd` $DATADIR/samba3/ plantest "samba3sam.python" none PYTHONPATH=bin/python:scripting/python $PYTHON dsdb/samdb/ldb_modules/tests/samba3sam.py `pwd` $DATADIR/samba3/
plantest "ldap.python" dc $PYTHON $samba4srcdir/lib/ldb/tests/python/ldap.py \$SERVER -U\$USERNAME%\$PASSWORD plantest "ldap.python" dc $PYTHON $samba4srcdir/lib/ldb/tests/python/ldap.py \$SERVER -U\$USERNAME%\$PASSWORD
plantest "blackbox.samba3dump" none $PYTHON scripting/bin/samba3dump $samba4srcdir/../testdata/samba3
rm -rf $PREFIX/upgrade rm -rf $PREFIX/upgrade
mkdir -p $PREFIX/upgrade mkdir -p $PREFIX/upgrade
plantest "blackbox.upgrade" none $PYTHON setup/upgrade.py $CONFIGURATION --verify --targetdir=$PREFIX ../testdata/samba3 ../testdata/samba3/smb.conf plantest "blackbox.upgrade" none $PYTHON setup/upgrade.py $CONFIGURATION --targetdir=$PREFIX ../testdata/samba3 ../testdata/samba3/smb.conf
rm -rf $PREFIX/provision
mkdir -p $PREFIX/provision
plantest "blackbox.provision.py" none $PYTHON ./setup/provision.py $CONFIGURATION --domain=FOO --realm=foo --targetdir=$PREFIX/provision
fi fi

View File

@ -21,7 +21,7 @@
import getopt import getopt
import optparse import optparse
import sys import os, sys
# Add path to the library for in-tree use # Add path to the library for in-tree use
sys.path.append("scripting/python") sys.path.append("scripting/python")
@ -32,7 +32,7 @@ from auth import system_session
import samba.getopt as options import samba.getopt as options
import param import param
from samba.provision import (provision, from samba.provision import (provision,
provision_default_paths, provision_ldapbase) provision_paths_from_lp, provision_ldapbase)
parser = optparse.OptionParser("provision [options]") parser = optparse.OptionParser("provision [options]")
parser.add_option_group(options.SambaOptions(parser)) parser.add_option_group(options.SambaOptions(parser))
@ -93,6 +93,8 @@ parser.add_option("--server-role", type="choice", metavar="ROLE",
help="Set server role to provision for (default standalone)") help="Set server role to provision for (default standalone)")
parser.add_option("--partitions-only", parser.add_option("--partitions-only",
help="Configure Samba's partitions, but do not modify them (ie, join a BDC)", action="store_true") 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] opts = parser.parse_args()[0]
@ -101,29 +103,29 @@ def message(text):
if not opts.quiet: if not opts.quiet:
print text print text
hostname = opts.host_name if opts.realm is None or opts.domain is None:
if opts.realm is None or opts.domain is None or opts.host_name is None:
if opts.realm is None: if opts.realm is None:
print >>sys.stderr, "No realm set" print >>sys.stderr, "No realm set"
if opts.domain is None: if opts.domain is None:
print >>sys.stderr, "No domain set" print >>sys.stderr, "No domain set"
if opts.host_name is None:
print >>sys.stderr, "No host name set"
parser.print_usage() parser.print_usage()
sys.exit(1) sys.exit(1)
# cope with an initially blank smb.conf # cope with an initially blank smb.conf
lp = param.LoadParm() lp = param.LoadParm()
lp.load(opts.configfile) if opts.configfile:
lp.load(opts.configfile)
if opts.targetdir is not None:
lp.set("private dir", os.path.abspath(opts.targetdir))
lp.set("lock dir", os.path.abspath(opts.targetdir))
lp.set("realm", opts.realm) lp.set("realm", opts.realm)
lp.set("workgroup", opts.domain) lp.set("workgroup", opts.domain)
lp.set("server role", opts.server_role) lp.set("server role", opts.server_role or "domain controller")
if opts.aci is not None: if opts.aci is not None:
print "set ACI: %s" % opts.aci print "set ACI: %s" % opts.aci
paths = provision_default_paths(lp, opts.realm.lower()) paths = provision_paths_from_lp(lp, opts.realm.lower())
paths.smbconf = opts.configfile paths.smbconf = opts.configfile
if opts.ldap_backend: if opts.ldap_backend:

View File

@ -11,7 +11,7 @@ sys.path.append("scripting/python")
import param import param
import samba import samba
import samba.getopt as options import samba.getopt as options
from samba.provision import provision_default_paths from auth import system_session
parser = optparse.OptionParser("upgrade [options] <libdir> <smbconf>") parser = optparse.OptionParser("upgrade [options] <libdir> <smbconf>")
parser.add_option_group(options.SambaOptions(parser)) parser.add_option_group(options.SambaOptions(parser))
@ -22,7 +22,6 @@ parser.add_option("--setupdir", type="string", metavar="DIR",
help="directory with setup files") help="directory with setup files")
parser.add_option("--realm", type="string", metavar="REALM", help="set realm") parser.add_option("--realm", type="string", metavar="REALM", help="set realm")
parser.add_option("--quiet", help="Be quiet") parser.add_option("--quiet", help="Be quiet")
parser.add_option("--verify", help="Verify resulting configuration")
parser.add_option("--blank", parser.add_option("--blank",
help="do not add users or groups, just the structure") help="do not add users or groups, just the structure")
parser.add_option("--targetdir", type="string", metavar="DIR", parser.add_option("--targetdir", type="string", metavar="DIR",
@ -51,6 +50,7 @@ else:
samba3 = Samba3(libdir, smbconf) samba3 = Samba3(libdir, smbconf)
from samba.upgrade import upgrade_provision from samba.upgrade import upgrade_provision
from samba.provision import provision_paths_from_lp
message("Provisioning\n") message("Provisioning\n")
@ -60,9 +60,12 @@ if setup_dir is None:
creds = credopts.get_credentials() creds = credopts.get_credentials()
lp = param.LoadParm() lp = param.LoadParm()
lp.load(opts.configfile) if opts.configfile:
upgrade_provision(samba3, setup_dir, message, credentials=creds, session_info=system_session()) lp.load(opts.configfile)
if opts.targetdir is not None:
if opts.verify: lp.set("private dir", os.path.abspath(opts.targetdir))
message("Verifying...\n") lp.set("lock dir", os.path.abspath(opts.targetdir))
ret = upgrade_verify(subobj, samba3, paths, message) paths = provision_paths_from_lp(lp, "")
paths.smbconf = opts.configfile
upgrade_provision(samba3, setup_dir, message, credentials=creds, session_info=system_session(),
lp=lp, paths=paths)