svn commit: samba r25717 - in branches/4.0-python: .
source/lib/ldb/swig source/lib/ldb/tests/python
source/scripting/python/samba
jelmer at samba.org
jelmer at samba.org
Wed Oct 24 12:59:11 GMT 2007
Author: jelmer
Date: 2007-10-24 12:59:09 +0000 (Wed, 24 Oct 2007)
New Revision: 25717
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=25717
Log:
Fix ldif parsing.
Modified:
branches/4.0-python/
branches/4.0-python/source/lib/ldb/swig/ldb.i
branches/4.0-python/source/lib/ldb/tests/python/api.py
branches/4.0-python/source/scripting/python/samba/provision.py
Changeset:
Property changes on: branches/4.0-python
___________________________________________________________________
Name: bzr:revision-info
...skipped...
Name: bzr:revision-id:v3-trunk0
...skipped...
Modified: branches/4.0-python/source/lib/ldb/swig/ldb.i
===================================================================
--- branches/4.0-python/source/lib/ldb/swig/ldb.i 2007-10-24 12:59:04 UTC (rev 25716)
+++ branches/4.0-python/source/lib/ldb/swig/ldb.i 2007-10-24 12:59:09 UTC (rev 25717)
@@ -368,14 +368,6 @@
SWIG_NewPointerObj(ldif->msg, SWIGTYPE_p_ldb_message, 0));
}
}
-
-
- static PyObject *next_ldif_fragment(PyObject *self, PyObject *args)
- {
- struct ldb_context *ldb = PyCObject_AsVoidPtr(PyTuple_GetItem(self, 0));
- const char **s = PyCObject_AsVoidPtr(PyTuple_GetItem(self, 1));
- return ldb_ldif_to_pyobject(ldb_ldif_read_string(ldb, s));
- }
}
/*
@@ -449,20 +441,12 @@
PyObject *parse_ldif(const char *s)
{
- PyObject *selfobj, *callable;
- PyMethodDef md = {
- "next_ldif_fragment",
- next_ldif_fragment,
- METH_NOARGS,
- NULL
- };
-
- selfobj = Py_BuildValue("(OO)",
- PyCObject_FromVoidPtr($self, NULL),
- PyCObject_FromVoidPtr(&s, NULL));
- callable = PyCFunction_New(&md, selfobj);
-
- return PyCallIter_New(callable, Py_None);
+ PyObject *list = PyList_New(0);
+ struct ldb_ldif *ldif;
+ while ((ldif = ldb_ldif_read_string($self, &s)) != NULL) {
+ PyList_Append(list, ldb_ldif_to_pyobject(ldif));
+ }
+ return PyObject_GetIter(list);
}
#endif
}
Modified: branches/4.0-python/source/lib/ldb/tests/python/api.py
===================================================================
--- branches/4.0-python/source/lib/ldb/tests/python/api.py 2007-10-24 12:59:04 UTC (rev 25716)
+++ branches/4.0-python/source/lib/ldb/tests/python/api.py 2007-10-24 12:59:09 UTC (rev 25717)
@@ -239,6 +239,13 @@
self.assertEquals("foo=bar", str(msg[1].dn))
self.assertTrue(isinstance(msg[1], ldb.Message))
+ def test_parse_ldif_more(self):
+ msgs = self.ldb.parse_ldif("dn: foo=bar\n\n\ndn: bar=bar")
+ msg = msgs.next()
+ self.assertEquals("foo=bar", str(msg[1].dn))
+ msg = msgs.next()
+ self.assertEquals("bar=bar", str(msg[1].dn))
+
def test_canonical_string(self):
x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
self.assertEquals("/bloe/foo", x.canonical_str())
Modified: branches/4.0-python/source/scripting/python/samba/provision.py
===================================================================
--- branches/4.0-python/source/scripting/python/samba/provision.py 2007-10-24 12:59:04 UTC (rev 25716)
+++ branches/4.0-python/source/scripting/python/samba/provision.py 2007-10-24 12:59:09 UTC (rev 25717)
@@ -156,16 +156,16 @@
""" % (sid, subobj.domaindn, desc)
# deliberately ignore errors from this, as the records may
# already exist
- ldb.add(add)
+ for msg in ldb.parse_ldif(add):
+ ldb.add(msg[1])
#
# setup a mapping between a sam name and a unix name
#
def setup_name_mapping(subobj, ldb, sid, unixname):
- res = ldb.search(subobj.domaindn, SCOPE_SUBTREE, "objectSid=%s" % sid,
- ["dn"])
- if len(res) != 1:
- raise Error("Failed to find record for objectSid %s\n" % sid)
+ res = ldb.search(Dn(ldb, subobj.domaindn), SCOPE_SUBTREE,
+ "objectSid=%s" % sid, ["dn"])
+ assert len(res) == 1, "Failed to find record for objectSid %s" % sid
mod = """
dn: %s
@@ -173,7 +173,7 @@
replace: unixName
unixName: %s
""" % (res[0].dn, unixname)
- ldb.modify(mod)
+ ldb.modify(ldb.parse_ldif(mod).next()[1])
#
# return first host IP
@@ -194,7 +194,6 @@
print "Deleting %s\n" % ldb.filename
os.unlink(ldb.filename)
ldb.transaction_cancel()
- ldb.close()
ldb.connect(ldb.filename)
ldb.transaction_start()
@@ -287,15 +286,18 @@
data = open(src, 'r').read()
data = substitute_var(data, subobj.subst_vars())
- add_res = ldb.add(ldb.parse_ldif(data))
+ for msg in ldb.parse_ldif(data):
+ ldb.add(msg[1])
+
def setup_modify_ldif(setup_dir, ldif, subobj, ldb):
src = os.path.join(setup_dir, ldif)
data = open(src, 'r').read()
data = substitute_var(data, subobj.subst_vars())
- return ldb.modify(data)
+ for (changetype, msg) in ldb.parse_ldif(data):
+ return ldb.modify(msg)
def setup_ldb(setup_dir, ldif, session_info, credentials, subobj, dbname,
erase=True):
@@ -322,7 +324,8 @@
data = open(src, 'r').read()
data = substitute_var(data, subobj.subst_vars())
- return ldb.modify(data)
+ for (changetype, msg) in ldb.parse_ldif(data):
+ ldb.modify(msg)
#
# setup a file in the private dir
@@ -338,6 +341,7 @@
open(f, 'w').write(data)
+
def provision_default_paths(lp, subobj):
paths = ProvisionPaths()
private_dir = lp.get("private dir")
@@ -356,22 +360,23 @@
# setup reasonable name mappings for sam names to unix names
#
def setup_name_mappings(subobj, ldb):
- res = ldb.search(subobj.domaindn, SCOPE_BASE, "objectSid=*",
+ res = ldb.search(Dn(ldb, subobj.domaindn), SCOPE_BASE, "objectSid=*",
["objectSid"])
- assert(len(res) == 1 and res[0].objectSid is not None)
- sid = res[0]["objectSid"]
+ assert len(res) == 1
+ assert "objectSid" in res[0]
+ sid = list(res[0]["objectSid"])[0]
# add some foreign sids if they are not present already
- add_foreign(ldb, subobj, "S-1-5-7", "Anonymous")
- add_foreign(ldb, subobj, "S-1-1-0", "World")
- add_foreign(ldb, subobj, "S-1-5-2", "Network")
+ add_foreign(ldb, subobj, "S-1-5-7", "Anonymous")
+ add_foreign(ldb, subobj, "S-1-1-0", "World")
+ add_foreign(ldb, subobj, "S-1-5-2", "Network")
add_foreign(ldb, subobj, "S-1-5-18", "System")
add_foreign(ldb, subobj, "S-1-5-11", "Authenticated Users")
# some well known sids
- setup_name_mapping(subobj, ldb, "S-1-5-7", subobj.nobody)
- setup_name_mapping(subobj, ldb, "S-1-1-0", subobj.nogroup)
- setup_name_mapping(subobj, ldb, "S-1-5-2", subobj.nogroup)
+ setup_name_mapping(subobj, ldb, "S-1-5-7", subobj.nobody)
+ setup_name_mapping(subobj, ldb, "S-1-1-0", subobj.nogroup)
+ setup_name_mapping(subobj, ldb, "S-1-5-2", subobj.nogroup)
setup_name_mapping(subobj, ldb, "S-1-5-18", subobj.root)
setup_name_mapping(subobj, ldb, "S-1-5-11", subobj.users)
setup_name_mapping(subobj, ldb, "S-1-5-32-544", subobj.wheel)
@@ -388,7 +393,8 @@
setup_name_mapping(subobj, ldb, sid + "-520", subobj.wheel)
-def provision_become_dc(setup_dir, subobj, message, paths, session_info, credentials):
+def provision_become_dc(setup_dir, subobj, message, paths, session_info,
+ credentials):
subobj.fix(paths)
# Also wipes the database
@@ -420,14 +426,17 @@
samdb.transaction_commit()
message("Setting up %s" % paths.secrets)
- setup_ldb(setup_dir, "secrets_init.ldif", session_info, credentials, subobj, paths.secrets)
+ setup_ldb(setup_dir, "secrets_init.ldif", session_info, credentials,
+ subobj, paths.secrets)
- setup_ldb(setup_dir, "secrets.ldif", session_info, credentials, subobj, paths.secrets, False)
+ setup_ldb(setup_dir, "secrets.ldif", session_info, credentials, subobj,
+ paths.secrets, False)
#
# provision samba4 - caution, this wipes all existing data!
#
-def provision(lp, setup_dir, subobj, message, blank, paths, session_info, credentials, ldapbackend):
+def provision(lp, setup_dir, subobj, message, blank, paths, session_info,
+ credentials, ldapbackend):
subobj.fix(paths)
if subobj.domain_guid is not None:
@@ -507,7 +516,6 @@
# (hack) Reload, now we have the schema loaded.
samdb.transaction_commit()
- samdb.close()
samdb = open_ldb(session_info, credentials, paths.samdb)
samdb.transaction_start()
@@ -566,7 +574,7 @@
setup_name_mappings(subobj, samdb)
message("Setting up sam.ldb index")
- setup_add_ldif(setup_dir, "provision_index.ldif", info, samdb)
+ setup_add_ldif(setup_dir, "provision_index.ldif", subobj, samdb)
message("Setting up sam.ldb rootDSE marking as syncronized")
setup_modify_ldif(setup_dir, "provision_rootdse_modify.ldif", subobj, samdb)
@@ -585,13 +593,13 @@
# These values may have changed, due to an incoming SamSync,
# or may not have been specified, so fetch them from the database
- res = ldb.search(subobj.domaindn, SCOPE_BASE, "objectGUID=*",
+ res = ldb.search(Dn(ldb, subobj.domaindn), SCOPE_BASE, "objectGUID=*",
["objectGUID"])
assert(len(res) == 1)
assert(res[0]["objectGUID"] is not None)
subobj.domainguid = res[0]["objectGUID"]
- subobj.host_guid = searchone(ldb, subobj.domaindn, "(&(objectClass=computer)(cn=" + subobj.netbiosname + "))", "objectGUID")
+ subobj.host_guid = searchone(ldb, subobj.domaindn, "(&(objectClass=computer)(cn=%s))" % subobj.netbiosname, "objectGUID")
assert subobj.host_guid is not None
setup_file(setup_dir, "provision.zone", message, paths.dns, subobj)
More information about the samba-cvs
mailing list