618acdee04946316df838b3d54ed87b0fbbf6db8
[gd/samba-autobuild/.git] / source4 / torture / libnet / libnet_lookup.c
1 /*
2    Unix SMB/CIFS implementation.
3    Test suite for libnet calls.
4
5    Copyright (C) Rafal Szczesniak 2005
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include "includes.h"
22 #include "lib/cmdline/popt_common.h"
23 #include "libnet/libnet.h"
24 #include "libcli/libcli.h"
25 #include "torture/rpc/torture_rpc.h"
26 #include "torture/libnet/proto.h"
27 #include "param/param.h"
28
29
30 bool torture_lookup(struct torture_context *torture)
31 {
32         bool ret;
33         NTSTATUS status;
34         TALLOC_CTX *mem_ctx;
35         struct libnet_context *ctx;
36         struct libnet_Lookup lookup;
37         struct dcerpc_binding *binding;
38
39         mem_ctx = talloc_init("test_lookup");
40
41         ctx = libnet_context_init(torture->ev, torture->lp_ctx);
42         ctx->cred = cmdline_credentials;
43
44         lookup.in.hostname = torture_setting_string(torture, "host", NULL);
45         if (lookup.in.hostname == NULL) {
46                 status = torture_rpc_binding(torture, &binding);
47                 if (NT_STATUS_IS_OK(status)) {
48                         lookup.in.hostname = dcerpc_binding_get_string_option(binding, "host");
49                 }
50         }
51
52         lookup.in.type     = NBT_NAME_CLIENT;
53         lookup.in.resolve_ctx = NULL;
54         lookup.out.address = NULL;
55
56         status = libnet_Lookup(ctx, mem_ctx, &lookup);
57
58         if (!NT_STATUS_IS_OK(status)) {
59                 torture_comment(torture, "Couldn't lookup name %s: %s\n", lookup.in.hostname, nt_errstr(status));
60                 ret = false;
61                 goto done;
62         }
63
64         ret = true;
65
66         torture_comment(torture, "Name [%s] found at address: %s.\n", lookup.in.hostname, *lookup.out.address);
67
68 done:
69         talloc_free(mem_ctx);
70         return ret;
71 }
72
73
74 bool torture_lookup_host(struct torture_context *torture)
75 {
76         bool ret;
77         NTSTATUS status;
78         TALLOC_CTX *mem_ctx;
79         struct libnet_context *ctx;
80         struct libnet_Lookup lookup;
81         struct dcerpc_binding *binding;
82
83         mem_ctx = talloc_init("test_lookup_host");
84
85         ctx = libnet_context_init(torture->ev, torture->lp_ctx);
86         ctx->cred = cmdline_credentials;
87
88         lookup.in.hostname = torture_setting_string(torture, "host", NULL);
89         if (lookup.in.hostname == NULL) {
90                 status = torture_rpc_binding(torture, &binding);
91                 if (NT_STATUS_IS_OK(status)) {
92                         lookup.in.hostname = dcerpc_binding_get_string_option(binding, "host");
93                 }
94         }
95
96         lookup.in.resolve_ctx = NULL;
97         lookup.out.address = NULL;
98
99         status = libnet_LookupHost(ctx, mem_ctx, &lookup);
100
101         if (!NT_STATUS_IS_OK(status)) {
102                 torture_comment(torture, "Couldn't lookup host %s: %s\n", lookup.in.hostname, nt_errstr(status));
103                 ret = false;
104                 goto done;
105         }
106
107         ret = true;
108
109         torture_comment(torture, "Host [%s] found at address: %s.\n", lookup.in.hostname, *lookup.out.address);
110
111 done:
112         talloc_free(mem_ctx);
113         return ret;
114 }
115
116
117 bool torture_lookup_pdc(struct torture_context *torture)
118 {
119         bool ret;
120         NTSTATUS status;
121         TALLOC_CTX *mem_ctx;
122         struct libnet_context *ctx;
123         struct libnet_LookupDCs *lookup;
124         int i;
125
126         mem_ctx = talloc_init("test_lookup_pdc");
127
128         ctx = libnet_context_init(torture->ev, torture->lp_ctx);
129         ctx->cred = cmdline_credentials;
130
131         talloc_steal(ctx, mem_ctx);
132
133         lookup = talloc(mem_ctx, struct libnet_LookupDCs);
134         if (!lookup) {
135                 ret = false;
136                 goto done;
137         }
138
139         lookup->in.domain_name = lpcfg_workgroup(torture->lp_ctx);
140         lookup->in.name_type   = NBT_NAME_PDC;
141
142         status = libnet_LookupDCs(ctx, mem_ctx, lookup);
143
144         if (!NT_STATUS_IS_OK(status)) {
145                 torture_comment(torture, "Couldn't lookup pdc %s: %s\n", lookup->in.domain_name,
146                        nt_errstr(status));
147                 ret = false;
148                 goto done;
149         }
150
151         ret = true;
152
153         torture_comment(torture, "DCs of domain [%s] found.\n", lookup->in.domain_name);
154         for (i = 0; i < lookup->out.num_dcs; i++) {
155                 torture_comment(torture, "\tDC[%d]: name=%s, address=%s\n", i, lookup->out.dcs[i].name,
156                        lookup->out.dcs[i].address);
157         }
158
159 done:
160         talloc_free(mem_ctx);
161         return ret;
162 }
163
164
165 bool torture_lookup_sam_name(struct torture_context *torture)
166 {
167         NTSTATUS status;
168         TALLOC_CTX *mem_ctx;
169         struct libnet_context *ctx;
170         struct libnet_LookupName r;
171         bool ret = true;
172
173         ctx = libnet_context_init(torture->ev, torture->lp_ctx);
174         ctx->cred = cmdline_credentials;
175
176         mem_ctx = talloc_init("torture lookup sam name");
177         if (mem_ctx == NULL) return false;
178
179         r.in.name = "Administrator";
180         r.in.domain_name = lpcfg_workgroup(torture->lp_ctx);
181
182         status = libnet_LookupName(ctx, mem_ctx, &r);
183         torture_assert_ntstatus_ok_goto(torture, status, ret, done,
184                                         "libnet_LookupName: failed");
185
186 done:
187         talloc_free(mem_ctx);
188         talloc_free(ctx);
189
190         return ret;
191 }