made a "net ads" command, currently with "net ads join" and "net ads leave"
authorAndrew Tridgell <tridge@samba.org>
Sun, 25 Nov 2001 00:18:11 +0000 (00:18 +0000)
committerAndrew Tridgell <tridge@samba.org>
Sun, 25 Nov 2001 00:18:11 +0000 (00:18 +0000)
source/Makefile.in
source/utils/net.c
source/utils/net_ads.c [new file with mode: 0644]

index 8a29a1f0ffe3ac03002b0fead2025ce7a38a9c06..682b478c6ceb07a8b3fdd256287f7c2863003d90 100644 (file)
@@ -319,7 +319,7 @@ CLIENT_OBJ = client/client.o client/clitar.o \
              $(PARAM_OBJ) $(LIBSMB_OBJ) $(UBIQX_OBJ) $(LIB_OBJ) \
              $(READLINE_OBJ)
 
-NET_OBJ = utils/net.o utils/net_join.o \
+NET_OBJ = utils/net.o utils/net_ads.o \
        $(LIBSMB_OBJ) $(PARAM_OBJ) $(UBIQX_OBJ) $(LIB_OBJ) @BUILD_POPT@
 
 CUPS_OBJ = client/smbspool.o $(PARAM_OBJ) $(LIBSMB_OBJ) $(UBIQX_OBJ) $(LIB_OBJ)
index d1d63fe2af689334b3da6aaf4677ba5f0de6fc9e..f3a9953e87a13e966b0c8489b26f187a21084e95 100644 (file)
@@ -35,7 +35,7 @@
 /*                                                   */
 /*****************************************************/
 
-#include <includes.h>
+#include "includes.h"
 
 /***********************************************************************/
 /* Beginning of internationalization section.  Translatable constants  */
@@ -1190,7 +1190,7 @@ static int help_usage(void)
 "\n"\
 "Valid functions are:\n"\
 "  FILE SHARE SESSION SERVER DOMAIN PRINTQ USER GROUP\n"\
-"  VALIDATE GROUPMEMBER ADMIN SERVICE PASSWORD JOIN\n");
+"  VALIDATE GROUPMEMBER ADMIN SERVICE PASSWORD ADS\n");
        return -1;
 }
 
@@ -1213,7 +1213,7 @@ static int net_help(int argc, const char **argv)
                {"ADMIN", admin_usage},
                {"SERVICE", service_usage},
                {"PASSWORD", password_usage},
-               {"JOIN", net_join_usage},
+               {"ADS", net_ads_usage},
                {NULL, NULL}};
 
        return net_run_function(argc, argv, func, help_usage);
@@ -1234,7 +1234,7 @@ static struct functable net_func[] = {
        {"ADMIN", net_admin},
        {"SERVICE", net_service},
        {"PASSWORD", net_password},
-       {"JOIN", net_join},
+       {"ADS", net_ads},
        {"HELP", net_help},
        {NULL, NULL}
 };
diff --git a/source/utils/net_ads.c b/source/utils/net_ads.c
new file mode 100644 (file)
index 0000000..0386085
--- /dev/null
@@ -0,0 +1,187 @@
+/* 
+   Samba Unix/Linux SMB client library 
+   Version 3.0
+   net ads commands
+   Copyright (C) 2001 Andrew Tridgell (tridge@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
+   (at your option) any later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   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.  
+*/
+
+#include "includes.h"
+
+#ifdef HAVE_ADS
+
+/* a lame random number generator - used /dev/urandom if possible */
+static unsigned one_random(void)
+{
+       int fd = -1;
+       static int initialised;
+       unsigned ret;
+
+       if (!initialised) {
+               initialised = 1;
+               fd = open("/dev/urandom", O_RDONLY);
+               srandom(time(NULL) ^ getpid());
+       }
+
+       if (fd == -1) {
+               return random();
+       }
+
+       read(fd, &ret, sizeof(ret));
+       return ret;
+}
+
+/*
+ * Generate a simple random password of 15 chars - not a cryptographic one
+ */
+static char *generate_random_password(int len)
+{
+       int i;
+       char *pass;
+
+       if (!(pass = malloc(len+1)))
+               return NULL;
+
+       for (i=0; i<len; ) {
+               char c = one_random() & 0x7f;
+               if (!isalnum(c) && !ispunct(c)) continue;
+               pass[i++] = c;
+       }
+       
+       return pass;
+}
+
+
+int net_ads_usage(void)
+{
+       d_printf(
+"\nnet ads join"\
+"\n\tjoins the local machine to a ADS realm\n"\
+"\nnet ads leave"\
+"\n\tremoves the local machine from a ADS realm\n"
+               );
+       return -1;
+}
+
+static int net_ads_leave(int argc, const char **argv)
+{
+       char *hostname;
+       ADS_STRUCT *ads;
+       int rc;
+       extern pstring global_myname;
+
+       hostname = strdup(global_myname);
+       strlower(hostname);
+
+       if (!secrets_init()) {
+               DEBUG(1,("Failed to initialise secrets database\n"));
+               return -1;
+       }
+
+       ads = ads_init(NULL, NULL, NULL);
+
+       rc = ads_connect(ads);
+       if (rc) {
+               d_printf("ads_connect: %s\n", ads_errstr(rc));
+               return -1;
+       }
+
+       rc = ads_leave_realm(ads, hostname);
+       if (rc) {
+           d_printf("Failed to delete host '%s' from the '%s' realm.\n", 
+                    hostname, ads->realm);
+           return -1;
+       }
+
+       d_printf("Removed '%s' from realm '%s'\n", hostname, ads->realm);
+
+       return 0;
+}
+
+static int net_ads_join(int argc, const char **argv)
+{
+       char *hostname;
+       ADS_STRUCT *ads;
+       int rc;
+       char *password;
+       extern pstring global_myname;
+       NTSTATUS status;
+
+       hostname = strdup(global_myname);
+       strlower(hostname);
+
+       if (!secrets_init()) {
+               DEBUG(1,("Failed to initialise secrets database\n"));
+               return -1;
+       }
+
+       password = generate_random_password(15);
+
+       ads = ads_init(NULL, NULL, NULL);
+
+       rc = ads_connect(ads);
+       if (rc) {
+               d_printf("ads_connect: %s\n", ads_errstr(rc));
+               return -1;
+       }
+
+       rc = ads_join_realm(ads, hostname);
+       if (rc) {
+               d_printf("ads_join_realm: %s\n", ads_errstr(rc));
+               return -1;
+       }
+
+       status = ads_set_machine_password(ads, hostname, password);
+       if (!NT_STATUS_IS_OK(status)) {
+               d_printf("ads_set_machine_password: %s\n", get_nt_error_msg(status));
+               return -1;
+       }
+
+       if (!secrets_store_machine_password(password)) {
+               DEBUG(1,("Failed to save machine password\n"));
+               return -1;
+       }
+
+       d_printf("Joined '%s' to realm '%s'\n", hostname, ads->realm);
+
+       return 0;
+}
+
+int net_ads(int argc, const char **argv)
+{
+       struct functable func[] = {
+               {"JOIN", net_ads_join},
+               {"LEAVE", net_ads_leave},
+               {NULL, NULL}
+       };
+       
+       return net_run_function(argc, argv, func, net_ads_usage);
+}
+
+#else
+
+int net_ads_usage(void)
+{
+       d_printf("ADS support not compiled in\n");
+       return -1;
+}
+
+int net_ads(int argc, const char **argv)
+{
+       return net_ads_usage();
+}
+
+#endif