c908ea6279550b6973734126a20183b2a867f03d
[bbaumbach/samba-autobuild/.git] / source4 / utils / net / net.c
1 /* 
2    Samba Unix/Linux SMB client library 
3    Distributed SMB/CIFS Server Management Utility 
4    Copyright (C) 2001 Steve French  (sfrench@us.ibm.com)
5    Copyright (C) 2001 Jim McDonough (jmcd@us.ibm.com)
6    Copyright (C) 2001 Andrew Tridgell (tridge@samba.org)
7    Copyright (C) 2001 Andrew Bartlett (abartlet@samba.org)
8    Copyright (C) 2004 Stefan Metzmacher (metze@samba.org)
9
10    Largely rewritten by metze in August 2004
11
12    Originally written by Steve and Jim. Largely rewritten by tridge in
13    November 2001.
14
15    Reworked again by abartlet in December 2001
16
17    This program is free software; you can redistribute it and/or modify
18    it under the terms of the GNU General Public License as published by
19    the Free Software Foundation; either version 3 of the License, or
20    (at your option) any later version.
21    
22    This program is distributed in the hope that it will be useful,
23    but WITHOUT ANY WARRANTY; without even the implied warranty of
24    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25    GNU General Public License for more details.
26    
27    You should have received a copy of the GNU General Public License
28    along with this program.  If not, see <http://www.gnu.org/licenses/>.
29 */
30  
31 /*****************************************************/
32 /*                                                   */
33 /*   Distributed SMB/CIFS Server Management Utility  */
34 /*                                                   */
35 /*   The intent was to make the syntax similar       */
36 /*   to the NET utility (first developed in DOS      */
37 /*   with additional interesting & useful functions  */
38 /*   added in later SMB server network operating     */
39 /*   systems).                                       */
40 /*                                                   */
41 /*****************************************************/
42
43 #include "includes.h"
44 #include "utils/net/net.h"
45 #include "lib/cmdline/popt_common.h"
46 #include "lib/ldb/include/ldb.h"
47 #include "librpc/rpc/dcerpc.h"
48 #include "param/param.h"
49
50 /*
51   run a function from a function table. If not found then
52   call the specified usage function 
53 */
54 int net_run_function(struct net_context *ctx,
55                         int argc, const char **argv,
56                         const struct net_functable *functable, 
57                         int (*usage_fn)(struct net_context *ctx, int argc, const char **argv))
58 {
59         int i;
60
61         if (argc == 0) {
62                 return usage_fn(ctx, argc, argv);
63
64         } else if (argc == 1 && strequal(argv[0], "help")) {
65                 return net_help(ctx, functable);
66         }
67
68         for (i=0; functable[i].name; i++) {
69                 if (strcasecmp_m(argv[0], functable[i].name) == 0)
70                         return functable[i].fn(ctx, argc-1, argv+1);
71         }
72
73         d_printf("No command: %s\n", argv[0]);
74         return usage_fn(ctx, argc, argv);
75 }
76
77 /*
78   run a usage function from a function table. If not found then fail
79 */
80 int net_run_usage(struct net_context *ctx,
81                         int argc, const char **argv,
82                         const struct net_functable *functable)
83 {
84         int i;
85
86         for (i=0; functable[i].name; i++) {
87                 if (strcasecmp_m(argv[0], functable[i].name) == 0)
88                         if (functable[i].usage) {
89                                 return functable[i].usage(ctx, argc-1, argv+1);
90                         }
91         }
92
93         d_printf("No usage information for command: %s\n", argv[0]);
94
95         return 1;
96 }
97
98
99 /* main function table */
100 static const struct net_functable net_functable[] = {
101         {"password", "change password\n", net_password, net_password_usage},
102         {"time", "get remote server's time\n", net_time, net_time_usage},
103         {"join", "join a domain\n", net_join, net_join_usage},
104         {"samdump", "dump the sam of a domain\n", net_samdump, net_samdump_usage},
105         {"vampire", "join and syncronise an AD domain onto the local server\n", net_vampire, net_vampire_usage},
106         {"samsync", "synchronise into the local ldb the sam of an NT4 domain\n", net_samsync_ldb, net_samsync_ldb_usage},
107         {"user", "manage user accounts\n", net_user, net_user_usage},
108         {NULL, NULL, NULL, NULL}
109 };
110
111 int net_help(struct net_context *ctx, const struct net_functable *ftable)
112 {
113         int i = 0;
114         const char *name = ftable[i].name;
115         const char *desc = ftable[i].desc;
116
117         d_printf("Available commands:\n");
118         while (name && desc) {
119                 d_printf("\t%s\t\t%s", name, desc);
120                 name = ftable[++i].name;
121                 desc = ftable[i].desc;
122         }
123
124         return 0;
125 }
126
127 static int net_usage(struct net_context *ctx, int argc, const char **argv)
128 {
129         d_printf("Usage:\n");
130         d_printf("net <command> [options]\n");
131         return 0;
132 }
133
134 /****************************************************************************
135   main program
136 ****************************************************************************/
137 static int binary_net(int argc, const char **argv)
138 {
139         int opt,i;
140         int rc;
141         int argc_new;
142         const char **argv_new;
143         TALLOC_CTX *mem_ctx;
144         struct net_context *ctx = NULL;
145         poptContext pc;
146         struct poptOption long_options[] = {
147                 POPT_AUTOHELP
148                 POPT_COMMON_SAMBA
149                 POPT_COMMON_CONNECTION
150                 POPT_COMMON_CREDENTIALS
151                 POPT_COMMON_VERSION
152                 { NULL }
153         };
154
155         setlinebuf(stdout);
156
157         pc = poptGetContext("net", argc, (const char **) argv, long_options, 
158                             POPT_CONTEXT_KEEP_FIRST);
159
160         while((opt = poptGetNextOpt(pc)) != -1) {
161                 switch (opt) {
162                 default:
163                         d_printf("Invalid option %s: %s\n", 
164                                  poptBadOption(pc, 0), poptStrerror(opt));
165                         net_usage(ctx, argc, argv);
166                         exit(1);
167                 }
168         }
169
170         argv_new = (const char **)poptGetArgs(pc);
171
172         argc_new = argc;
173         for (i=0; i<argc; i++) {
174                 if (argv_new[i] == NULL) {
175                         argc_new = i;
176                         break;
177                 }
178         }
179
180         if (argc_new < 2) {
181                 return net_usage(ctx, argc, argv);
182         }
183
184         dcerpc_init();
185
186         mem_ctx = talloc_init("net_context");
187         ctx = talloc(mem_ctx, struct net_context);
188         if (!ctx) {
189                 d_printf("talloc_init(net_context) failed\n");
190                 exit(1);
191         }
192
193         ZERO_STRUCTP(ctx);
194         ctx->mem_ctx = mem_ctx;
195         ctx->lp_ctx = cmdline_lp_ctx;
196         ctx->credentials = cmdline_credentials;
197
198         rc = net_run_function(ctx, argc_new-1, argv_new+1, net_functable, net_usage);
199
200         if (rc != 0) {
201                 DEBUG(0,("return code = %d\n", rc));
202         }
203
204         talloc_free(mem_ctx);
205         return rc;
206 }
207
208  int main(int argc, const char **argv)
209 {
210         return binary_net(argc, argv);
211 }