smbd: Simplify callers of notify_filter_string
[samba.git] / source3 / utils / net_dom.c
index 9f6581027f9b2427b7bf2f1c9cdead7c9178f998..4342990eaa1aeaefa5c25a865d3ba4557a08afcf 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Samba Unix/Linux SMB client library
    net dom commands for remote join/unjoin
-   Copyright (C) 2007 Günther Deschner
+   Copyright (C) 2007,2009 Günther Deschner
 
    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
 
 #include "includes.h"
 #include "utils/net.h"
+#include "../librpc/gen_ndr/ndr_initshutdown.h"
+#include "../librpc/gen_ndr/ndr_winreg.h"
+#include "lib/netapi/netapi.h"
+#include "lib/netapi/netapi_net.h"
+#include "libsmb/libsmb.h"
 
 int net_dom_usage(struct net_context *c, int argc, const char **argv)
 {
-       d_printf("usage: net dom join "
-                "<domain=DOMAIN> <ou=OU> <account=ACCOUNT> "
-                "<password=PASSWORD> <reboot>\n  Join a remote machine\n");
-       d_printf("usage: net dom unjoin "
-                "<account=ACCOUNT> <password=PASSWORD> <reboot>\n"
-                "  Unjoin a remote machine\n");
+       d_printf("%s\n%s",
+               _("Usage:"),
+               _("net dom join "
+                  "<domain=DOMAIN> <ou=OU> <account=ACCOUNT> "
+                  "<password=PASSWORD> <reboot>\n  Join a remote machine\n"));
+       d_printf("%s\n%s",
+                _("Usage:"),
+                _("net dom unjoin "
+                  "<account=ACCOUNT> <password=PASSWORD> <reboot>\n"
+                  "  Unjoin a remote machine\n"));
+       d_printf("%s\n%s",
+                _("Usage:"),
+                _("net dom renamecomputer "
+                  "<newname=NEWNAME> "
+                  "<account=ACCOUNT> <password=PASSWORD> <reboot>\n"
+                  "  Rename joined computer\n"));
 
        return -1;
 }
@@ -37,10 +52,11 @@ static int net_dom_unjoin(struct net_context *c, int argc, const char **argv)
        const char *server_name = NULL;
        const char *account = NULL;
        const char *password = NULL;
-       uint32_t unjoin_flags = WKSSVC_JOIN_FLAGS_ACCOUNT_DELETE |
-                               WKSSVC_JOIN_FLAGS_JOIN_TYPE;
+       uint32_t unjoin_flags = NETSETUP_ACCT_DELETE |
+                               NETSETUP_JOIN_DOMAIN |
+                               NETSETUP_IGNORE_UNSUPPORTED_FLAGS;
        struct cli_state *cli = NULL;
-       bool reboot = false;
+       bool do_reboot = false;
        NTSTATUS ntstatus;
        NET_API_STATUS status;
        int ret = -1;
@@ -68,11 +84,11 @@ static int net_dom_unjoin(struct net_context *c, int argc, const char **argv)
                        }
                }
                if (strequal(argv[i], "reboot")) {
-                       reboot = true;
+                       do_reboot = true;
                }
        }
 
-       if (reboot) {
+       if (do_reboot) {
                ntstatus = net_make_ipc_connection_ex(c, c->opt_workgroup,
                                                      server_name, NULL, 0,
                                                      &cli);
@@ -83,25 +99,26 @@ static int net_dom_unjoin(struct net_context *c, int argc, const char **argv)
 
        status = NetUnjoinDomain(server_name, account, password, unjoin_flags);
        if (status != 0) {
-               printf("Failed to unjoin domain: %s\n",
+               printf(_("Failed to unjoin domain: %s\n"),
                        libnetapi_get_error_string(c->netapi_ctx, status));
                goto done;
        }
 
-       if (reboot) {
-               c->opt_comment = "Shutting down due to a domain membership "
-                                "change";
+       if (do_reboot) {
+               c->opt_comment = _("Shutting down due to a domain membership "
+                                  "change");
                c->opt_reboot = true;
                c->opt_timeout = 30;
 
-               ret = run_rpc_command(c, cli, PI_INITSHUTDOWN, 0,
-                                     rpc_init_shutdown_internals,
+               ret = run_rpc_command(c, cli,
+                                     &ndr_table_initshutdown,
+                                     0, rpc_init_shutdown_internals,
                                      argc, argv);
                if (ret == 0) {
                        goto done;
                }
 
-               ret = run_rpc_command(c, cli, PI_WINREG, 0,
+               ret = run_rpc_command(c, cli, &ndr_table_winreg, 0,
                                      rpc_reg_shutdown_internals,
                                      argc, argv);
                goto done;
@@ -124,10 +141,10 @@ static int net_dom_join(struct net_context *c, int argc, const char **argv)
        const char *account_ou = NULL;
        const char *Account = NULL;
        const char *password = NULL;
-       uint32_t join_flags = WKSSVC_JOIN_FLAGS_ACCOUNT_CREATE |
-                             WKSSVC_JOIN_FLAGS_JOIN_TYPE;
+       uint32_t join_flags = NETSETUP_ACCT_CREATE |
+                             NETSETUP_JOIN_DOMAIN;
        struct cli_state *cli = NULL;
-       bool reboot = false;
+       bool do_reboot = false;
        NTSTATUS ntstatus;
        NET_API_STATUS status;
        int ret = -1;
@@ -137,12 +154,14 @@ static int net_dom_join(struct net_context *c, int argc, const char **argv)
                return net_dom_usage(c, argc, argv);
        }
 
+       net_warn_member_options();
+
        if (c->opt_host) {
                server_name = c->opt_host;
        }
 
        if (c->opt_force) {
-               join_flags |= WKSSVC_JOIN_FLAGS_DOMAIN_JOIN_IF_JOINED;
+               join_flags |= NETSETUP_DOMAIN_JOIN_IF_JOINED;
        }
 
        for (i=0; i<argc; i++) {
@@ -171,11 +190,11 @@ static int net_dom_join(struct net_context *c, int argc, const char **argv)
                        }
                }
                if (strequal(argv[i], "reboot")) {
-                       reboot = true;
+                       do_reboot = true;
                }
        }
 
-       if (reboot) {
+       if (do_reboot) {
                ntstatus = net_make_ipc_connection_ex(c, c->opt_workgroup,
                                                      server_name, NULL, 0,
                                                      &cli);
@@ -189,25 +208,122 @@ static int net_dom_join(struct net_context *c, int argc, const char **argv)
        status = NetJoinDomain(server_name, domain_name, account_ou,
                               Account, password, join_flags);
        if (status != 0) {
-               printf("Failed to join domain: %s\n",
+               printf(_("Failed to join domain: %s\n"),
                        libnetapi_get_error_string(c->netapi_ctx, status));
                goto done;
        }
 
-       if (reboot) {
-               c->opt_comment = "Shutting down due to a domain membership "
-                                "change";
+       if (do_reboot) {
+               c->opt_comment = _("Shutting down due to a domain membership "
+                                  "change");
                c->opt_reboot = true;
                c->opt_timeout = 30;
 
-               ret = run_rpc_command(c, cli, PI_INITSHUTDOWN, 0,
+               ret = run_rpc_command(c, cli, &ndr_table_initshutdown, 0,
                                      rpc_init_shutdown_internals,
                                      argc, argv);
                if (ret == 0) {
                        goto done;
                }
 
-               ret = run_rpc_command(c, cli, PI_WINREG, 0,
+               ret = run_rpc_command(c, cli, &ndr_table_winreg, 0,
+                                     rpc_reg_shutdown_internals,
+                                     argc, argv);
+               goto done;
+       }
+
+       ret = 0;
+
+ done:
+       if (cli) {
+               cli_shutdown(cli);
+       }
+
+       return ret;
+}
+
+static int net_dom_renamecomputer(struct net_context *c, int argc, const char **argv)
+{
+       const char *server_name = NULL;
+       const char *account = NULL;
+       const char *password = NULL;
+       const char *newname = NULL;
+       uint32_t rename_options = NETSETUP_ACCT_CREATE;
+       struct cli_state *cli = NULL;
+       bool do_reboot = false;
+       NTSTATUS ntstatus;
+       NET_API_STATUS status;
+       int ret = -1;
+       int i;
+
+       if (argc < 1 || c->display_usage) {
+               return net_dom_usage(c, argc, argv);
+       }
+
+       if (c->opt_host) {
+               server_name = c->opt_host;
+       }
+
+       for (i=0; i<argc; i++) {
+               if (strnequal(argv[i], "account", strlen("account"))) {
+                       account = get_string_param(argv[i]);
+                       if (!account) {
+                               return -1;
+                       }
+               }
+               if (strnequal(argv[i], "password", strlen("password"))) {
+                       password = get_string_param(argv[i]);
+                       if (!password) {
+                               return -1;
+                       }
+               }
+               if (strnequal(argv[i], "newname", strlen("newname"))) {
+                       newname = get_string_param(argv[i]);
+                       if (!newname) {
+                               return -1;
+                       }
+               }
+               if (strequal(argv[i], "reboot")) {
+                       do_reboot = true;
+               }
+       }
+
+       if (do_reboot) {
+               ntstatus = net_make_ipc_connection_ex(c, c->opt_workgroup,
+                                                     server_name, NULL, 0,
+                                                     &cli);
+               if (!NT_STATUS_IS_OK(ntstatus)) {
+                       return -1;
+               }
+       }
+
+       status = NetRenameMachineInDomain(server_name, newname,
+                                         account, password, rename_options);
+       if (status != 0) {
+               printf(_("Failed to rename machine: "));
+               if (status == W_ERROR_V(WERR_NERR_SETUPNOTJOINED)) {
+                       printf(_("Computer is not joined to a Domain\n"));
+                       goto done;
+               }
+               printf("%s\n",
+                       libnetapi_get_error_string(c->netapi_ctx, status));
+               goto done;
+       }
+
+       if (do_reboot) {
+               c->opt_comment = _("Shutting down due to a computer rename");
+               c->opt_reboot = true;
+               c->opt_timeout = 30;
+
+               ret = run_rpc_command(c, cli,
+                                     &ndr_table_initshutdown,
+                                     0, rpc_init_shutdown_internals,
+                                     argc, argv);
+               if (ret == 0) {
+                       goto done;
+               }
+
+               ret = run_rpc_command(c, cli, &ndr_table_winreg, 0,
                                      rpc_reg_shutdown_internals,
                                      argc, argv);
                goto done;
@@ -232,30 +348,38 @@ int net_dom(struct net_context *c, int argc, const char **argv)
                        "join",
                        net_dom_join,
                        NET_TRANSPORT_LOCAL,
-                       "Join a remote machine",
-                       "net dom join <domain=DOMAIN> <ou=OU> "
-                       "<account=ACCOUNT> <password=PASSWORD> <reboot>\n"
-                       "  Join a remote machine"
+                       N_("Join a remote machine"),
+                       N_("net dom join <domain=DOMAIN> <ou=OU> "
+                          "<account=ACCOUNT> <password=PASSWORD> <reboot>\n"
+                          "  Join a remote machine")
                },
                {
                        "unjoin",
                        net_dom_unjoin,
                        NET_TRANSPORT_LOCAL,
-                       "Unjoin a remote machine",
-                       "net dom unjoin <account=ACCOUNT> <password=PASSWORD> "
-                       "<reboot>\n"
-                       "  Unjoin a remote machine"
+                       N_("Unjoin a remote machine"),
+                       N_("net dom unjoin <account=ACCOUNT> "
+                          "<password=PASSWORD> <reboot>\n"
+                          "  Unjoin a remote machine")
                },
+               {
+                       "renamecomputer",
+                       net_dom_renamecomputer,
+                       NET_TRANSPORT_LOCAL,
+                       N_("Rename a computer that is joined to a domain"),
+                       N_("net dom renamecomputer <newname=NEWNAME> "
+                          "<account=ACCOUNT> <password=PASSWORD> "
+                          "<reboot>\n"
+                          "  Rename joined computer")
+               },
+
                {NULL, NULL, 0, NULL, NULL}
        };
 
-       status = libnetapi_init(&c->netapi_ctx);
+       status = libnetapi_net_init(&c->netapi_ctx, c->lp_ctx, c->creds);
        if (status != 0) {
                return -1;
        }
 
-       libnetapi_set_username(c->netapi_ctx, c->opt_user_name);
-       libnetapi_set_password(c->netapi_ctx, c->opt_password);
-
        return net_run_function(c, argc, argv, "net dom", func);
 }