1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-08 21:18:16 +03:00

Split oLschema2ldif into library and binary

The oLschema2ldif program was contained in a single file, making reuse
of its parsing logic elsewhere impossible. With this change the majority
of the code is moved to a new file, "lib.c", while the CLI interface is
now in a "main.c" file.

End-of-line whitespace is also removed.

Signed-off-by: Michael Hanselmann <public@hansmi.ch>
Reviewed-by: Garming Sam <garming@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
This commit is contained in:
Michael Hanselmann 2019-03-23 02:57:06 +01:00 committed by Andrew Bartlett
parent af3253013a
commit 0c7c44a284
7 changed files with 206 additions and 129 deletions

View File

@ -1,4 +1,4 @@
/*
/*
ldb database library
Copyright (C) Simo Sorce 2005
@ -6,7 +6,7 @@
** NOTE! The following LGPL license applies to the ldb
** library. This does NOT imply that all of Samba is released
** under the LGPL
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
@ -32,11 +32,10 @@
*/
#include "includes.h"
#include "./lib.h"
#include "ldb.h"
#include "dsdb/samdb/samdb.h"
#include "../lib/crypto/sha256.h"
#include "../librpc/gen_ndr/ndr_misc.h"
#include "lib/cmdline/popt_common.h"
#define SCHEMA_UNKNOWN 0
#define SCHEMA_NAME 1
@ -53,19 +52,11 @@
#define SCHEMA_SYNTAX 12
#define SCHEMA_DESC 13
struct schema_conv {
int count;
int failures;
};
struct schema_token {
int type;
char *value;
};
struct ldb_context *ldb_ctx;
struct ldb_dn *basedn;
static int check_braces(const char *string)
{
size_t b;
@ -335,7 +326,7 @@ static struct schema_token *get_next_schema_token(TALLOC_CTX *ctx, char **string
return token;
}
static struct ldb_message *process_entry(TALLOC_CTX *mem_ctx, const char *entry)
static struct ldb_message *process_entry(TALLOC_CTX *mem_ctx, struct conv_options *opt, const char *entry)
{
TALLOC_CTX *ctx;
struct ldb_message *msg;
@ -424,7 +415,7 @@ static struct ldb_message *process_entry(TALLOC_CTX *mem_ctx, const char *entry)
MSG_ADD_STRING("cn", token->value);
MSG_ADD_STRING("name", token->value);
MSG_ADD_STRING("lDAPDisplayName", token->value);
msg->dn = ldb_dn_copy(msg, basedn);
msg->dn = ldb_dn_copy(msg, opt->basedn);
ldb_dn_add_child_fmt(msg->dn, "CN=%s,CN=Schema,CN=Configuration", token->value);
break;
@ -513,18 +504,17 @@ failed:
return NULL;
}
static struct schema_conv process_file(FILE *in, FILE *out)
struct schema_conv process_file(TALLOC_CTX *mem_ctx, struct conv_options *opt)
{
TALLOC_CTX *ctx;
struct schema_conv ret;
char *entry;
int c, t, line;
struct ldb_ldif ldif;
FILE *in = opt->in;
FILE *out = opt->out;
ldif.changetype = LDB_CHANGETYPE_NONE;
ctx = talloc_new(NULL);
ret.count = 0;
ret.failures = 0;
line = 0;
@ -543,23 +533,23 @@ static struct schema_conv process_file(FILE *in, FILE *out)
}
t = 0;
entry = talloc_array(ctx, char, 1024);
entry = talloc_array(mem_ctx, char, 1024);
if (entry == NULL) exit(-1);
do {
do {
if (c == '\n') {
int ret2 = 0;
entry[t] = '\0';
ret2 = check_braces(entry);
if (ret2 == 0) {
ret.count++;
ldif.msg = process_entry(ctx, entry);
ldif.msg = process_entry(mem_ctx, opt, entry);
if (ldif.msg == NULL) {
ret.failures++;
fprintf(stderr, "No valid msg from entry \n[%s]\n at line %d\n", entry, line);
break;
}
ldb_ldif_write_file(ldb_ctx, out, &ldif);
ldb_ldif_write_file(opt->ldb_ctx, out, &ldif);
break;
}
if (ret2 == 2) {
@ -573,22 +563,22 @@ static struct schema_conv process_file(FILE *in, FILE *out)
t++;
}
if ((t % 1023) == 0) {
entry = talloc_realloc(ctx, entry, char, t + 1024);
entry = talloc_realloc(mem_ctx, entry, char, t + 1024);
if (entry == NULL) exit(-1);
}
} while ((c = fgetc(in)) != EOF);
} while ((c = fgetc(in)) != EOF);
if (c != '\n') {
entry[t] = '\0';
if (check_braces(entry) == 0) {
ret.count++;
ldif.msg = process_entry(ctx, entry);
ldif.msg = process_entry(mem_ctx, opt, entry);
if (ldif.msg == NULL) {
ret.failures++;
fprintf(stderr, "No valid msg from entry \n[%s]\n at line %d\n", entry, line);
break;
}
ldb_ldif_write_file(ldb_ctx, out, &ldif);
ldb_ldif_write_file(opt->ldb_ctx, out, &ldif);
} else {
fprintf(stderr, "malformed entry on line %d\n", line);
ret.failures++;
@ -600,97 +590,3 @@ static struct schema_conv process_file(FILE *in, FILE *out)
return ret;
}
static struct options {
const char *basedn;
const char *input;
const char *output;
} options;
static struct poptOption popt_options[] = {
POPT_AUTOHELP
{ "basedn", 'b', POPT_ARG_STRING, &options.basedn, 0, "base DN", "DN" },
{ "input", 'I', POPT_ARG_STRING, &options.input, 0,
"inputfile of OpenLDAP style schema otherwise STDIN", "inputfile"},
{ "output", 'O', POPT_ARG_STRING, &options.output, 0,
"outputfile otherwise STDOUT", "outputfile"},
POPT_COMMON_VERSION
{ NULL }
};
static void usage(void)
{
poptContext pc;
printf("Usage: oLschema2ldif <options>\n");
printf("\nConvert OpenLDAP schema to AD-like LDIF format\n\n");
printf("Converts records from an openLdap formatted schema to an ldif schema\n\n");
pc = poptGetContext("oLschema2ldif", 0, NULL, popt_options,
POPT_CONTEXT_KEEP_FIRST);
poptPrintHelp(pc, stdout, 0);
exit(1);
}
int main(int argc, const char **argv)
{
TALLOC_CTX *ctx;
struct schema_conv ret;
FILE *in = stdin;
FILE *out = stdout;
poptContext pc;
int opt;
ctx = talloc_new(NULL);
ldb_ctx = ldb_init(ctx, NULL);
setenv("LDB_URL", "NONE", 1);
pc = poptGetContext(argv[0], argc, argv, popt_options,
POPT_CONTEXT_KEEP_FIRST);
while((opt = poptGetNextOpt(pc)) != -1) {
fprintf(stderr, "Invalid option %s: %s\n",
poptBadOption(pc, 0), poptStrerror(opt));
usage();
}
if (options.basedn == NULL) {
printf("Base DN not specified\n");
usage();
exit(1);
} else {
basedn = ldb_dn_new(ctx, ldb_ctx, options.basedn);
if ( ! ldb_dn_validate(basedn)) {
printf("Malformed Base DN\n");
usage();
exit(1);
}
}
if (options.input) {
in = fopen(options.input, "r");
if (!in) {
perror(options.input);
usage();
exit(1);
}
}
if (options.output) {
out = fopen(options.output, "w");
if (!out) {
perror(options.output);
usage();
exit(1);
}
}
ret = process_file(in, out);
fclose(in);
fclose(out);
printf("Converted %d records with %d failures\n", ret.count, ret.failures);
return 0;
}

View File

@ -0,0 +1,45 @@
/*
ldb database library
Copyright (C) Simo Sorce 2005
** NOTE! The following LGPL license applies to the ldb
** library. This does NOT imply that all of Samba is released
** under the LGPL
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _OLSCHEMA2LDIF_LIB_H
#define _OLSCHEMA2LDIF_LIB_H
#include "includes.h"
#include "ldb.h"
#include "dsdb/samdb/samdb.h"
struct schema_conv {
int count;
int failures;
};
struct conv_options {
struct ldb_context *ldb_ctx;
struct ldb_dn *basedn;
FILE *in;
FILE *out;
};
struct schema_conv process_file(TALLOC_CTX *mem_ctx, struct conv_options *opt);
#endif /* _OLSCHEMA2LDIF_LIB_H */

View File

@ -0,0 +1,132 @@
/*
ldb database library
Copyright (C) Simo Sorce 2005
** NOTE! The following LGPL license applies to the ldb
** library. This does NOT imply that all of Samba is released
** under the LGPL
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
/*
* Name: ldb
*
* Component: oLschema2ldif
*
* Description: utility to convert an OpenLDAP schema into AD LDIF
*
* Author: Simo Sorce
*/
#include "includes.h"
#include "./lib.h"
#include "lib/cmdline/popt_common.h"
static struct options {
const char *basedn;
const char *input;
const char *output;
} options;
static struct poptOption popt_options[] = {
POPT_AUTOHELP
{ "basedn", 'b', POPT_ARG_STRING, &options.basedn, 0, "base DN", "DN" },
{ "input", 'I', POPT_ARG_STRING, &options.input, 0,
"inputfile of OpenLDAP style schema otherwise STDIN", "inputfile"},
{ "output", 'O', POPT_ARG_STRING, &options.output, 0,
"outputfile otherwise STDOUT", "outputfile"},
POPT_COMMON_VERSION
{ NULL }
};
static void usage(void)
{
poptContext pc;
printf("Usage: oLschema2ldif <options>\n");
printf("\nConvert OpenLDAP schema to AD-like LDIF format\n\n");
printf("Converts records from an openLdap formatted schema to an ldif schema\n\n");
pc = poptGetContext("oLschema2ldif", 0, NULL, popt_options,
POPT_CONTEXT_KEEP_FIRST);
poptPrintHelp(pc, stdout, 0);
exit(1);
}
int main(int argc, const char **argv)
{
TALLOC_CTX *ctx;
struct schema_conv ret;
poptContext pc;
struct conv_options copt;
int opt;
ctx = talloc_new(NULL);
setenv("LDB_URL", "NONE", 1);
pc = poptGetContext(argv[0], argc, argv, popt_options,
POPT_CONTEXT_KEEP_FIRST);
while((opt = poptGetNextOpt(pc)) != -1) {
fprintf(stderr, "Invalid option %s: %s\n",
poptBadOption(pc, 0), poptStrerror(opt));
usage();
}
if (options.basedn == NULL) {
printf("Base DN not specified\n");
usage();
exit(1);
}
copt.in = stdin;
copt.out = stdout;
copt.ldb_ctx = ldb_init(ctx, NULL);
copt.basedn = ldb_dn_new(ctx, copt.ldb_ctx, options.basedn);
if (!ldb_dn_validate(copt.basedn)) {
printf("Malformed Base DN\n");
usage();
exit(1);
}
if (options.input) {
copt.in = fopen(options.input, "r");
if (!copt.in) {
perror(options.input);
usage();
exit(1);
}
}
if (options.output) {
copt.out = fopen(options.output, "w");
if (!copt.out) {
perror(options.output);
usage();
exit(1);
}
}
ret = process_file(ctx, &copt);
fclose(copt.in);
fclose(copt.out);
printf("Converted %d records with %d failures\n", ret.count, ret.failures);
return 0;
}

View File

@ -0,0 +1,12 @@
#!/usr/bin/env python
bld.SAMBA_SUBSYSTEM('oLschema2ldif-lib',
source='lib.c',
deps='samdb',
)
bld.SAMBA_BINARY('oLschema2ldif',
source='main.c',
manpages='oLschema2ldif.1',
deps='oLschema2ldif-lib POPT_SAMBA',
)

View File

@ -1,8 +0,0 @@
#!/usr/bin/env python
bld.SAMBA_BINARY('oLschema2ldif',
source='oLschema2ldif.c',
manpages='man/oLschema2ldif.1',
deps='samdb POPT_SAMBA'
)

View File

@ -94,7 +94,7 @@ bld.RECURSE('source4/nbt_server')
bld.RECURSE('source4/wrepl_server')
bld.RECURSE('source4/cldap_server')
bld.RECURSE('source4/ntp_signd')
bld.RECURSE('source4/utils')
bld.RECURSE('source4/utils/oLschema2ldif')
bld.RECURSE('source4/ntvfs')
bld.RECURSE('source4/torture')
bld.RECURSE('librpc')