diff options
| -rw-r--r-- | source4/scripting/python/samba/drs_utils.py | 57 | ||||
| -rw-r--r-- | source4/scripting/python/samba/netcmd/drs.py | 34 | 
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))  | 
