2 Samba Unix/Linux SMB client library
3 Distributed SMB/CIFS Server Management Utility
4 Local printing tdb migration interface
6 Copyright (C) Guenther Deschner 2010
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "system/filesys.h"
24 #include "utils/net.h"
25 #include "rpc_client/rpc_client.h"
26 #include "librpc/gen_ndr/ndr_ntprinting.h"
27 #include "librpc/gen_ndr/ndr_spoolss.h"
28 #include "../libcli/security/security.h"
29 #include "../librpc/gen_ndr/ndr_security.h"
31 #include "printing/nt_printing_migrate.h"
33 #define FORMS_PREFIX "FORMS/"
34 #define DRIVERS_PREFIX "DRIVERS/"
35 #define PRINTERS_PREFIX "PRINTERS/"
36 #define SECDESC_PREFIX "SECDESC/"
38 static void dump_form(TALLOC_CTX
*mem_ctx
,
43 enum ndr_err_code ndr_err
;
46 struct ntprinting_form r
;
48 printf("found form: %s\n", key_name
);
50 blob
= data_blob_const(data
, length
);
54 ndr_err
= ndr_pull_struct_blob(&blob
, mem_ctx
, &r
,
55 (ndr_pull_flags_fn_t
)ndr_pull_ntprinting_form
);
56 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err
)) {
57 d_fprintf(stderr
, _("form pull failed: %s\n"),
62 s
= NDR_PRINT_STRUCT_STRING(mem_ctx
, ntprinting_form
, &r
);
68 static void dump_driver(TALLOC_CTX
*mem_ctx
,
73 enum ndr_err_code ndr_err
;
76 struct ntprinting_driver r
;
78 printf("found driver: %s\n", key_name
);
80 blob
= data_blob_const(data
, length
);
84 ndr_err
= ndr_pull_struct_blob(&blob
, mem_ctx
, &r
,
85 (ndr_pull_flags_fn_t
)ndr_pull_ntprinting_driver
);
86 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err
)) {
87 d_fprintf(stderr
, _("driver pull failed: %s\n"),
92 s
= NDR_PRINT_STRUCT_STRING(mem_ctx
, ntprinting_driver
, &r
);
98 static void dump_printer(TALLOC_CTX
*mem_ctx
,
103 enum ndr_err_code ndr_err
;
106 struct ntprinting_printer r
;
108 printf("found printer: %s\n", key_name
);
110 blob
= data_blob_const(data
, length
);
114 ndr_err
= ndr_pull_struct_blob(&blob
, mem_ctx
, &r
,
115 (ndr_pull_flags_fn_t
)ndr_pull_ntprinting_printer
);
116 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err
)) {
117 d_fprintf(stderr
, _("printer pull failed: %s\n"),
118 ndr_errstr(ndr_err
));
122 s
= NDR_PRINT_STRUCT_STRING(mem_ctx
, ntprinting_printer
, &r
);
128 static void dump_sd(TALLOC_CTX
*mem_ctx
,
129 const char *key_name
,
133 enum ndr_err_code ndr_err
;
136 struct sec_desc_buf r
;
138 printf("found security descriptor: %s\n", key_name
);
140 blob
= data_blob_const(data
, length
);
144 ndr_err
= ndr_pull_struct_blob(&blob
, mem_ctx
, &r
,
145 (ndr_pull_flags_fn_t
)ndr_pull_sec_desc_buf
);
146 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err
)) {
147 d_fprintf(stderr
, _("security descriptor pull failed: %s\n"),
148 ndr_errstr(ndr_err
));
152 s
= NDR_PRINT_STRUCT_STRING(mem_ctx
, sec_desc_buf
, &r
);
159 static int net_printing_dump(struct net_context
*c
, int argc
,
163 TALLOC_CTX
*ctx
= talloc_stackframe();
167 if (argc
< 1 || c
->display_usage
) {
168 d_fprintf(stderr
, "%s\nnet printing dump <file.tdb>\n",
173 tdb
= tdb_open_log(argv
[0], 0, TDB_DEFAULT
, O_RDONLY
, 0600);
175 d_fprintf(stderr
, _("failed to open tdb file: %s\n"), argv
[0]);
179 for (kbuf
= tdb_firstkey_compat(tdb
);
181 kbuf
= tdb_nextkey_compat(tdb
, kbuf
))
183 dbuf
= tdb_fetch_compat(tdb
, kbuf
);
188 if (strncmp((const char *)kbuf
.dptr
, FORMS_PREFIX
, strlen(FORMS_PREFIX
)) == 0) {
189 dump_form(ctx
, (const char *)kbuf
.dptr
+strlen(FORMS_PREFIX
), dbuf
.dptr
, dbuf
.dsize
);
190 SAFE_FREE(dbuf
.dptr
);
194 if (strncmp((const char *)kbuf
.dptr
, DRIVERS_PREFIX
, strlen(DRIVERS_PREFIX
)) == 0) {
195 dump_driver(ctx
, (const char *)kbuf
.dptr
+strlen(DRIVERS_PREFIX
), dbuf
.dptr
, dbuf
.dsize
);
196 SAFE_FREE(dbuf
.dptr
);
200 if (strncmp((const char *)kbuf
.dptr
, PRINTERS_PREFIX
, strlen(PRINTERS_PREFIX
)) == 0) {
201 dump_printer(ctx
, (const char *)kbuf
.dptr
+strlen(PRINTERS_PREFIX
), dbuf
.dptr
, dbuf
.dsize
);
202 SAFE_FREE(dbuf
.dptr
);
206 if (strncmp((const char *)kbuf
.dptr
, SECDESC_PREFIX
, strlen(SECDESC_PREFIX
)) == 0) {
207 dump_sd(ctx
, (const char *)kbuf
.dptr
+strlen(SECDESC_PREFIX
), dbuf
.dptr
, dbuf
.dsize
);
208 SAFE_FREE(dbuf
.dptr
);
221 static NTSTATUS
printing_migrate_internal(struct net_context
*c
,
222 const struct dom_sid
*domain_sid
,
223 const char *domain_name
,
224 struct cli_state
*cli
,
225 struct rpc_pipe_client
*pipe_hnd
,
235 tmp_ctx
= talloc_new(mem_ctx
);
236 if (tmp_ctx
== NULL
) {
237 return NT_STATUS_NO_MEMORY
;
240 tdb
= tdb_open_log(argv
[0], 0, TDB_DEFAULT
, O_RDONLY
, 0600);
242 d_fprintf(stderr
, _("failed to open tdb file: %s\n"), argv
[0]);
243 status
= NT_STATUS_NO_SUCH_FILE
;
247 for (kbuf
= tdb_firstkey_compat(tdb
);
249 kbuf
= tdb_nextkey_compat(tdb
, kbuf
))
251 dbuf
= tdb_fetch_compat(tdb
, kbuf
);
256 if (strncmp((const char *) kbuf
.dptr
, FORMS_PREFIX
, strlen(FORMS_PREFIX
)) == 0) {
257 printing_tdb_migrate_form(tmp_ctx
,
259 (const char *) kbuf
.dptr
+ strlen(FORMS_PREFIX
),
262 SAFE_FREE(dbuf
.dptr
);
266 if (strncmp((const char *) kbuf
.dptr
, DRIVERS_PREFIX
, strlen(DRIVERS_PREFIX
)) == 0) {
267 printing_tdb_migrate_driver(tmp_ctx
,
269 (const char *) kbuf
.dptr
+ strlen(DRIVERS_PREFIX
),
272 SAFE_FREE(dbuf
.dptr
);
276 if (strncmp((const char *) kbuf
.dptr
, PRINTERS_PREFIX
, strlen(PRINTERS_PREFIX
)) == 0) {
277 printing_tdb_migrate_printer(tmp_ctx
,
279 (const char *) kbuf
.dptr
+ strlen(PRINTERS_PREFIX
),
282 SAFE_FREE(dbuf
.dptr
);
286 if (strncmp((const char *) kbuf
.dptr
, SECDESC_PREFIX
, strlen(SECDESC_PREFIX
)) == 0) {
287 printing_tdb_migrate_secdesc(tmp_ctx
,
289 (const char *) kbuf
.dptr
+ strlen(SECDESC_PREFIX
),
292 SAFE_FREE(dbuf
.dptr
);
298 status
= NT_STATUS_OK
;
301 talloc_free(tmp_ctx
);
305 static int net_printing_migrate(struct net_context
*c
,
309 if (argc
< 1 || c
->display_usage
) {
311 "net printing migrate <file.tdb>\n"
314 _("Migrate tdb printing files to new storage"));
318 return run_rpc_command(c
,
320 &ndr_table_spoolss
.syntax_id
,
322 printing_migrate_internal
,
327 * 'net printing' entrypoint.
328 * @param argc Standard main() style argc.
329 * @param argv Standard main() style argv. Initial components are already
333 int net_printing(struct net_context
*c
, int argc
, const char **argv
)
337 struct functable func
[] = {
342 N_("Dump printer databases"),
343 N_("net printing dump\n"
344 " Dump tdb printing file")
349 net_printing_migrate
,
350 NET_TRANSPORT_LOCAL
| NET_TRANSPORT_RPC
,
351 N_("Migrate printer databases"),
352 N_("net printing migrate\n"
353 " Migrate tdb printing files to new storage")
356 { NULL
, NULL
, 0, NULL
, NULL
}
359 ret
= net_run_function(c
, argc
, argv
, "net printing", func
);