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)
10
Largely rewritten by metze in August 2004
12
Originally written by Steve and Jim. Largely rewritten by tridge in
15
Reworked again by abartlet in December 2001
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.
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.
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/>.
31
/*****************************************************/
33
/* Distributed SMB/CIFS Server Management Utility */
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 */
41
/*****************************************************/
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
#include "lib/events/events.h"
50
#include "auth/credentials/credentials.h"
53
run a function from a function table. If not found then
54
call the specified usage function
56
int net_run_function(struct net_context *ctx,
57
int argc, const char **argv,
58
const struct net_functable *functable,
59
int (*usage_fn)(struct net_context *ctx, int argc, const char **argv))
64
return usage_fn(ctx, argc, argv);
66
} else if (argc == 1 && strequal(argv[0], "help")) {
67
return net_help(ctx, functable);
70
for (i=0; functable[i].name; i++) {
71
if (strcasecmp_m(argv[0], functable[i].name) == 0)
72
return functable[i].fn(ctx, argc-1, argv+1);
75
d_printf("No command: %s\n", argv[0]);
76
return usage_fn(ctx, argc, argv);
80
run a usage function from a function table. If not found then fail
82
int net_run_usage(struct net_context *ctx,
83
int argc, const char **argv,
84
const struct net_functable *functable)
88
for (i=0; functable[i].name; i++) {
89
if (strcasecmp_m(argv[0], functable[i].name) == 0)
90
if (functable[i].usage) {
91
return functable[i].usage(ctx, argc-1, argv+1);
95
d_printf("No usage information for command: %s\n", argv[0]);
101
/* main function table */
102
static const struct net_functable net_functable[] = {
103
{"password", "change password\n", net_password, net_password_usage},
104
{"time", "get remote server's time\n", net_time, net_time_usage},
105
{"join", "join a domain\n", net_join, net_join_usage},
106
{"samdump", "dump the sam of a domain\n", net_samdump, net_samdump_usage},
107
{"vampire", "join and syncronise an AD domain onto the local server\n", net_vampire, net_vampire_usage},
108
{"samsync", "synchronise into the local ldb the sam of an NT4 domain\n", net_samsync_ldb, net_samsync_ldb_usage},
109
{"user", "manage user accounts\n", net_user, net_user_usage},
110
{"machinepw", "Get a machine password out of our SAM\n", net_machinepw,
111
net_machinepw_usage},
112
{NULL, NULL, NULL, NULL}
115
int net_help(struct net_context *ctx, const struct net_functable *ftable)
118
const char *name = ftable[i].name;
119
const char *desc = ftable[i].desc;
121
d_printf("Available commands:\n");
122
while (name && desc) {
123
d_printf("\t%s\t\t%s", name, desc);
124
name = ftable[++i].name;
125
desc = ftable[i].desc;
131
static int net_usage(struct net_context *ctx, int argc, const char **argv)
133
d_printf("Usage:\n");
134
d_printf("net <command> [options]\n");
138
/****************************************************************************
140
****************************************************************************/
141
static int binary_net(int argc, const char **argv)
146
const char **argv_new;
147
struct tevent_context *ev;
148
struct net_context *ctx = NULL;
150
struct poptOption long_options[] = {
153
POPT_COMMON_CONNECTION
154
POPT_COMMON_CREDENTIALS
161
pc = poptGetContext("net", argc, (const char **) argv, long_options,
162
POPT_CONTEXT_KEEP_FIRST);
164
while((opt = poptGetNextOpt(pc)) != -1) {
167
d_printf("Invalid option %s: %s\n",
168
poptBadOption(pc, 0), poptStrerror(opt));
169
net_usage(ctx, argc, argv);
174
argv_new = (const char **)poptGetArgs(pc);
177
for (i=0; i<argc; i++) {
178
if (argv_new[i] == NULL) {
185
return net_usage(ctx, argc, argv);
188
dcerpc_init(cmdline_lp_ctx);
190
ev = s4_event_context_init(NULL);
192
d_printf("Failed to create an event context\n");
195
ctx = talloc(ev, struct net_context);
197
d_printf("Failed to talloc a net_context\n");
202
ctx->lp_ctx = cmdline_lp_ctx;
203
ctx->credentials = cmdline_credentials;
206
rc = net_run_function(ctx, argc_new-1, argv_new+1, net_functable, net_usage);
209
DEBUG(0,("return code = %d\n", rc));
216
int main(int argc, const char **argv)
218
return binary_net(argc, argv);