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:
parent
cea31e3216
commit
533cc583ed
@ -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)
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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){
|
||||||
|
@ -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):
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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("""
|
||||||
|
@ -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
|
||||||
|
@ -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:
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user