summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/dsdb/config.mk2
-rw-r--r--source4/dsdb/pydsdb.c49
-rw-r--r--source4/dsdb/wscript_build2
-rwxr-xr-xsource4/lib/ldb/tests/python/urgent_replication.py56
-rw-r--r--source4/scripting/python/pyglue.c48
-rw-r--r--source4/scripting/python/samba/samdb.py3
6 files changed, 82 insertions, 78 deletions
diff --git a/source4/dsdb/config.mk b/source4/dsdb/config.mk
index 69b7227d62..2bd19e987d 100644
--- a/source4/dsdb/config.mk
+++ b/source4/dsdb/config.mk
@@ -109,6 +109,6 @@ DNS_UPDATE_SRV_OBJ_FILES = $(addprefix $(dsdbsrcdir)/dns/, \
[PYTHON::python_dsdb]
LIBRARY_REALNAME = samba/dsdb.$(SHLIBEXT)
-PRIVATE_DEPENDENCIES = SAMDB
+PRIVATE_DEPENDENCIES = SAMDB pyldb
python_dsdb_OBJ_FILES = $(dsdbsrcdir)/pydsdb.o
diff --git a/source4/dsdb/pydsdb.c b/source4/dsdb/pydsdb.c
index cc75472a45..1d71c6b7de 100644
--- a/source4/dsdb/pydsdb.c
+++ b/source4/dsdb/pydsdb.c
@@ -251,6 +251,52 @@ static PyObject *py_dsdb_set_global_schema(PyObject *self, PyObject *args)
Py_RETURN_NONE;
}
+static PyObject *py_dsdb_load_partition_usn(PyObject *self, PyObject *args)
+{
+ PyObject *py_dn, *py_ldb, *result;
+ struct ldb_dn *dn;
+ uint64_t highest_uSN, urgent_uSN;
+ struct ldb_context *ldb;
+ TALLOC_CTX *mem_ctx;
+ int ret;
+
+ mem_ctx = talloc_new(NULL);
+ if (mem_ctx == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ if (!PyArg_ParseTuple(args, "OO", &py_ldb, &py_dn)) {
+ talloc_free(mem_ctx);
+ return NULL;
+ }
+
+ PyErr_LDB_OR_RAISE(py_ldb, ldb);
+
+ if (!PyObject_AsDn(mem_ctx, py_dn, ldb, &dn)) {
+ talloc_free(mem_ctx);
+ return NULL;
+ }
+
+ ret = dsdb_load_partition_usn(ldb, dn, &highest_uSN, &urgent_uSN);
+ if (ret != LDB_SUCCESS) {
+ char *errstr = talloc_asprintf(mem_ctx, "Failed to load partition uSN - %s", ldb_errstring(ldb));
+ PyErr_SetString(PyExc_RuntimeError, errstr);
+ talloc_free(mem_ctx);
+ return NULL;
+ }
+
+ talloc_free(mem_ctx);
+
+ result = PyDict_New();
+
+ PyDict_SetItemString(result, "uSNHighest", PyInt_FromLong((uint64_t)highest_uSN));
+ PyDict_SetItemString(result, "uSNUrgent", PyInt_FromLong((uint64_t)urgent_uSN));
+
+
+ return result;
+}
+
static PyMethodDef py_dsdb_methods[] = {
{ "samdb_server_site_name", (PyCFunction)py_samdb_server_site_name,
METH_VARARGS, "Get the server site name as a string"},
@@ -275,6 +321,9 @@ static PyMethodDef py_dsdb_methods[] = {
METH_VARARGS, "get the NTDS objectGUID as a string"},
{ "dsdb_set_global_schema", (PyCFunction)py_dsdb_set_global_schema,
METH_VARARGS, NULL },
+ { "dsdb_load_partition_usn", (PyCFunction)py_dsdb_load_partition_usn,
+ METH_VARARGS,
+ "get uSNHighest and uSNUrgent from the partition @REPLCHANGED"},
{ NULL }
};
diff --git a/source4/dsdb/wscript_build b/source4/dsdb/wscript_build
index 581c8ef4d0..59672e03df 100644
--- a/source4/dsdb/wscript_build
+++ b/source4/dsdb/wscript_build
@@ -51,6 +51,6 @@ bld.SAMBA_MODULE('DNS_UPDATE_SRV',
bld.SAMBA_PYTHON('python_dsdb',
source='pydsdb.c',
- deps='SAMDB',
+ deps='SAMDB pyldb',
realname='samba/dsdb.so'
)
diff --git a/source4/lib/ldb/tests/python/urgent_replication.py b/source4/lib/ldb/tests/python/urgent_replication.py
index 97b06fbb9a..0a8fd7d539 100755
--- a/source4/lib/ldb/tests/python/urgent_replication.py
+++ b/source4/lib/ldb/tests/python/urgent_replication.py
@@ -14,8 +14,7 @@ import samba.getopt as options
from samba.auth import system_session
from ldb import (SCOPE_BASE, LdbError, ERR_NO_SUCH_OBJECT, Message,
MessageElement, Dn, FLAG_MOD_REPLACE)
-from samba import Ldb
-from samba import _glue
+from samba.samdb import SamDB
from subunit.run import SubunitTestRunner
import unittest
@@ -68,7 +67,7 @@ class UrgentReplicationTests(unittest.TestCase):
"description":"nonurgenttest description"});
# urgent replication should not be enabled when creating
- res = _glue.dsdb_load_partition_usn(self.ldb, self.base_dn)
+ res = self.ldb.load_partition_usn(self.base_dn)
self.assertNotEquals(res["uSNHighest"], res["uSNUrgent"]);
# urgent replication should not be enabled when modifying
@@ -77,12 +76,12 @@ class UrgentReplicationTests(unittest.TestCase):
m["description"] = MessageElement("new description", FLAG_MOD_REPLACE,
"description")
ldb.modify(m)
- res = _glue.dsdb_load_partition_usn(self.ldb, self.base_dn)
+ res = self.ldb.load_partition_usn(self.base_dn)
self.assertNotEquals(res["uSNHighest"], res["uSNUrgent"]);
# urgent replication should not be enabled when deleting
self.delete_force(self.ldb, "cn=nonurgenttest,cn=users," + self.base_dn)
- res = _glue.dsdb_load_partition_usn(self.ldb, self.base_dn)
+ res = self.ldb.load_partition_usn(self.base_dn)
self.assertNotEquals(res["uSNHighest"], res["uSNUrgent"]);
@@ -105,7 +104,7 @@ instanceType: 4
systemFlags: 33554432""", ["relax:0"]);
# urgent replication should be enabled when creation
- res = _glue.dsdb_load_partition_usn(self.ldb, "cn=Configuration," + self.base_dn)
+ res = self.ldb.load_partition_usn("cn=Configuration," + self.base_dn)
self.assertEquals(res["uSNHighest"], res["uSNUrgent"]);
# urgent replication should NOT be enabled when modifying
@@ -114,12 +113,12 @@ systemFlags: 33554432""", ["relax:0"]);
m["options"] = MessageElement("0", FLAG_MOD_REPLACE,
"options")
ldb.modify(m)
- res = _glue.dsdb_load_partition_usn(self.ldb, "cn=Configuration," + self.base_dn)
+ res = self.ldb.load_partition_usn("cn=Configuration," + self.base_dn)
self.assertNotEquals(res["uSNHighest"], res["uSNUrgent"]);
# urgent replication should be enabled when deleting
self.delete_force(self.ldb, "cn=NTDS Settings test,cn=test server,cn=Servers,cn=Default-First-Site-Name,cn=Sites,cn=Configuration," + self.base_dn)
- res = _glue.dsdb_load_partition_usn(self.ldb, "cn=Configuration," + self.base_dn)
+ res = self.ldb.load_partition_usn("cn=Configuration," + self.base_dn)
self.assertEquals(res["uSNHighest"], res["uSNUrgent"]);
self.delete_force(self.ldb, "cn=test server,cn=Servers,cn=Default-First-Site-Name,cn=Sites,cn=Configuration," + self.base_dn)
@@ -139,7 +138,7 @@ systemFlags: 33554432""", ["relax:0"]);
"systemFlags": "1"});
# urgent replication should be enabled when creating
- res = _glue.dsdb_load_partition_usn(self.ldb, "cn=Configuration," + self.base_dn)
+ res = self.ldb.load_partition_usn("cn=Configuration," + self.base_dn)
self.assertEquals(res["uSNHighest"], res["uSNUrgent"]);
# urgent replication should NOT be enabled when modifying
@@ -148,13 +147,13 @@ systemFlags: 33554432""", ["relax:0"]);
m["systemFlags"] = MessageElement("0", FLAG_MOD_REPLACE,
"systemFlags")
ldb.modify(m)
- res = _glue.dsdb_load_partition_usn(self.ldb, "cn=Configuration," + self.base_dn)
+ res = self.ldb.load_partition_usn("cn=Configuration," + self.base_dn)
self.assertNotEquals(res["uSNHighest"], res["uSNUrgent"]);
# urgent replication should be enabled when deleting
self.delete_force(self.ldb, "cn=test crossRef,CN=Partitions,CN=Configuration," + self.base_dn)
- res = _glue.dsdb_load_partition_usn(self.ldb, "cn=Configuration," + self.base_dn)
+ res = self.ldb.load_partition_usn("cn=Configuration," + self.base_dn)
self.assertEquals(res["uSNHighest"], res["uSNUrgent"]);
@@ -183,7 +182,7 @@ name: test attributeSchema
systemFlags: 0""", ["relax:0"]);
# urgent replication should be enabled when creating
- res = _glue.dsdb_load_partition_usn(self.ldb, "cn=Schema,cn=Configuration," + self.base_dn)
+ res = self.ldb.load_partition_usn("cn=Schema,cn=Configuration," + self.base_dn)
self.assertEquals(res["uSNHighest"], res["uSNUrgent"]);
except LdbError:
@@ -195,7 +194,7 @@ systemFlags: 0""", ["relax:0"]);
m["lDAPDisplayName"] = MessageElement("updated test attributeSchema", FLAG_MOD_REPLACE,
"lDAPDisplayName")
ldb.modify(m)
- res = _glue.dsdb_load_partition_usn(self.ldb, "cn=Schema,cn=Configuration," + self.base_dn)
+ res = self.ldb.load_partition_usn("cn=Schema,cn=Configuration," + self.base_dn)
self.assertEquals(res["uSNHighest"], res["uSNUrgent"]);
@@ -226,7 +225,7 @@ systemFlags: 16
defaultHidingValue: TRUE""", ["relax:0"]);
# urgent replication should be enabled when creating
- res = _glue.dsdb_load_partition_usn(self.ldb, "cn=Schema,cn=Configuration," + self.base_dn)
+ res = self.ldb.load_partition_usn("cn=Schema,cn=Configuration," + self.base_dn)
self.assertEquals(res["uSNHighest"], res["uSNUrgent"]);
except LdbError:
@@ -238,7 +237,7 @@ defaultHidingValue: TRUE""", ["relax:0"]);
m["lDAPDisplayName"] = MessageElement("updated test classSchema", FLAG_MOD_REPLACE,
"lDAPDisplayName")
ldb.modify(m)
- res = _glue.dsdb_load_partition_usn(self.ldb, "cn=Schema,cn=Configuration," + self.base_dn)
+ res = self.ldb.load_partition_usn("cn=Schema,cn=Configuration," + self.base_dn)
self.assertEquals(res["uSNHighest"], res["uSNUrgent"]);
@@ -255,7 +254,7 @@ defaultHidingValue: TRUE""", ["relax:0"]);
# urgent replication should be enabled when creating
- res = _glue.dsdb_load_partition_usn(self.ldb, self.base_dn)
+ res = self.ldb.load_partition_usn(self.base_dn)
self.assertEquals(res["uSNHighest"], res["uSNUrgent"]);
# urgent replication should be enabled when modifying
@@ -264,12 +263,12 @@ defaultHidingValue: TRUE""", ["relax:0"]);
m["currentValue"] = MessageElement("yyyyyyyy", FLAG_MOD_REPLACE,
"currentValue")
ldb.modify(m)
- res = _glue.dsdb_load_partition_usn(self.ldb, self.base_dn)
+ res = self.ldb.load_partition_usn(self.base_dn)
self.assertEquals(res["uSNHighest"], res["uSNUrgent"]);
# urgent replication should NOT be enabled when deleting
self.delete_force(self.ldb, "cn=test secret,cn=System," + self.base_dn)
- res = _glue.dsdb_load_partition_usn(self.ldb, self.base_dn)
+ res = self.ldb.load_partition_usn(self.base_dn)
self.assertNotEquals(res["uSNHighest"], res["uSNUrgent"]);
@@ -288,7 +287,7 @@ isCriticalSystemObject: TRUE
rIDAvailablePool: 133001-1073741823""", ["relax:0"])
# urgent replication should be enabled when creating
- res = _glue.dsdb_load_partition_usn(self.ldb, self.base_dn)
+ res = self.ldb.load_partition_usn(self.base_dn)
self.assertEquals(res["uSNHighest"], res["uSNUrgent"]);
# urgent replication should be enabled when modifying
@@ -297,12 +296,12 @@ rIDAvailablePool: 133001-1073741823""", ["relax:0"])
m["systemFlags"] = MessageElement("0", FLAG_MOD_REPLACE,
"systemFlags")
ldb.modify(m)
- res = _glue.dsdb_load_partition_usn(self.ldb, self.base_dn)
+ res = self.ldb.load_partition_usn(self.base_dn)
self.assertEquals(res["uSNHighest"], res["uSNUrgent"]);
# urgent replication should NOT be enabled when deleting
self.delete_force(self.ldb, "CN=RID Manager test,CN=System," + self.base_dn)
- res = _glue.dsdb_load_partition_usn(self.ldb, self.base_dn)
+ res = self.ldb.load_partition_usn(self.base_dn)
self.assertNotEquals(res["uSNHighest"], res["uSNUrgent"]);
@@ -320,7 +319,7 @@ rIDAvailablePool: 133001-1073741823""", ["relax:0"])
"description":"urgent attributes test description"});
# urgent replication should NOT be enabled when creating
- res = _glue.dsdb_load_partition_usn(self.ldb, self.base_dn)
+ res = self.ldb.load_partition_usn(self.base_dn)
self.assertNotEquals(res["uSNHighest"], res["uSNUrgent"]);
# urgent replication should be enabled when modifying userAccountControl
@@ -329,7 +328,7 @@ rIDAvailablePool: 133001-1073741823""", ["relax:0"])
m["userAccountControl"] = MessageElement("0", FLAG_MOD_REPLACE,
"userAccountControl")
ldb.modify(m)
- res = _glue.dsdb_load_partition_usn(self.ldb, self.base_dn)
+ res = self.ldb.load_partition_usn(self.base_dn)
self.assertEquals(res["uSNHighest"], res["uSNUrgent"]);
# urgent replication should be enabled when modifying lockoutTime
@@ -338,7 +337,7 @@ rIDAvailablePool: 133001-1073741823""", ["relax:0"])
m["lockoutTime"] = MessageElement("1", FLAG_MOD_REPLACE,
"lockoutTime")
ldb.modify(m)
- res = _glue.dsdb_load_partition_usn(self.ldb, self.base_dn)
+ res = self.ldb.load_partition_usn(self.base_dn)
self.assertEquals(res["uSNHighest"], res["uSNUrgent"]);
# urgent replication should be enabled when modifying pwdLastSet
@@ -347,7 +346,7 @@ rIDAvailablePool: 133001-1073741823""", ["relax:0"])
m["pwdLastSet"] = MessageElement("1", FLAG_MOD_REPLACE,
"pwdLastSet")
ldb.modify(m)
- res = _glue.dsdb_load_partition_usn(self.ldb, self.base_dn)
+ res = self.ldb.load_partition_usn(self.base_dn)
self.assertEquals(res["uSNHighest"], res["uSNUrgent"]);
# urgent replication should NOT be enabled when modifying a not-urgent
@@ -357,12 +356,12 @@ rIDAvailablePool: 133001-1073741823""", ["relax:0"])
m["description"] = MessageElement("updated urgent attributes test description",
FLAG_MOD_REPLACE, "description")
ldb.modify(m)
- res = _glue.dsdb_load_partition_usn(self.ldb, self.base_dn)
+ res = self.ldb.load_partition_usn(self.base_dn)
self.assertNotEquals(res["uSNHighest"], res["uSNUrgent"]);
# urgent replication should NOT be enabled when deleting
self.delete_force(self.ldb, "cn=user UrgAttr test,cn=users," + self.base_dn)
- res = _glue.dsdb_load_partition_usn(self.ldb, self.base_dn)
+ res = self.ldb.load_partition_usn(self.base_dn)
self.assertNotEquals(res["uSNHighest"], res["uSNUrgent"]);
@@ -373,7 +372,8 @@ if not "://" in host:
host = "ldap://%s" % host
-ldb = Ldb(host, credentials=creds, session_info=system_session(), lp=lp)
+ldb = SamDB(host, credentials=creds, session_info=system_session(), lp=lp,
+ global_schema=False)
runner = SubunitTestRunner()
rc = 0
diff --git a/source4/scripting/python/pyglue.c b/source4/scripting/python/pyglue.c
index 530c33e7d4..629c9b11e2 100644
--- a/source4/scripting/python/pyglue.c
+++ b/source4/scripting/python/pyglue.c
@@ -186,52 +186,6 @@ static PyObject *py_dsdb_set_schema_from_ldb(PyObject *self, PyObject *args)
Py_RETURN_NONE;
}
-static PyObject *py_dsdb_load_partition_usn(PyObject *self, PyObject *args)
-{
- PyObject *py_dn, *py_ldb, *result;
- struct ldb_dn *dn;
- uint64_t highest_uSN, urgent_uSN;
- struct ldb_context *ldb;
- TALLOC_CTX *mem_ctx;
- int ret;
-
- mem_ctx = talloc_new(NULL);
- if (mem_ctx == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
-
- if (!PyArg_ParseTuple(args, "OO", &py_ldb, &py_dn)) {
- talloc_free(mem_ctx);
- return NULL;
- }
-
- PyErr_LDB_OR_RAISE(py_ldb, ldb);
-
- if (!PyObject_AsDn(mem_ctx, py_dn, ldb, &dn)) {
- talloc_free(mem_ctx);
- return NULL;
- }
-
- ret = dsdb_load_partition_usn(ldb, dn, &highest_uSN, &urgent_uSN);
- if (ret != LDB_SUCCESS) {
- char *errstr = talloc_asprintf(mem_ctx, "Failed to load partition uSN - %s", ldb_errstring(ldb));
- PyErr_SetString(PyExc_RuntimeError, errstr);
- talloc_free(mem_ctx);
- return NULL;
- }
-
- talloc_free(mem_ctx);
-
- result = PyDict_New();
-
- PyDict_SetItemString(result, "uSNHighest", PyInt_FromLong((uint64_t)highest_uSN));
- PyDict_SetItemString(result, "uSNUrgent", PyInt_FromLong((uint64_t)urgent_uSN));
-
-
- return result;
-}
-
/*
return the list of interface IPs we have configured
takes an loadparm context, returns a list of IPs in string form
@@ -302,8 +256,6 @@ static PyMethodDef py_misc_methods[] = {
NULL },
{ "set_debug_level", (PyCFunction)py_set_debug_level, METH_VARARGS,
"set debug level" },
- { "dsdb_load_partition_usn", (PyCFunction)py_dsdb_load_partition_usn, METH_VARARGS,
- "get uSNHighest and uSNUrgent from the partition @REPLCHANGED"},
{ "interface_ips", (PyCFunction)py_interface_ips, METH_VARARGS,
"get interface IP address list"},
{ NULL }
diff --git a/source4/scripting/python/samba/samdb.py b/source4/scripting/python/samba/samdb.py
index 2f33c31c63..790cb2badc 100644
--- a/source4/scripting/python/samba/samdb.py
+++ b/source4/scripting/python/samba/samdb.py
@@ -267,3 +267,6 @@ accountExpires: %u
def server_site_name(self):
"Get the server site name"
return dsdb.samdb_server_site_name(self)
+
+ def load_partition_usn(self, base_dn):
+ return dsdb.dsdb_load_partition_usn(self, base_dn)