Merge commit 'release-4-0-0alpha1' into v4-0-test
[ira/wip.git] / source4 / utils / net / net_join.c
index 81e795a3ce0669f9cbc8ced560c9a7e1f6242f47..1352fb7d9bfa59a9f2651c9e91d8158c4fb7c8fd 100644 (file)
@@ -2,11 +2,12 @@
    Samba Unix/Linux SMB client library 
    Distributed SMB/CIFS Server Management Utility 
 
-   Copyright (C) 2004 Stefan Metzmacher (metze@samba.org)
+   Copyright (C) 2004 Stefan Metzmacher <metze@samba.org>
+   Copyright (C) 2005 Andrew Bartlett <abartlet@samba.org>
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
 #include "utils/net/net.h"
 #include "libnet/libnet.h"
-#include "librpc/gen_ndr/ndr_samr.h"
+#include "libcli/security/security.h"
+#include "param/param.h"
 
-static int net_join_domain(struct net_context *ctx, int argc, const char **argv)
+int net_join(struct net_context *ctx, int argc, const char **argv) 
 {
        NTSTATUS status;
        struct libnet_context *libnetctx;
-       union libnet_JoinDomain r;
+       struct libnet_Join *r;
        char *tmp;
        const char *domain_name;
+       enum netr_SchannelType secure_channel_type = SEC_CHAN_WKSTA;
 
        switch (argc) {
                case 0: /* no args -> fail */
-                       DEBUG(0,("net_join_domain: no args\n"));
-                       return -1;
+                       return net_join_usage(ctx, argc, argv);
                case 1: /* only DOMAIN */
                        tmp = talloc_strdup(ctx->mem_ctx, argv[0]);
                        break;
-               default: /* too mayn args -> fail */
-                       DEBUG(0,("net_join_domain: too many args [%d]\n",argc));
-                       return -1;
+               case 2: /* DOMAIN and role */
+                       tmp = talloc_strdup(ctx->mem_ctx, argv[0]);
+                       if (strcasecmp(argv[1], "BDC") == 0) {
+                               secure_channel_type = SEC_CHAN_BDC;
+                       } else if (strcasecmp(argv[1], "MEMBER") == 0) {
+                               secure_channel_type = SEC_CHAN_WKSTA;
+                       } else {
+                               d_fprintf(stderr, "net_join: Invalid 2nd argument (%s) must be MEMBER or BDC\n", argv[1]);
+                               return net_join_usage(ctx, argc, argv);
+                       }
+                       break;
+               default: /* too many args -> fail */
+                       return net_join_usage(ctx, argc, argv);
        }
 
        domain_name = tmp;
 
-       libnetctx = libnet_context_init();
+       libnetctx = libnet_context_init(NULL);
        if (!libnetctx) {
                return -1;      
        }
-       libnetctx->user.account_name    = ctx->user.account_name;
-       libnetctx->user.domain_name     = ctx->user.domain_name;
-       libnetctx->user.password        = ctx->user.password;
-
-       /* prepare password change */
-       r.generic.level                 = LIBNET_JOIN_DOMAIN_GENERIC;
-       r.generic.in.domain_name        = domain_name;
-       r.generic.in.account_name       = talloc_asprintf(ctx->mem_ctx, "%s$", lp_netbios_name());
-       r.generic.in.acct_type          = ACB_SVRTRUST;
+       libnetctx->cred = ctx->credentials;
+       r = talloc(ctx->mem_ctx, struct libnet_Join);
+       if (!r) {
+               return -1;
+       }
+       /* prepare parameters for the join */
+       r->in.netbios_name              = lp_netbios_name(global_loadparm);
+       r->in.domain_name               = domain_name;
+       r->in.join_type                 = secure_channel_type;
+       r->in.level                     = LIBNET_JOIN_AUTOMATIC;
+       r->out.error_string             = NULL;
 
        /* do the domain join */
-       status = libnet_JoinDomain(libnetctx, ctx->mem_ctx, &r);
+       status = libnet_Join(libnetctx, r, r);
+       
        if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(0,("net_join_domain: %s\n",r.generic.out.error_string));
+               d_fprintf(stderr, "Joining domain failed: %s\n",
+                         r->out.error_string ? r->out.error_string : nt_errstr(status));
+               talloc_free(r);
+               talloc_free(libnetctx);
                return -1;
        }
+       d_printf("Joined domain %s (%s)\n", r->out.domain_name, dom_sid_string(ctx->mem_ctx, r->out.domain_sid));
 
-       libnet_context_destroy(&libnetctx);
-
+       talloc_free(libnetctx);
        return 0;
 }
 
-static int net_join_domain_usage(struct net_context *ctx, int argc, const char **argv)
-{
-       d_printf("net_join_domain_usage: TODO\n");
-       return 0;       
-}
-
-static int net_join_domain_help(struct net_context *ctx, int argc, const char **argv)
-{
-       d_printf("net_join_domain_help: TODO\n");
-       return 0;       
-}
-
-static const struct net_functable net_password_functable[] = {
-       {"domain", net_join_domain, net_join_domain_usage,  net_join_domain_help},
-       {NULL, NULL}
-};
-
-int net_join(struct net_context *ctx, int argc, const char **argv) 
-{
-       
-       return net_run_function(ctx, argc, argv, net_password_functable, net_password_usage);
-}
-
 int net_join_usage(struct net_context *ctx, int argc, const char **argv)
 {
-       d_printf("net_password_usage: TODO\n");
+       d_printf("net join <domain> [BDC | MEMBER] [options]\n");
        return 0;       
 }
 
 int net_join_help(struct net_context *ctx, int argc, const char **argv)
 {
-       d_printf("net_password_help: TODO\n");
+       d_printf("Joins domain as either member or backup domain controller.\n");
        return 0;       
 }