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

s4-python: Move load_partition_usn to dsdb module.

This commit is contained in:
Jelmer Vernooij
2010-04-08 22:07:42 +02:00
parent dd4ef4e106
commit 57ac0a6042
6 changed files with 82 additions and 78 deletions

View File

@ -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

View File

@ -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 }
};

View File

@ -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'
)

View File

@ -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

View File

@ -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 }

View File

@ -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)