summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/scripting/python/samba/drs_utils.py57
-rw-r--r--source4/scripting/python/samba/netcmd/drs.py34
2 files changed, 66 insertions, 25 deletions
diff --git a/source4/scripting/python/samba/drs_utils.py b/source4/scripting/python/samba/drs_utils.py
index fbcbf2f9c9..b712932b59 100644
--- a/source4/scripting/python/samba/drs_utils.py
+++ b/source4/scripting/python/samba/drs_utils.py
@@ -24,6 +24,63 @@ from samba.net import Net
import samba, ldb
+class drsException:
+ """Base element for drs errors"""
+
+ def __init__(self, value):
+ self.value = value
+
+ def __str__(self):
+ return "drsException: " + self.value
+
+
+def drsuapi_connect(server, lp, creds):
+ """
+ make a DRSUAPI connection to the server
+ :param server: the name of the server to connect to
+ :param lp: a samba line parameter object
+ :param creds: credential used for the connection
+ :return: A tuple with the drsuapi bind object, the drsuapi handle
+ and the supported extensions.
+ :raise drsException: if the connection fails
+ """
+
+ binding_options = "seal"
+ if int(lp.get("log level")) >= 5:
+ binding_options += ",print"
+ binding_string = "ncacn_ip_tcp:%s[%s]" % (server, binding_options)
+ try:
+ drsuapiBind = drsuapi.drsuapi(binding_string, lp, creds)
+ (drsuapiHandle, bindSupportedExtensions) = drs_DsBind(drsuapiBind)
+ except Exception, e:
+ raise drsException("DRS connection to %s failed" % server, e)
+
+ return (drsuapiBind, drsuapiHandle, bindSupportedExtensions)
+
+def sendDsReplicaSync(drsuapiBind, drsuapi_handle, source_dsa_guid, naming_context, req_option):
+ """
+ :param drsuapiBind: a drsuapi Bind object
+ :param drsuapi_handle: a drsuapi hanle on the drsuapi connection
+ :param source_dsa_guid: the guid of the source dsa for the replication
+ :param naming_context: the DN of the naming context to replicate
+ :param req_options: replication options for the DsReplicaSync call
+ :raise drsException: if any error occur while sending and receiving the reply
+ for the dsReplicaSync
+ """
+
+ nc = drsuapi.DsReplicaObjectIdentifier()
+ nc.dn = naming_context
+
+ req1 = drsuapi.DsReplicaSyncRequest1()
+ req1.naming_context = nc;
+ req1.options = req_option
+ req1.source_dsa_guid = misc.GUID(source_dsa_guid)
+
+ try:
+ drsuapiBind.DsReplicaSync(drsuapi_handle, 1, req1)
+ except Exception, estr:
+ raise drsException("DsReplicaSync failed %s" % estr)
+
def drs_DsBind(drs):
'''make a DsBind call, returning the binding handle'''
bind_info = drsuapi.DsBindInfoCtr()
diff --git a/source4/scripting/python/samba/netcmd/drs.py b/source4/scripting/python/samba/netcmd/drs.py
index 056d3ee5b4..c508e2f331 100644
--- a/source4/scripting/python/samba/netcmd/drs.py
+++ b/source4/scripting/python/samba/netcmd/drs.py
@@ -36,22 +36,13 @@ from samba import drs_utils, nttime2string, dsdb
from samba.dcerpc import drsuapi, misc
import common
-
-
def drsuapi_connect(ctx):
'''make a DRSUAPI connection to the server'''
- binding_options = "seal"
- if int(ctx.lp.get("log level")) >= 5:
- binding_options += ",print"
- binding_string = "ncacn_ip_tcp:%s[%s]" % (ctx.server, binding_options)
try:
- ctx.drsuapi = drsuapi.drsuapi(binding_string, ctx.lp, ctx.creds)
- (ctx.drsuapi_handle, ctx.bind_supported_extensions) = drs_utils.drs_DsBind(ctx.drsuapi)
+ (ctx.drsuapi, ctx.drsuapi_handle, ctx.bind_supported_extensions) = drs_utils.drsuapi_connect(ctx.server, ctx.lp, ctx.creds)
except Exception, e:
raise CommandError("DRS connection to %s failed" % ctx.server, e)
-
-
def samdb_connect(ctx):
'''make a ldap connection to the server'''
try:
@@ -61,8 +52,6 @@ def samdb_connect(ctx):
except Exception, e:
raise CommandError("LDAP connection to %s failed" % ctx.server, e)
-
-
def drs_errmsg(werr):
'''return "was successful" or an error string'''
(ecode, estring) = werr
@@ -315,27 +304,22 @@ class cmd_drs_replicate(Command):
source_dsa_guid = msg[0]['objectGUID'][0]
dsa_options = int(attr_default(msg, 'options', 0))
- nc = drsuapi.DsReplicaObjectIdentifier()
- nc.dn = NC
- req1 = drsuapi.DsReplicaSyncRequest1()
- req1.naming_context = nc;
- req1.options = 0
+ req_options = 0
if not (dsa_options & dsdb.DS_NTDSDSA_OPT_DISABLE_OUTBOUND_REPL):
- req1.options |= drsuapi.DRSUAPI_DRS_WRIT_REP
+ req_options |= drsuapi.DRSUAPI_DRS_WRIT_REP
if add_ref:
- req1.options |= drsuapi.DRSUAPI_DRS_ADD_REF
+ req_options |= drsuapi.DRSUAPI_DRS_ADD_REF
if sync_forced:
- req1.options |= drsuapi.DRSUAPI_DRS_SYNC_FORCED
+ req_options |= drsuapi.DRSUAPI_DRS_SYNC_FORCED
if sync_all:
- req1.options |= drsuapi.DRSUAPI_DRS_SYNC_ALL
+ req_options |= drsuapi.DRSUAPI_DRS_SYNC_ALL
if full_sync:
- req1.options |= drsuapi.DRSUAPI_DRS_FULL_SYNC_NOW
- req1.source_dsa_guid = misc.GUID(source_dsa_guid)
+ req_options |= drsuapi.DRSUAPI_DRS_FULL_SYNC_NOW
try:
- self.drsuapi.DsReplicaSync(self.drsuapi_handle, 1, req1)
- except Exception, estr:
+ drs_utils.sendDsReplicaSync(self.drsuapi, self.drsuapi_handle, source_dsa_guid, NC, req_options)
+ except drs_utils.drsException, estr:
raise CommandError("DsReplicaSync failed", estr)
self.message("Replicate from %s to %s was successful." % (SOURCE_DC, DEST_DC))