s4-devel: added a getncchanges developer script
authorAndrew Tridgell <tridge@samba.org>
Mon, 23 Aug 2010 02:47:51 +0000 (12:47 +1000)
committerAndrew Tridgell <tridge@samba.org>
Mon, 23 Aug 2010 05:55:40 +0000 (15:55 +1000)
this allows for command line access to getncchanges

it also provides a good example of calling DRSUAPI interfaces from
python

Pair-Programmed-With: Andrew Bartlett <abartlet@samba.org>

source4/scripting/devel/getncchanges [new file with mode: 0755]

diff --git a/source4/scripting/devel/getncchanges b/source4/scripting/devel/getncchanges
new file mode 100755 (executable)
index 0000000..7656c22
--- /dev/null
@@ -0,0 +1,120 @@
+#!/usr/bin/env python
+
+# script to call a DRS GetNCChanges from the command line
+# this is useful for plugfest testing
+
+import sys
+from optparse import OptionParser
+
+sys.path.insert(0, "bin/python")
+
+import samba
+import samba.getopt as options
+from samba.dcerpc import drsuapi, misc
+from samba.samdb import SamDB
+from samba.auth import system_session
+
+def do_DsBind(drs):
+    '''make a DsBind call, returning the binding handle'''
+    bind_info = drsuapi.DsBindInfoCtr()
+    bind_info.length = 28
+    bind_info.info = drsuapi.DsBindInfo28()
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_BASE
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_ASYNC_REPLICATION
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_REMOVEAPI
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_MOVEREQ_V2
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_GETCHG_COMPRESS
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V1
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_RESTORE_USN_OPTIMIZATION
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_KCC_EXECUTE
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_ADDENTRY_V2
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_LINKED_VALUE_REPLICATION
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V2
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_INSTANCE_TYPE_NOT_REQ_ON_MOD
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_CRYPTO_BIND
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_GET_REPL_INFO
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_STRONG_ENCRYPTION
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V01
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_TRANSITIVE_MEMBERSHIP
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_ADD_SID_HISTORY
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_POST_BETA3
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_GET_MEMBERSHIPS2
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V6
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_NONDOMAIN_NCS
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V8
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V5
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V6
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_ADDENTRYREPLY_V3
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V7
+    bind_info.info.supported_extensions        |= drsuapi.DRSUAPI_SUPPORTED_EXTENSION_VERIFY_OBJECT
+    (info, handle) = drs.DsBind(misc.GUID(drsuapi.DRSUAPI_DS_BIND_GUID), bind_info)
+    return handle
+
+########### main code ###########
+if __name__ == "__main__":
+    parser = OptionParser("getncchanges [options] server")
+    sambaopts = options.SambaOptions(parser)
+    credopts = options.CredentialsOptionsDouble(parser)
+    parser.add_option_group(credopts)
+
+    parser.add_option("", "--dn", dest="dn", help="DN to replicate",)
+    parser.add_option("", "--exop", dest="exop", help="extended operation",)
+
+    (opts, args) = parser.parse_args()
+
+    lp = sambaopts.get_loadparm()
+    creds = credopts.get_credentials(lp)
+
+    if len(args) != 1:
+        parser.error("You must supply a server")
+
+    if creds.is_anonymous():
+        parser.error("You must supply credentials")
+
+    server = args[0]
+
+    binding_str = "ncacn_ip_tcp:%s[seal,print]" % server
+
+    drs = drsuapi.drsuapi(binding_str, lp, creds)
+    drs_handle = do_DsBind(drs)
+    print "DRS Handle: %s" % drs_handle
+
+    req8 = drsuapi.DsGetNCChangesRequest8()
+
+    samdb = SamDB(url="ldap://%s" % server,
+                  session_info=system_session(),
+                  credentials=creds, lp=lp)
+
+    if opts.dn is None:
+        opts.dn = str(samdb.get_default_basedn())
+
+    if opts.exop is None:
+        exop = drsuapi.DRSUAPI_EXOP_NONE
+    else:
+        exop = int(opts.exop)
+
+    null_guid = misc.GUID()
+    req8.destination_dsa_guid               = misc.GUID("9c637462-5b8c-4467-aef2-bdb1f57bc4ef")
+    req8.source_dsa_invocation_id          = misc.GUID(samdb.get_invocation_id())
+    req8.naming_context                            = drsuapi.DsReplicaObjectIdentifier()
+    req8.naming_context.dn                  = opts.dn.decode("utf-8")
+    req8.highwatermark                      = drsuapi.DsReplicaHighWaterMark()
+    req8.highwatermark.tmp_highest_usn     = 0
+    req8.highwatermark.reserved_usn        = 0
+    req8.highwatermark.highest_usn         = 0
+    req8.uptodateness_vector               = None
+    req8.replica_flags                     = 0
+    req8.replica_flags                     |=  (drsuapi.DRSUAPI_DRS_INIT_SYNC |
+                                                 drsuapi.DRSUAPI_DRS_PER_SYNC |
+                                                 drsuapi.DRSUAPI_DRS_GET_ANC |
+                                                 drsuapi.DRSUAPI_DRS_NEVER_SYNCED)
+    req8.max_object_count                   = 402
+    req8.max_ndr_size                       = 402116
+    req8.extended_op                        = exop
+    req8.fsmo_info                          = 0
+    req8.partial_attribute_set              = None
+    req8.partial_attribute_set_ex           = None
+    req8.mapping_ctr.num_mappings           = 0
+    req8.mapping_ctr.mappings               = None
+
+    drs.DsGetNCChanges(drs_handle, 8, req8)