net_vampire: split out rpc_vampire_ldif().
authorGünther Deschner <gd@samba.org>
Fri, 13 Jun 2008 19:46:59 +0000 (21:46 +0200)
committerGünther Deschner <gd@samba.org>
Fri, 13 Jun 2008 21:39:09 +0000 (23:39 +0200)
Guenther

source/utils/net_proto.h
source/utils/net_rpc.c
source/utils/net_rpc_samsync.c

index fe3b8648db9008d09aa5e49a517764e7f37a9658..a370d3d6b2decb13887e9197d3c0aa6af8250f5b 100644 (file)
@@ -359,6 +359,15 @@ NTSTATUS rpc_vampire_internals(struct net_context *c,
                                TALLOC_CTX *mem_ctx,
                                int argc,
                                const char **argv);
+int rpc_vampire_ldif(struct net_context *c, int argc, const char **argv);
+NTSTATUS rpc_vampire_ldif_internals(struct net_context *c,
+                                   const DOM_SID *domain_sid,
+                                   const char *domain_name,
+                                   struct cli_state *cli,
+                                   struct rpc_pipe_client *pipe_hnd,
+                                   TALLOC_CTX *mem_ctx,
+                                   int argc,
+                                   const char **argv);
 
 /* The following definitions come from utils/net_rpc_service.c  */
 
index 25a4ef1a75c5b28231a694f2995e6b7591cf0177..6a7c638e2abf4b691738791fe1fb0e8f52234b15 100644 (file)
@@ -6807,16 +6807,34 @@ static int rpc_samdump(struct net_context *c, int argc, const char **argv) {
 }
 
 /* syncronise sam database via samsync rpc calls */
-static int rpc_vampire(struct net_context *c, int argc, const char **argv) {
-       if (c->display_usage) {
-               d_printf("Usage:\n"
-                        "net rpc vampire\n"
-                        "    Vampire remote SAM database\n");
-               return 0;
+static int rpc_vampire(struct net_context *c, int argc, const char **argv)
+{
+       struct functable func[] = {
+               {
+                       "ldif",
+                       rpc_vampire_ldif,
+                       NET_TRANSPORT_RPC,
+                       "Dump remote SAM database to ldif",
+                       "net rpc vampire ldif\n"
+                       "    Dump remote SAM database to LDIF file or stdout"
+               },
+               {NULL, NULL, 0, NULL, NULL}
+       };
+
+       if (argc == 0) {
+               if (c->display_usage) {
+                       d_printf("Usage:\n"
+                                "net rpc vampire\n"
+                                "    Vampire remote SAM database\n");
+                       return 0;
+               }
+
+               return run_rpc_command(c, NULL, PI_NETLOGON, NET_FLAGS_ANONYMOUS,
+                                      rpc_vampire_internals,
+                                      argc, argv);
        }
 
-       return run_rpc_command(c, NULL, PI_NETLOGON, NET_FLAGS_ANONYMOUS,
-                              rpc_vampire_internals,  argc, argv);
+       return net_run_function(c, argc, argv, "net rpc vampire", func);
 }
 
 /**
index 0d289ed6054be9a33c4e1866538bc1253905576f..bc07341674f65b695852528944b1f05a64e67163 100644 (file)
@@ -2473,15 +2473,12 @@ NTSTATUS rpc_vampire_internals(struct net_context *c,
                                int argc,
                                const char **argv)
 {
-        NTSTATUS result;
-       fstring my_dom_sid_str;
-       fstring rem_dom_sid_str;
+       NTSTATUS result;
        struct samsync_context *ctx = NULL;
-       samsync_fn_t *fn;
 
        result = samsync_init_context(mem_ctx,
                                      domain_sid,
-                                     0,
+                                     NET_SAMSYNC_MODE_FETCH_PASSDB,
                                      &ctx);
        if (!NT_STATUS_IS_OK(result)) {
                return result;
@@ -2495,27 +2492,17 @@ NTSTATUS rpc_vampire_internals(struct net_context *c,
                         "workgroup=%s\n\n in your smb.conf?\n",
                         domain_name,
                         get_global_sam_name(),
-                        sid_to_fstring(my_dom_sid_str,
-                                       get_global_sam_sid()),
-                        domain_name, sid_to_fstring(rem_dom_sid_str,
-                                                    domain_sid),
+                        sid_string_dbg(get_global_sam_sid()),
+                        domain_name,
+                        sid_string_dbg(domain_sid),
                         domain_name);
                return NT_STATUS_UNSUCCESSFUL;
        }
 
-        if (argc >= 1 && (strcmp(argv[0], "ldif") == 0)) {
-               ctx->mode = NET_SAMSYNC_MODE_FETCH_LDIF;
-               ctx->ldif_filename = argv[1];
-               fn = (samsync_fn_t *)fetch_sam_entries_ldif;
-       } else {
-               ctx->mode = NET_SAMSYNC_MODE_FETCH_PASSDB;
-               fn = (samsync_fn_t *)fetch_sam_entries;
-       }
-
        /* fetch domain */
        ctx->domain_sid = domain_sid;
        result = process_database(pipe_hnd, SAM_DATABASE_DOMAIN,
-                                 (samsync_fn_t)fn, ctx);
+                                 fetch_sam_entries, ctx);
        if (!NT_STATUS_IS_OK(result)) {
                d_fprintf(stderr, "Failed to fetch domain database: %s\n",
                          nt_errstr(result));
@@ -2528,18 +2515,81 @@ NTSTATUS rpc_vampire_internals(struct net_context *c,
        /* fetch builtin */
        ctx->domain_sid = &global_sid_Builtin;
        result = process_database(pipe_hnd, SAM_DATABASE_BUILTIN,
-                                 (samsync_fn_t)fn, ctx);
+                                 fetch_sam_entries, ctx);
        if (!NT_STATUS_IS_OK(result)) {
                d_fprintf(stderr, "Failed to fetch builtin database: %s\n",
                          nt_errstr(result));
                goto fail;
        }
 
-       /* Currently we crash on PRIVS somewhere in unmarshalling */
-       /* Dump_database(cli, SAM_DATABASE_PRIVS, &ret_creds); */
-
        TALLOC_FREE(ctx);
 
  fail:
        return result;
 }
+
+NTSTATUS rpc_vampire_ldif_internals(struct net_context *c,
+                                   const DOM_SID *domain_sid,
+                                   const char *domain_name,
+                                   struct cli_state *cli,
+                                   struct rpc_pipe_client *pipe_hnd,
+                                   TALLOC_CTX *mem_ctx,
+                                   int argc,
+                                   const char **argv)
+{
+       NTSTATUS status;
+       struct samsync_context *ctx = NULL;
+
+       status = samsync_init_context(mem_ctx,
+                                     domain_sid,
+                                     NET_SAMSYNC_MODE_FETCH_LDIF,
+                                     &ctx);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       if (argc >= 1) {
+               ctx->ldif_filename = argv[1];
+       }
+
+       /* fetch domain */
+       ctx->domain_sid = domain_sid;
+       status = process_database(pipe_hnd, SAM_DATABASE_DOMAIN,
+                                 fetch_sam_entries_ldif, ctx);
+       if (!NT_STATUS_IS_OK(status)) {
+               d_fprintf(stderr, "Failed to fetch domain database: %s\n",
+                         nt_errstr(status));
+               if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED))
+                       d_fprintf(stderr, "Perhaps %s is a Windows 2000 "
+                                 "native mode domain?\n", domain_name);
+               goto fail;
+       }
+
+       /* fetch builtin */
+       ctx->domain_sid = &global_sid_Builtin;
+       status = process_database(pipe_hnd, SAM_DATABASE_BUILTIN,
+                                 fetch_sam_entries_ldif, ctx);
+       if (!NT_STATUS_IS_OK(status)) {
+               d_fprintf(stderr, "Failed to fetch builtin database: %s\n",
+                         nt_errstr(status));
+               goto fail;
+       }
+
+       TALLOC_FREE(ctx);
+
+ fail:
+       return status;
+}
+
+int rpc_vampire_ldif(struct net_context *c, int argc, const char **argv)
+{
+       if (c->display_usage) {
+               d_printf("Usage\n"
+                        "net rpc vampire ldif\n"
+                        "    Dump remote SAM database to LDIF file or stdout\n");
+               return 0;
+       }
+
+       return run_rpc_command(c, NULL, PI_NETLOGON, 0, rpc_vampire_ldif_internals,
+                              argc, argv);
+}