[SCM] Samba Shared Repository - branch master updated
Matthieu Patou
mat at samba.org
Sun Sep 5 02:52:24 MDT 2010
The branch, master has been updated
via 4932157 upgradeprovision: avoid working with None objects ...
via b153558 upgradeprovision: do not try to remove/change attribute before the RID Set object is present
via 13d575d upgradeprovision: cleanup
via 1d08152 s4 upgradeprovision: add dns_update_list if missing
via e2d575e python-ldb: allow ldb_rename to take optional control(s)
via 42dfa71 dsdb: make the ATTRIBUTE NOT FOUND more clear
from e4d1bdb s4/selftest: Fix path to include/config.h, set BUILDDIR automatically.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 49321571ea592be2307eef101cc783f883aa2503
Author: Matthieu Patou <mat at matws.net>
Date: Sun Sep 5 03:00:05 2010 +0400
upgradeprovision: avoid working with None objects ...
commit b1535582100a551cedc245f12cf63a1340985bdd
Author: Matthieu Patou <mat at matws.net>
Date: Sun Sep 5 02:59:20 2010 +0400
upgradeprovision: do not try to remove/change attribute before the RID Set object is present
commit 13d575d6e320961153d7071bc4f9b5cccdfb71b6
Author: Matthieu Patou <mat at matws.net>
Date: Sun Sep 5 02:58:31 2010 +0400
upgradeprovision: cleanup
commit 1d0815281e41cb1ca2cf72a3dba28a9ca75fb65d
Author: Matthieu Patou <mat at matws.net>
Date: Sat Aug 14 20:44:35 2010 +0400
s4 upgradeprovision: add dns_update_list if missing
commit e2d575ee8099bb31e3bc926cf6730a3ca77e69ef
Author: Matthieu Patou <mat at matws.net>
Date: Sun Sep 5 02:57:16 2010 +0400
python-ldb: allow ldb_rename to take optional control(s)
commit 42dfa71ef5d08b500e911e2ba54dba0b1b4a4599
Author: Matthieu Patou <mat at matws.net>
Date: Sun Sep 5 02:56:30 2010 +0400
dsdb: make the ATTRIBUTE NOT FOUND more clear
-----------------------------------------------------------------------
Summary of changes:
source4/dsdb/common/util.c | 2 +
source4/dsdb/samdb/ldb_modules/objectclass.c | 3 +
source4/lib/ldb/pyldb.c | 54 +++++++++++++++++++++--
source4/scripting/bin/upgradeprovision | 61 ++++++++++++++++++-------
4 files changed, 99 insertions(+), 21 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source4/dsdb/common/util.c b/source4/dsdb/common/util.c
index fc117b9..c409adb 100644
--- a/source4/dsdb/common/util.c
+++ b/source4/dsdb/common/util.c
@@ -1644,6 +1644,8 @@ int samdb_reference_dn(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, struct ldb_
*dn = ldb_msg_find_attr_as_dn(ldb, mem_ctx, res->msgs[0], attribute);
if (!*dn) {
talloc_free(res);
+ ldb_asprintf_errstring(ldb, "Cannot find dn of attribute %s of %s", attribute,
+ ldb_dn_get_linearized(base));
return LDB_ERR_NO_SUCH_ATTRIBUTE;
}
diff --git a/source4/dsdb/samdb/ldb_modules/objectclass.c b/source4/dsdb/samdb/ldb_modules/objectclass.c
index cd45963..005f0f2 100644
--- a/source4/dsdb/samdb/ldb_modules/objectclass.c
+++ b/source4/dsdb/samdb/ldb_modules/objectclass.c
@@ -1005,6 +1005,9 @@ static int objectclass_do_mod(struct oc_context *ac)
}
if (!found) {
/* we cannot delete a not existing object class */
+ ldb_asprintf_errstring(ldb, "Cannot delete this %.*s ",
+ (int)oc_el_change->values[i].length, (const char *)oc_el_change->values[i].data);
+
talloc_free(mem_ctx);
return LDB_ERR_NO_SUCH_ATTRIBUTE;
}
diff --git a/source4/lib/ldb/pyldb.c b/source4/lib/ldb/pyldb.c
index f1b73a9..b60f4fc 100644
--- a/source4/lib/ldb/pyldb.c
+++ b/source4/lib/ldb/pyldb.c
@@ -898,18 +898,33 @@ static PyObject *py_ldb_rename(PyLdbObject *self, PyObject *args)
int ret;
struct ldb_context *ldb;
TALLOC_CTX *mem_ctx;
+ PyObject *py_controls = Py_None;
+ struct ldb_control **parsed_controls;
+ struct ldb_context *ldb_ctx;
+ struct ldb_request *req;
- if (!PyArg_ParseTuple(args, "OO", &py_dn1, &py_dn2))
+ ldb_ctx = PyLdb_AsLdbContext(self);
+
+ if (!PyArg_ParseTuple(args, "OO|O", &py_dn1, &py_dn2, &py_controls))
return NULL;
+
mem_ctx = talloc_new(NULL);
if (mem_ctx == NULL) {
PyErr_NoMemory();
return NULL;
}
-
ldb = PyLdb_AsLdbContext(self);
+ if (py_controls == Py_None) {
+ parsed_controls = NULL;
+ } else {
+ const char **controls = PyList_AsStringList(mem_ctx, py_controls, "controls");
+ parsed_controls = ldb_parse_control_strings(ldb_ctx, mem_ctx, controls);
+ talloc_free(controls);
+ }
+
+
if (!PyObject_AsDn(mem_ctx, py_dn1, ldb, &dn1)) {
talloc_free(mem_ctx);
return NULL;
@@ -920,9 +935,40 @@ static PyObject *py_ldb_rename(PyLdbObject *self, PyObject *args)
return NULL;
}
- ret = ldb_rename(ldb, dn1, dn2);
+ ret = ldb_build_rename_req(&req, ldb_ctx, mem_ctx, dn1, dn2, parsed_controls,
+ NULL, ldb_op_default_callback, NULL);
+ if (ret != LDB_SUCCESS) {
+ PyErr_SetString(PyExc_TypeError, "failed to build request");
+ talloc_free(mem_ctx);
+ return NULL;
+ }
+
+ /* do request and autostart a transaction */
+ /* Then let's LDB handle the message error in case of pb as they are meaningful */
+
+ ret = ldb_transaction_start(ldb_ctx);
+ if (ret != LDB_SUCCESS) {
+ talloc_free(mem_ctx);
+ PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb_ctx);
+ }
+
+ ret = ldb_request(ldb_ctx, req);
+ if (ret == LDB_SUCCESS) {
+ ret = ldb_wait(req->handle, LDB_WAIT_ALL);
+ }
+
+ if (ret == LDB_SUCCESS) {
+ ret = ldb_transaction_commit(ldb_ctx);
+ } else {
+ ldb_transaction_cancel(ldb_ctx);
+ if (ldb_ctx->err_string == NULL) {
+ /* no error string was setup by the backend */
+ ldb_asprintf_errstring(ldb_ctx, "%s (%d)", ldb_strerror(ret), ret);
+ }
+ }
+
talloc_free(mem_ctx);
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb);
+ PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb_ctx);
Py_RETURN_NONE;
}
diff --git a/source4/scripting/bin/upgradeprovision b/source4/scripting/bin/upgradeprovision
index 90586de..6697c82 100755
--- a/source4/scripting/bin/upgradeprovision
+++ b/source4/scripting/bin/upgradeprovision
@@ -197,6 +197,7 @@ def check_for_DNS(refprivate, private):
provision"""
spnfile = "%s/spn_update_list" % private
+ dnsfile = "%s/dns_update_list" % private
namedfile = lp.get("dnsupdate:path")
if not namedfile:
@@ -205,6 +206,9 @@ def check_for_DNS(refprivate, private):
if not os.path.exists(spnfile):
shutil.copy("%s/spn_update_list" % refprivate, "%s" % spnfile)
+ if not os.path.exists(dnsfile):
+ shutil.copy("%s/dns_update_list" % refprivate, "%s" % dnsfile)
+
destdir = "%s/new_dns" % private
dnsdir = "%s/dns" % private
@@ -452,7 +456,6 @@ def handle_special_add(samdb, dn, names):
#This entry was misplaced lets remove it if it exists
dntoremove = "CN=Certificate Service DCOM Access,"\
"CN=Users, %s" % names.rootdn
- print dntoremove
objDn = Dn(samdb, "CN=Cryptographic Operators, CN=Builtin, %s" % names.rootdn)
if dn == objDn:
@@ -475,14 +478,27 @@ def handle_special_add(samdb, dn, names):
base=str(names.rootdn),
scope=SCOPE_SUBTREE, attrs=["dn"],
controls=["search_options:1:2"])
- if len(res) > 0:
+
+ res2 = samdb.search(expression="(dn=%s)" % dn,
+ base=str(names.rootdn),
+ scope=SCOPE_SUBTREE, attrs=["dn"],
+ controls=["search_options:1:2"])
+
+ if len(res) > 0 and len(res2) == 0:
message(CHANGE, "Existing object %s must be replaced by %s,"
"Renaming old object" % (str(oldDn), str(dn)))
- samdb.rename(oldDn, objDn)
+ samdb.rename(oldDn, objDn, ["relax:0"])
- return 1
+ return 0
if dntoremove is not None:
+ res = samdb.search(expression="(cn=RID Set)",
+ base=str(names.rootdn),
+ scope=SCOPE_SUBTREE, attrs=["dn"],
+ controls=["search_options:1:2"])
+
+ if len(res) == 0:
+ return 2
res = samdb.search(expression="(dn=%s)" % dntoremove,
base=str(names.rootdn),
scope=SCOPE_SUBTREE, attrs=["dn"],
@@ -491,7 +507,9 @@ def handle_special_add(samdb, dn, names):
message(CHANGE, "Existing object %s must be replaced by %s,"
"removing old object" % (dntoremove, str(dn)))
samdb.delete(res[0]["dn"])
- return 0
+ return 0
+
+ return 1
def check_dn_nottobecreated(hash, index, listdn):
@@ -538,8 +556,15 @@ def add_missing_object(ref_samdb, samdb, dn, names, basedn, hash, index):
:param index: Current creation order
:return: True if the object was created False otherwise"""
- if handle_special_add(samdb, dn, names):
- return
+ ret = handle_special_add(samdb, dn, names)
+
+ if ret == 2:
+ return False
+
+ if ret == 0:
+ return True
+
+
reference = ref_samdb.search(expression="dn=%s" % (str(dn)), base=basedn,
scope=SCOPE_SUBTREE, controls=["search_options:1:2"])
empty = Message()
@@ -683,8 +708,9 @@ def add_missing_entries(ref_samdb, samdb, names, basedn, list):
# DN can't be created because it depends on some
# other DN in the list
listDefered.append(dn)
+
if len(listDefered) != 0:
- raise ProvisioningError("Unable to insert missing elements:" \
+ raise ProvisioningError("Unable to insert missing elements:"
"circular references")
def handle_links(samdb, att, basedn, dn, value, ref_value, delta):
@@ -1631,15 +1657,16 @@ if __name__ == '__main__':
doit = False
if deltaattr is not None and len(deltaattr) > 1:
doit = True
- deltaattr.remove("dn")
- for att in deltaattr:
- if att.lower() == "dn":
- continue
- if deltaattr.get(att) is not None \
- and deltaattr.get(att).flags() != FLAG_MOD_ADD:
- doit = False
- elif deltaattr.get(att) is None:
- doit = False
+ if doit:
+ deltaattr.remove("dn")
+ for att in deltaattr:
+ if att.lower() == "dn":
+ continue
+ if deltaattr.get(att) is not None \
+ and deltaattr.get(att).flags() != FLAG_MOD_ADD:
+ doit = False
+ elif deltaattr.get(att) is None:
+ doit = False
if doit:
message(CHANGE, "Applying delta to @ATTRIBUTES")
deltaattr.dn = ldb.Dn(basesam, "@ATTRIBUTES")
--
Samba Shared Repository
More information about the samba-cvs
mailing list