Lines 13-18
Link Here
|
13 |
* ditched dNSDomain2 schema support. Version 0.3-ALPHA |
13 |
* ditched dNSDomain2 schema support. Version 0.3-ALPHA |
14 |
*/ |
14 |
*/ |
15 |
|
15 |
|
|
|
16 |
#define LDAP_DEPRECATED 1 |
17 |
|
16 |
#include <errno.h> |
18 |
#include <errno.h> |
17 |
#include <string.h> |
19 |
#include <string.h> |
18 |
#include <stdlib.h> |
20 |
#include <stdlib.h> |
Lines 24-29
Link Here
|
24 |
#include <isc/hash.h> |
26 |
#include <isc/hash.h> |
25 |
#include <isc/mem.h> |
27 |
#include <isc/mem.h> |
26 |
#include <isc/print.h> |
28 |
#include <isc/print.h> |
|
|
29 |
#include <isc/hash.h> |
27 |
#include <isc/result.h> |
30 |
#include <isc/result.h> |
28 |
|
31 |
|
29 |
#include <dns/db.h> |
32 |
#include <dns/db.h> |
Lines 59-74
typedef struct LDAP_INFO
Link Here
|
59 |
ldap_info; |
62 |
ldap_info; |
60 |
|
63 |
|
61 |
/* usage Info */ |
64 |
/* usage Info */ |
62 |
void usage (); |
65 |
void usage (void); |
|
|
66 |
|
67 |
/* Check for existence of (and possibly add) containing dNSZone objects */ |
68 |
int lookup_dns_zones( ldap_info *ldinfo); |
63 |
|
69 |
|
64 |
/* Add to the ldap dit */ |
70 |
/* Add to the ldap dit */ |
65 |
void add_ldap_values (ldap_info * ldinfo); |
71 |
void add_ldap_values (ldap_info * ldinfo); |
66 |
|
72 |
|
67 |
/* Init an ldap connection */ |
73 |
/* Init an ldap connection */ |
68 |
void init_ldap_conn (); |
74 |
void init_ldap_conn (void); |
69 |
|
75 |
|
70 |
/* Ldap error checking */ |
76 |
/* Ldap error checking */ |
71 |
void ldap_result_check (char *msg, char *dn, int err); |
77 |
void ldap_result_check (const char *msg, char *dn, int err); |
72 |
|
78 |
|
73 |
/* Put a hostname into a char ** array */ |
79 |
/* Put a hostname into a char ** array */ |
74 |
char **hostname_to_dn_list (char *hostname, char *zone, unsigned int flags); |
80 |
char **hostname_to_dn_list (char *hostname, char *zone, unsigned int flags); |
Lines 77-90
char **hostname_to_dn_list (char *hostname, char *zone, unsigned int flags);
Link Here
|
77 |
int get_attr_list_size (char **tmp); |
83 |
int get_attr_list_size (char **tmp); |
78 |
|
84 |
|
79 |
/* Get a DN */ |
85 |
/* Get a DN */ |
80 |
char *build_dn_from_dc_list (char **dc_list, unsigned int ttl, int flag); |
86 |
char *build_dn_from_dc_list (char **dc_list, unsigned int ttl, int flag, char *zone); |
81 |
|
87 |
|
82 |
/* Add to RR list */ |
88 |
/* Add to RR list */ |
83 |
void add_to_rr_list (char *dn, char *name, char *type, char *data, |
89 |
void add_to_rr_list (char *dn, char *name, char *type, char *data, |
84 |
unsigned int ttl, unsigned int flags); |
90 |
unsigned int ttl, unsigned int flags); |
85 |
|
91 |
|
86 |
/* Error checking */ |
92 |
/* Error checking */ |
87 |
void isc_result_check (isc_result_t res, char *errorstr); |
93 |
void isc_result_check (isc_result_t res, const char *errorstr); |
88 |
|
94 |
|
89 |
/* Generate LDIF Format files */ |
95 |
/* Generate LDIF Format files */ |
90 |
void generate_ldap (dns_name_t * dnsname, dns_rdata_t * rdata, |
96 |
void generate_ldap (dns_name_t * dnsname, dns_rdata_t * rdata, |
Lines 93-103
void generate_ldap (dns_name_t * dnsname, dns_rdata_t * rdata,
Link Here
|
93 |
/* head pointer to the list */ |
99 |
/* head pointer to the list */ |
94 |
ldap_info *ldap_info_base = NULL; |
100 |
ldap_info *ldap_info_base = NULL; |
95 |
|
101 |
|
96 |
char *argzone, *ldapbase, *binddn, *bindpw = NULL; |
102 |
ldap_info * |
97 |
char *ldapsystem = "localhost"; |
103 |
locate_by_dn (char *dn); |
98 |
static char *objectClasses[] = |
104 |
void |
99 |
{ "top", "dNSZone", NULL }; |
105 |
init_ldap_conn (); |
100 |
static char *topObjectClasses[] = { "top", NULL }; |
106 |
void usage(); |
|
|
107 |
|
108 |
static char *argzone, *ldapbase, *binddn, *bindpw = NULL; |
109 |
|
110 |
/* these are needed to placate gcc4's const-ness const-ernations : */ |
111 |
static char localhost[] = "localhost"; |
112 |
static char *ldapsystem=&(localhost[0]); |
113 |
/* dnszone schema class names: */ |
114 |
static char topClass [] ="top"; |
115 |
static char dNSZoneClass[] ="dNSZone"; |
116 |
static char objectClass [] ="objectClass"; |
117 |
static char dcObjectClass[]="dcObject"; |
118 |
/* dnszone schema attribute names: */ |
119 |
static char relativeDomainName[]="relativeDomainName"; |
120 |
static char dNSTTL []="dNSTTL"; |
121 |
static char zoneName []="zoneName"; |
122 |
static char dc []="dc"; |
123 |
static char sameZone []="@"; |
124 |
/* LDAPMod mod_values: */ |
125 |
static char *objectClasses []= { &(topClass[0]), &(dNSZoneClass[0]), NULL }; |
126 |
static char *topObjectClasses []= { &(topClass[0]), &(dcObjectClass[0]), &(dNSZoneClass[0]), NULL }; |
127 |
static char *dn_buffer [64]={NULL}; |
128 |
|
101 |
LDAP *conn; |
129 |
LDAP *conn; |
102 |
unsigned int debug = 0; |
130 |
unsigned int debug = 0; |
103 |
|
131 |
|
Lines 106-124
debug = 1;
Link Here
|
106 |
#endif |
134 |
#endif |
107 |
|
135 |
|
108 |
int |
136 |
int |
109 |
main (int *argc, char **argv) |
137 |
main (int argc, char **argv) |
110 |
{ |
138 |
{ |
111 |
isc_mem_t *mctx = NULL; |
139 |
isc_mem_t *mctx = NULL; |
112 |
isc_entropy_t *ectx = NULL; |
140 |
isc_entropy_t *ectx = NULL; |
113 |
isc_result_t result; |
141 |
isc_result_t result; |
114 |
char *basedn; |
142 |
char *basedn; |
115 |
ldap_info *tmp; |
143 |
ldap_info *tmp; |
116 |
LDAPMod *base_attrs[2]; |
144 |
LDAPMod *base_attrs[5]; |
117 |
LDAPMod base; |
145 |
LDAPMod base, dcBase, znBase, rdnBase; |
118 |
isc_buffer_t buff; |
146 |
isc_buffer_t buff; |
119 |
char *zonefile; |
147 |
char *zonefile=0L; |
120 |
char fullbasedn[1024]; |
148 |
char fullbasedn[1024]; |
121 |
char *ctmp; |
149 |
char *ctmp, *zn, *dcp[2], *znp[2], *rdn[2]; |
122 |
dns_fixedname_t fixedzone, fixedname; |
150 |
dns_fixedname_t fixedzone, fixedname; |
123 |
dns_rdataset_t rdataset; |
151 |
dns_rdataset_t rdataset; |
124 |
char **dc_list; |
152 |
char **dc_list; |
Lines 131-137
main (int *argc, char **argv)
Link Here
|
131 |
extern char *optarg; |
159 |
extern char *optarg; |
132 |
extern int optind, opterr, optopt; |
160 |
extern int optind, opterr, optopt; |
133 |
int create_base = 0; |
161 |
int create_base = 0; |
134 |
int topt; |
162 |
int topt, dcn, zdn, znlen; |
135 |
|
163 |
|
136 |
if ((int) argc < 2) |
164 |
if ((int) argc < 2) |
137 |
{ |
165 |
{ |
Lines 139-145
main (int *argc, char **argv)
Link Here
|
139 |
exit (-1); |
167 |
exit (-1); |
140 |
} |
168 |
} |
141 |
|
169 |
|
142 |
while ((topt = getopt ((int) argc, argv, "D:w:b:z:f:h:?dcv")) != -1) |
170 |
while ((topt = getopt ((int) argc, argv, "D:Ww:b:z:f:h:?dcv")) != -1) |
143 |
{ |
171 |
{ |
144 |
switch (topt) |
172 |
switch (topt) |
145 |
{ |
173 |
{ |
Lines 158-165
main (int *argc, char **argv)
Link Here
|
158 |
case 'w': |
186 |
case 'w': |
159 |
bindpw = strdup (optarg); |
187 |
bindpw = strdup (optarg); |
160 |
break; |
188 |
break; |
|
|
189 |
case 'W': |
190 |
bindpw = getpass("Enter LDAP Password: "); |
191 |
break; |
161 |
case 'b': |
192 |
case 'b': |
162 |
ldapbase = strdup (optarg); |
193 |
ldapbase = strdup (optarg); |
163 |
break; |
194 |
break; |
164 |
case 'z': |
195 |
case 'z': |
165 |
argzone = strdup (optarg); |
196 |
argzone = strdup (optarg); |
Lines 271-297
main (int *argc, char **argv)
Link Here
|
271 |
{ |
302 |
{ |
272 |
if (debug) |
303 |
if (debug) |
273 |
printf ("Creating base zone DN %s\n", argzone); |
304 |
printf ("Creating base zone DN %s\n", argzone); |
274 |
|
305 |
|
275 |
dc_list = hostname_to_dn_list (argzone, argzone, DNS_TOP); |
306 |
dc_list = hostname_to_dn_list (argzone, argzone, DNS_TOP); |
276 |
basedn = build_dn_from_dc_list (dc_list, 0, NO_SPEC); |
|
|
277 |
|
307 |
|
278 |
for (ctmp = &basedn[strlen (basedn)]; ctmp >= &basedn[0]; ctmp--) |
308 |
basedn = build_dn_from_dc_list (dc_list, 0, NO_SPEC, argzone); |
|
|
309 |
if (debug) |
310 |
printf ("base DN %s\n", basedn); |
311 |
|
312 |
for (ctmp = &basedn[strlen (basedn)], dcn=0; ctmp >= &basedn[0]; ctmp--) |
279 |
{ |
313 |
{ |
280 |
if ((*ctmp == ',') || (ctmp == &basedn[0])) |
314 |
if ((*ctmp == ',') || (ctmp == &basedn[0])) |
281 |
{ |
315 |
{ |
|
|
316 |
|
282 |
base.mod_op = LDAP_MOD_ADD; |
317 |
base.mod_op = LDAP_MOD_ADD; |
283 |
base.mod_type = "objectClass"; |
318 |
base.mod_type = objectClass; |
284 |
base.mod_values = topObjectClasses; |
319 |
base.mod_values = topObjectClasses; |
285 |
base_attrs[0] = &base; |
320 |
base_attrs[0] = (void*)&base; |
286 |
base_attrs[1] = NULL; |
321 |
|
|
|
322 |
dcBase.mod_op = LDAP_MOD_ADD; |
323 |
dcBase.mod_type = dc; |
324 |
dcp[0]=dc_list[dcn]; |
325 |
dcp[1]=0L; |
326 |
dcBase.mod_values=dcp; |
327 |
base_attrs[1] = (void*)&dcBase; |
328 |
|
329 |
znBase.mod_op = LDAP_MOD_ADD; |
330 |
znBase.mod_type = zoneName; |
331 |
for( zdn = dcn, znlen = 0; zdn >= 0; zdn-- ) |
332 |
znlen += strlen(dc_list[zdn])+1; |
333 |
znp[0] = (char*)malloc(znlen+1); |
334 |
znp[1] = 0L; |
335 |
for( zdn = dcn, zn=znp[0]; zdn >= 0; zdn-- ) |
336 |
zn+=sprintf(zn,"%s%s",dc_list[zdn], |
337 |
((zdn > 0) && (*(dc_list[zdn-1])!='.')) ? "." : "" |
338 |
); |
339 |
|
340 |
znBase.mod_values = znp; |
341 |
base_attrs[2] = (void*)&znBase; |
342 |
|
343 |
rdnBase.mod_op = LDAP_MOD_ADD; |
344 |
rdnBase.mod_type = relativeDomainName; |
345 |
rdn[0] = strdup(sameZone); |
346 |
rdn[1] = 0L; |
347 |
rdnBase.mod_values = rdn; |
348 |
base_attrs[3] = (void*)&rdnBase; |
349 |
|
350 |
dcn++; |
287 |
|
351 |
|
|
|
352 |
base.mod_values = topObjectClasses; |
353 |
base_attrs[4] = NULL; |
354 |
|
288 |
if (ldapbase) |
355 |
if (ldapbase) |
289 |
{ |
356 |
{ |
290 |
if (ctmp != &basedn[0]) |
357 |
if (ctmp != &basedn[0]) |
291 |
sprintf (fullbasedn, "%s,%s", ctmp + 1, ldapbase); |
358 |
sprintf (fullbasedn, "%s,%s", ctmp + 1, ldapbase); |
292 |
else |
359 |
else |
293 |
sprintf (fullbasedn, "%s,%s", ctmp, ldapbase); |
360 |
sprintf (fullbasedn, "%s,%s", ctmp, ldapbase); |
294 |
|
|
|
295 |
} |
361 |
} |
296 |
else |
362 |
else |
297 |
{ |
363 |
{ |
Lines 300-307
main (int *argc, char **argv)
Link Here
|
300 |
else |
366 |
else |
301 |
sprintf (fullbasedn, "%s", ctmp); |
367 |
sprintf (fullbasedn, "%s", ctmp); |
302 |
} |
368 |
} |
|
|
369 |
|
370 |
if( debug ) |
371 |
printf("Full base dn: %s\n", fullbasedn); |
372 |
|
303 |
result = ldap_add_s (conn, fullbasedn, base_attrs); |
373 |
result = ldap_add_s (conn, fullbasedn, base_attrs); |
304 |
ldap_result_check ("intial ldap_add_s", fullbasedn, result); |
374 |
ldap_result_check ("intial ldap_add_s", fullbasedn, result); |
|
|
375 |
|
305 |
} |
376 |
} |
306 |
|
377 |
|
307 |
} |
378 |
} |
Lines 339-345
main (int *argc, char **argv)
Link Here
|
339 |
* I should probably rename this function, as not to cause any |
410 |
* I should probably rename this function, as not to cause any |
340 |
* confusion with the isc* routines. Will exit on error. */ |
411 |
* confusion with the isc* routines. Will exit on error. */ |
341 |
void |
412 |
void |
342 |
isc_result_check (isc_result_t res, char *errorstr) |
413 |
isc_result_check (isc_result_t res, const char *errorstr) |
343 |
{ |
414 |
{ |
344 |
if (res != ISC_R_SUCCESS) |
415 |
if (res != ISC_R_SUCCESS) |
345 |
{ |
416 |
{ |
Lines 379-392
generate_ldap (dns_name_t * dnsname, dns_rdata_t * rdata, unsigned int ttl)
Link Here
|
379 |
isc_result_check (result, "dns_rdata_totext"); |
450 |
isc_result_check (result, "dns_rdata_totext"); |
380 |
data[isc_buffer_usedlength (&buff)] = 0; |
451 |
data[isc_buffer_usedlength (&buff)] = 0; |
381 |
|
452 |
|
382 |
dc_list = hostname_to_dn_list (name, argzone, DNS_OBJECT); |
453 |
dc_list = hostname_to_dn_list ((char*)name, argzone, DNS_OBJECT); |
383 |
len = (get_attr_list_size (dc_list) - 2); |
454 |
len = (get_attr_list_size (dc_list) - 2); |
384 |
dn = build_dn_from_dc_list (dc_list, ttl, WI_SPEC); |
455 |
dn = build_dn_from_dc_list (dc_list, ttl, WI_SPEC, argzone); |
385 |
|
456 |
|
386 |
if (debug) |
457 |
if (debug) |
387 |
printf ("Adding %s (%s %s) to run queue list.\n", dn, type, data); |
458 |
printf ("Adding %s (%s %s) to run queue list.\n", dn, type, data); |
388 |
|
459 |
|
389 |
add_to_rr_list (dn, dc_list[len], type, data, ttl, DNS_OBJECT); |
460 |
add_to_rr_list (dn, dc_list[len], (char*)type, (char*)data, ttl, DNS_OBJECT); |
390 |
} |
461 |
} |
391 |
|
462 |
|
392 |
|
463 |
|
Lines 426-432
add_to_rr_list (char *dn, char *name, char *type,
Link Here
|
426 |
int attrlist; |
497 |
int attrlist; |
427 |
char ldap_type_buffer[128]; |
498 |
char ldap_type_buffer[128]; |
428 |
char charttl[64]; |
499 |
char charttl[64]; |
429 |
|
500 |
char *zn; |
|
|
501 |
int znlen; |
430 |
|
502 |
|
431 |
if ((tmp = locate_by_dn (dn)) == NULL) |
503 |
if ((tmp = locate_by_dn (dn)) == NULL) |
432 |
{ |
504 |
{ |
Lines 451-457
add_to_rr_list (char *dn, char *name, char *type,
Link Here
|
451 |
exit (-1); |
523 |
exit (-1); |
452 |
} |
524 |
} |
453 |
|
525 |
|
454 |
for (i = 0; i < flags; i++) |
526 |
for (i = 0; i < (int)flags; i++) |
455 |
{ |
527 |
{ |
456 |
tmp->attrs[i] = (LDAPMod *) malloc (sizeof (LDAPMod)); |
528 |
tmp->attrs[i] = (LDAPMod *) malloc (sizeof (LDAPMod)); |
457 |
if (tmp->attrs[i] == (LDAPMod *) NULL) |
529 |
if (tmp->attrs[i] == (LDAPMod *) NULL) |
Lines 461-473
add_to_rr_list (char *dn, char *name, char *type,
Link Here
|
461 |
} |
533 |
} |
462 |
} |
534 |
} |
463 |
tmp->attrs[0]->mod_op = LDAP_MOD_ADD; |
535 |
tmp->attrs[0]->mod_op = LDAP_MOD_ADD; |
464 |
tmp->attrs[0]->mod_type = "objectClass"; |
536 |
tmp->attrs[0]->mod_type = objectClass; |
465 |
|
537 |
|
466 |
if (flags == DNS_OBJECT) |
538 |
if (flags == DNS_OBJECT) |
467 |
tmp->attrs[0]->mod_values = objectClasses; |
539 |
tmp->attrs[0]->mod_values = objectClasses; |
468 |
else |
540 |
else |
469 |
{ |
541 |
{ |
470 |
tmp->attrs[0]->mod_values = topObjectClasses; |
542 |
tmp->attrs[0]->mod_values =topObjectClasses; |
471 |
tmp->attrs[1] = NULL; |
543 |
tmp->attrs[1] = NULL; |
472 |
tmp->attrcnt = 2; |
544 |
tmp->attrcnt = 2; |
473 |
tmp->next = ldap_info_base; |
545 |
tmp->next = ldap_info_base; |
Lines 476-482
add_to_rr_list (char *dn, char *name, char *type,
Link Here
|
476 |
} |
548 |
} |
477 |
|
549 |
|
478 |
tmp->attrs[1]->mod_op = LDAP_MOD_ADD; |
550 |
tmp->attrs[1]->mod_op = LDAP_MOD_ADD; |
479 |
tmp->attrs[1]->mod_type = "relativeDomainName"; |
551 |
tmp->attrs[1]->mod_type = relativeDomainName; |
480 |
tmp->attrs[1]->mod_values = (char **) calloc (sizeof (char *), 2); |
552 |
tmp->attrs[1]->mod_values = (char **) calloc (sizeof (char *), 2); |
481 |
|
553 |
|
482 |
if (tmp->attrs[1]->mod_values == (char **)NULL) |
554 |
if (tmp->attrs[1]->mod_values == (char **)NULL) |
Lines 498-504
add_to_rr_list (char *dn, char *name, char *type,
Link Here
|
498 |
tmp->attrs[2]->mod_values[1] = NULL; |
570 |
tmp->attrs[2]->mod_values[1] = NULL; |
499 |
|
571 |
|
500 |
tmp->attrs[3]->mod_op = LDAP_MOD_ADD; |
572 |
tmp->attrs[3]->mod_op = LDAP_MOD_ADD; |
501 |
tmp->attrs[3]->mod_type = "dNSTTL"; |
573 |
tmp->attrs[3]->mod_type = dNSTTL; |
502 |
tmp->attrs[3]->mod_values = (char **) calloc (sizeof (char *), 2); |
574 |
tmp->attrs[3]->mod_values = (char **) calloc (sizeof (char *), 2); |
503 |
|
575 |
|
504 |
if (tmp->attrs[3]->mod_values == (char **)NULL) |
576 |
if (tmp->attrs[3]->mod_values == (char **)NULL) |
Lines 508-517
add_to_rr_list (char *dn, char *name, char *type,
Link Here
|
508 |
tmp->attrs[3]->mod_values[0] = strdup (charttl); |
580 |
tmp->attrs[3]->mod_values[0] = strdup (charttl); |
509 |
tmp->attrs[3]->mod_values[1] = NULL; |
581 |
tmp->attrs[3]->mod_values[1] = NULL; |
510 |
|
582 |
|
|
|
583 |
znlen=strlen(gbl_zone); |
584 |
if ( *(gbl_zone + (znlen-1)) == '.' ) |
585 |
{ /* ldapdb MUST search by relative zone name */ |
586 |
zn = (char*)malloc(znlen); |
587 |
strncpy(zn,gbl_zone,znlen-1); |
588 |
*(zn + (znlen-1))='\0'; |
589 |
}else |
590 |
{ |
591 |
zn = gbl_zone; |
592 |
} |
593 |
|
511 |
tmp->attrs[4]->mod_op = LDAP_MOD_ADD; |
594 |
tmp->attrs[4]->mod_op = LDAP_MOD_ADD; |
512 |
tmp->attrs[4]->mod_type = "zoneName"; |
595 |
tmp->attrs[4]->mod_type = zoneName; |
513 |
tmp->attrs[4]->mod_values = (char **)calloc(sizeof(char *), 2); |
596 |
tmp->attrs[4]->mod_values = (char **)calloc(sizeof(char *), 2); |
514 |
tmp->attrs[4]->mod_values[0] = gbl_zone; |
597 |
tmp->attrs[4]->mod_values[0] = zn; |
515 |
tmp->attrs[4]->mod_values[1] = NULL; |
598 |
tmp->attrs[4]->mod_values[1] = NULL; |
516 |
|
599 |
|
517 |
tmp->attrs[5] = NULL; |
600 |
tmp->attrs[5] = NULL; |
Lines 522-528
add_to_rr_list (char *dn, char *name, char *type,
Link Here
|
522 |
else |
605 |
else |
523 |
{ |
606 |
{ |
524 |
|
607 |
|
525 |
for (i = 0; tmp->attrs[i] != NULL; i++) |
608 |
for (i = 0; tmp->attrs[i] != NULL; i++) |
526 |
{ |
609 |
{ |
527 |
sprintf (ldap_type_buffer, "%sRecord", type); |
610 |
sprintf (ldap_type_buffer, "%sRecord", type); |
528 |
if (!strncmp |
611 |
if (!strncmp |
Lines 591-659
char **
Link Here
|
591 |
hostname_to_dn_list (char *hostname, char *zone, unsigned int flags) |
674 |
hostname_to_dn_list (char *hostname, char *zone, unsigned int flags) |
592 |
{ |
675 |
{ |
593 |
char *tmp; |
676 |
char *tmp; |
594 |
static char *dn_buffer[64]; |
|
|
595 |
int i = 0; |
677 |
int i = 0; |
596 |
char *zname; |
678 |
char *hname=0L, *last=0L; |
597 |
char *hnamebuff; |
679 |
int hlen=strlen(hostname), zlen=(strlen(zone)); |
598 |
|
680 |
|
599 |
zname = strdup (hostname); |
681 |
/* printf("hostname: %s zone: %s\n",hostname, zone); */ |
600 |
|
682 |
hname=0L; |
601 |
if (flags == DNS_OBJECT) |
683 |
if(flags == DNS_OBJECT) |
602 |
{ |
684 |
{ |
603 |
|
685 |
if( (zone[ zlen - 1 ] == '.') && (hostname[hlen - 1] != '.') ) |
604 |
if (strlen (zname) != strlen (zone)) |
686 |
{ |
605 |
{ |
687 |
hname=(char*)malloc(hlen + 1); |
606 |
tmp = &zname[strlen (zname) - strlen (zone)]; |
688 |
hlen += 1; |
607 |
*--tmp = '\0'; |
689 |
sprintf(hname, "%s.", hostname); |
608 |
hnamebuff = strdup (zname); |
690 |
hostname = hname; |
609 |
zname = ++tmp; |
691 |
} |
610 |
} |
692 |
if(strcmp(hostname, zone) == 0) |
611 |
else |
693 |
{ |
612 |
hnamebuff = "@"; |
694 |
if( hname == 0 ) |
613 |
} |
695 |
hname=strdup(hostname); |
614 |
else |
696 |
last = strdup(sameZone); |
615 |
{ |
697 |
}else |
616 |
zname = zone; |
698 |
{ |
617 |
hnamebuff = NULL; |
699 |
if( (hlen < zlen) |
618 |
} |
700 |
||( strcmp( hostname + (hlen - zlen), zone ) != 0) |
619 |
|
701 |
) |
620 |
for (tmp = strrchr (zname, '.'); tmp != (char *) 0; |
702 |
{ |
621 |
tmp = strrchr (zname, '.')) |
703 |
if( hname != 0 ) |
622 |
{ |
704 |
free(hname); |
623 |
*tmp++ = '\0'; |
705 |
hname=(char*)malloc( hlen + zlen + 1); |
624 |
dn_buffer[i++] = tmp; |
706 |
if( *zone == '.' ) |
625 |
} |
707 |
sprintf(hname, "%s%s", hostname, zone); |
626 |
dn_buffer[i++] = zname; |
708 |
else |
627 |
dn_buffer[i++] = hnamebuff; |
709 |
sprintf(hname,"%s",zone); |
|
|
710 |
}else |
711 |
{ |
712 |
if( hname == 0 ) |
713 |
hname = strdup(hostname); |
714 |
} |
715 |
last = hname; |
716 |
} |
717 |
}else |
718 |
{ /* flags == DNS_TOP */ |
719 |
hname = strdup(zone); |
720 |
last = hname; |
721 |
} |
722 |
|
723 |
for (tmp = strrchr (hname, '.'); tmp != (char *) 0; |
724 |
tmp = strrchr (hname, '.')) |
725 |
{ |
726 |
if( *( tmp + 1 ) != '\0' ) |
727 |
{ |
728 |
*tmp = '\0'; |
729 |
dn_buffer[i++] = ++tmp; |
730 |
}else |
731 |
{ /* trailing '.' ! */ |
732 |
dn_buffer[i++] = strdup("."); |
733 |
*tmp = '\0'; |
734 |
if( tmp == hname ) |
735 |
break; |
736 |
} |
737 |
} |
738 |
if( ( last != hname ) && (tmp != hname) ) |
739 |
dn_buffer[i++] = hname; |
740 |
dn_buffer[i++] = last; |
628 |
dn_buffer[i] = NULL; |
741 |
dn_buffer[i] = NULL; |
629 |
|
|
|
630 |
return dn_buffer; |
742 |
return dn_buffer; |
631 |
} |
743 |
} |
632 |
|
744 |
|
633 |
|
|
|
634 |
/* build an sdb compatible LDAP DN from a "dc_list" (char **). |
745 |
/* build an sdb compatible LDAP DN from a "dc_list" (char **). |
635 |
* will append dNSTTL information to each RR Record, with the |
746 |
* will append dNSTTL information to each RR Record, with the |
636 |
* exception of "@"/SOA. */ |
747 |
* exception of "@"/SOA. */ |
637 |
|
748 |
|
638 |
char * |
749 |
char * |
639 |
build_dn_from_dc_list (char **dc_list, unsigned int ttl, int flag) |
750 |
build_dn_from_dc_list (char **dc_list, unsigned int ttl, int flag, char *zone) |
640 |
{ |
751 |
{ |
641 |
int size; |
752 |
int size; |
642 |
int x; |
753 |
int x, znlen; |
643 |
static char dn[1024]; |
754 |
static char dn[1024]; |
644 |
char tmp[128]; |
755 |
char tmp[128]; |
|
|
756 |
char zn[DNS_NAME_MAXTEXT+1]; |
645 |
|
757 |
|
646 |
bzero (tmp, sizeof (tmp)); |
758 |
bzero (tmp, sizeof (tmp)); |
647 |
bzero (dn, sizeof (dn)); |
759 |
bzero (dn, sizeof (dn)); |
648 |
size = get_attr_list_size (dc_list); |
760 |
size = get_attr_list_size (dc_list); |
|
|
761 |
znlen = strlen(zone); |
762 |
if ( *(zone + (znlen-1)) == '.' ) |
763 |
{ /* ldapdb MUST search by relative zone name */ |
764 |
memcpy(&(zn[0]),zone,znlen-1); |
765 |
*(zn + (znlen-1))='\0'; |
766 |
zone = zn; |
767 |
} |
649 |
for (x = size - 2; x > 0; x--) |
768 |
for (x = size - 2; x > 0; x--) |
650 |
{ |
769 |
{ |
651 |
if (flag == WI_SPEC) |
770 |
if (flag == WI_SPEC) |
652 |
{ |
771 |
{ |
653 |
if (x == (size - 2) && (strncmp (dc_list[x], "@", 1) == 0) && (ttl)) |
772 |
if (x == (size - 2) && (strncmp (dc_list[x], "@", 1) == 0) && (ttl)) |
654 |
sprintf (tmp, "relativeDomainName=%s + dNSTTL=%d,", dc_list[x], ttl); |
773 |
sprintf (tmp, "zoneName=%s + relativeDomainName=%s,", zone, dc_list[x]); |
655 |
else if (x == (size - 2)) |
774 |
else if (x == (size - 2)) |
656 |
sprintf(tmp, "relativeDomainName=%s,",dc_list[x]); |
775 |
sprintf(tmp, "zoneName=%s + relativeDomainName=%s,", zone, dc_list[x]); |
657 |
else |
776 |
else |
658 |
sprintf(tmp,"dc=%s,", dc_list[x]); |
777 |
sprintf(tmp,"dc=%s,", dc_list[x]); |
659 |
} |
778 |
} |
Lines 679-684
void
Link Here
|
679 |
init_ldap_conn () |
798 |
init_ldap_conn () |
680 |
{ |
799 |
{ |
681 |
int result; |
800 |
int result; |
|
|
801 |
char ldb_tag[]="LDAP Bind"; |
682 |
conn = ldap_open (ldapsystem, LDAP_PORT); |
802 |
conn = ldap_open (ldapsystem, LDAP_PORT); |
683 |
if (conn == NULL) |
803 |
if (conn == NULL) |
684 |
{ |
804 |
{ |
Lines 688-699
init_ldap_conn ()
Link Here
|
688 |
} |
808 |
} |
689 |
|
809 |
|
690 |
result = ldap_simple_bind_s (conn, binddn, bindpw); |
810 |
result = ldap_simple_bind_s (conn, binddn, bindpw); |
691 |
ldap_result_check ("ldap_simple_bind_s", "LDAP Bind", result); |
811 |
ldap_result_check ("ldap_simple_bind_s", ldb_tag , result); |
692 |
} |
812 |
} |
693 |
|
813 |
|
694 |
/* Like isc_result_check, only for LDAP */ |
814 |
/* Like isc_result_check, only for LDAP */ |
695 |
void |
815 |
void |
696 |
ldap_result_check (char *msg, char *dn, int err) |
816 |
ldap_result_check (const char *msg, char *dn, int err) |
697 |
{ |
817 |
{ |
698 |
if ((err != LDAP_SUCCESS) && (err != LDAP_ALREADY_EXISTS)) |
818 |
if ((err != LDAP_SUCCESS) && (err != LDAP_ALREADY_EXISTS)) |
699 |
{ |
819 |
{ |
Lines 705-712
ldap_result_check (char *msg, char *dn, int err)
Link Here
|
705 |
} |
825 |
} |
706 |
} |
826 |
} |
707 |
|
827 |
|
708 |
|
|
|
709 |
|
710 |
/* For running the ldap_info run queue. */ |
828 |
/* For running the ldap_info run queue. */ |
711 |
void |
829 |
void |
712 |
add_ldap_values (ldap_info * ldinfo) |
830 |
add_ldap_values (ldap_info * ldinfo) |
Lines 714-727
add_ldap_values (ldap_info * ldinfo)
Link Here
|
714 |
int result; |
832 |
int result; |
715 |
char dnbuffer[1024]; |
833 |
char dnbuffer[1024]; |
716 |
|
834 |
|
717 |
|
|
|
718 |
if (ldapbase != NULL) |
835 |
if (ldapbase != NULL) |
719 |
sprintf (dnbuffer, "%s,%s", ldinfo->dn, ldapbase); |
836 |
sprintf (dnbuffer, "%s,%s", ldinfo->dn, ldapbase); |
720 |
else |
837 |
else |
721 |
sprintf (dnbuffer, "%s", ldinfo->dn); |
838 |
sprintf (dnbuffer, "%s", ldinfo->dn); |
722 |
|
839 |
|
723 |
result = ldap_add_s (conn, dnbuffer, ldinfo->attrs); |
840 |
result = ldap_add_s (conn, dnbuffer, ldinfo->attrs); |
724 |
ldap_result_check ("ldap_add_s", dnbuffer, result); |
841 |
ldap_result_check ("ldap_add_s", dnbuffer, result); |
|
|
842 |
|
725 |
} |
843 |
} |
726 |
|
844 |
|
727 |
|
845 |
|
Lines 732-736
void
Link Here
|
732 |
usage () |
850 |
usage () |
733 |
{ |
851 |
{ |
734 |
fprintf (stderr, |
852 |
fprintf (stderr, |
735 |
"zone2ldap -D [BIND DN] -w [BIND PASSWORD] -b [BASE DN] -z [ZONE] -f [ZONE FILE] -h [LDAP HOST] |
853 |
"zone2ldap -D [BIND DN] [-w BIND PASSWORD | -W:prompt] -b [BASE DN] -z [ZONE] -f [ZONE FILE] -h [LDAP HOST]\n" |
736 |
[-c Create LDAP Base structure][-d Debug Output (lots !)] \n ");} |
854 |
"\t[-c Create LDAP Base structure][-d Debug Output (lots !)]\n " |
|
|
855 |
); |
856 |
} |
857 |
|