libnet dssync: support lists of dns (instead of one dn) for single object replication.
authorMichael Adam <obnox@samba.org>
Wed, 30 Jul 2008 11:02:36 +0000 (13:02 +0200)
committerMichael Adam <obnox@samba.org>
Fri, 1 Aug 2008 14:07:04 +0000 (16:07 +0200)
Just specify several DNs separated by spaces on the command line of
"net rpc vampire keytab" to get the passwords for each of these
accouns via single object replication.

Michael
(This used to be commit 6e53dc2db882d88470be5dfa1155b420fac8e6c5)

source3/libnet/libnet_dssync.c
source3/libnet/libnet_dssync.h
source3/utils/net_rpc_samsync.c

index f8e31e87a67097ab1bde542163c45249f61da778..f3b236382489581e893cbc2e526913a9daf2cc01 100644 (file)
@@ -630,7 +630,9 @@ static NTSTATUS libnet_dssync_process(TALLOC_CTX *mem_ctx,
        union drsuapi_DsGetNCChangesRequest req;
        struct replUpToDateVectorBlob *old_utdv = NULL;
        struct replUpToDateVectorBlob *pnew_utdv = NULL;
-       const char *dn;
+       const char **dns;
+       uint32_t dn_count;
+       uint32_t count;
 
        status = ctx->ops->startup(ctx, mem_ctx, &old_utdv);
        if (!NT_STATUS_IS_OK(status)) {
@@ -640,25 +642,31 @@ static NTSTATUS libnet_dssync_process(TALLOC_CTX *mem_ctx,
                goto out;
        }
 
-       if (ctx->single && ctx->object_dn) {
-               dn = ctx->object_dn;
+       if (ctx->single && ctx->object_dns) {
+               dns = ctx->object_dns;
+               dn_count = ctx->object_count;
        } else {
-               dn = ctx->nc_dn;
+               dns = &ctx->nc_dn;
+               dn_count = 1;
        }
 
-       status = libnet_dssync_build_request(mem_ctx, ctx, dn, old_utdv, &level,
-                                            &req);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto out;
-       }
+       for (count=0; count < dn_count; count++) {
+               status = libnet_dssync_build_request(mem_ctx, ctx,
+                                                    dns[count],
+                                                    old_utdv, &level,
+                                                    &req);
+               if (!NT_STATUS_IS_OK(status)) {
+                       goto out;
+               }
 
-       status = libnet_dssync_getncchanges(mem_ctx, ctx, level, &req,
-                                           &pnew_utdv);
-       if (!NT_STATUS_IS_OK(status)) {
-               ctx->error_message = talloc_asprintf(mem_ctx,
-                       "Failed to call DsGetNCCHanges: %s",
-                       nt_errstr(status));
-               goto out;
+               status = libnet_dssync_getncchanges(mem_ctx, ctx, level, &req,
+                                                   &pnew_utdv);
+               if (!NT_STATUS_IS_OK(status)) {
+                       ctx->error_message = talloc_asprintf(mem_ctx,
+                               "Failed to call DsGetNCCHanges: %s",
+                               nt_errstr(status));
+                       goto out;
+               }
        }
 
        status = ctx->ops->finish(ctx, mem_ctx, pnew_utdv);
index 7869b1620ac2f6fa2a853144a56b27d0b30aa15c..56de46ff345ad152386769cbff06eeacd02a9418 100644 (file)
@@ -37,7 +37,8 @@ struct dssync_context {
        const char *nc_dn;
        bool single;
        bool repl_nodiff;
-       const char *object_dn;
+       uint32_t object_count;
+       const char **object_dns;
        struct policy_handle bind_handle;
        DATA_BLOB session_key;
        const char *output_filename;
index 1e477e3a099d11099522bd5f94e741e73614634b..77911f4d5e410ee748260b6d9ba2941d3f8ff698 100644 (file)
@@ -302,7 +302,8 @@ static NTSTATUS rpc_vampire_keytab_ds_internals(struct net_context *c,
                ctx->output_filename = argv[0];
        }
        if (argc >= 2) {
-               ctx->object_dn = argv[1];
+               ctx->object_dns = &argv[1];
+               ctx->object_count = argc - 1;
                ctx->single = true;
        }