From f8aa552edb881ff6997ca71d90721294ccc16dd6 Mon Sep 17 00:00:00 2001 From: Andreas Gustafsson Date: Thu, 15 Nov 2001 23:15:34 +0000 Subject: [PATCH] Split contrib/sdb into a subdirectory per driver --- contrib/sdb/INSTALL.ldap | 55 --- contrib/sdb/README.ldap | 18 - contrib/sdb/README.zone2ldap | 17 - contrib/sdb/dirdb.c | 195 ---------- contrib/sdb/dirdb.h | 25 -- contrib/sdb/ldapdb.c | 466 ---------------------- contrib/sdb/ldapdb.h | 6 - contrib/sdb/lookup.tcl | 51 --- contrib/sdb/pgsqldb.c | 348 ----------------- contrib/sdb/pgsqldb.h | 25 -- contrib/sdb/tcldb.c | 232 ----------- contrib/sdb/tcldb.h | 25 -- contrib/sdb/timedb.c | 143 ------- contrib/sdb/timedb.h | 25 -- contrib/sdb/zone2ldap.1 | 64 ---- contrib/sdb/zone2ldap.c | 721 ----------------------------------- contrib/sdb/zonetodb.c | 272 ------------- 17 files changed, 2688 deletions(-) delete mode 100644 contrib/sdb/INSTALL.ldap delete mode 100644 contrib/sdb/README.ldap delete mode 100644 contrib/sdb/README.zone2ldap delete mode 100644 contrib/sdb/dirdb.c delete mode 100644 contrib/sdb/dirdb.h delete mode 100644 contrib/sdb/ldapdb.c delete mode 100644 contrib/sdb/ldapdb.h delete mode 100644 contrib/sdb/lookup.tcl delete mode 100644 contrib/sdb/pgsqldb.c delete mode 100644 contrib/sdb/pgsqldb.h delete mode 100644 contrib/sdb/tcldb.c delete mode 100644 contrib/sdb/tcldb.h delete mode 100644 contrib/sdb/timedb.c delete mode 100644 contrib/sdb/timedb.h delete mode 100644 contrib/sdb/zone2ldap.1 delete mode 100644 contrib/sdb/zone2ldap.c delete mode 100644 contrib/sdb/zonetodb.c diff --git a/contrib/sdb/INSTALL.ldap b/contrib/sdb/INSTALL.ldap deleted file mode 100644 index e54b500157..0000000000 --- a/contrib/sdb/INSTALL.ldap +++ /dev/null @@ -1,55 +0,0 @@ -This is the INSTALL file for 0.4. See -http://www.venaas.no/ldap/bind-sdb/ for updates or other information. - -BUILDING - -You need the source for BIND 9.1.0 or newer (for zone transfers you -will need at least 9.1.1rc3 due to a bug). Basically you need to follow -the instructions in doc/misc/sdb, if my instructions doesn't make sense, -please have a look at that as well. - -Copy ldapdb.c to bin/named and ldapdb.h to bin/named/include in the -source tree. - -Next alter bin/named/Makefile.in. Add ldapdb.@O@ to DBDRIVER_OBJS and -ldapdb.c to DBDRIVER_SRCS. You also need to add something like --I/usr/local/include to DBDRIVER_INCLUDES and --L/usr/local/lib -lldap -llber -lresolv to DBDRIVER_LIBS -depending on what LDAP library you have and where you installed it. - -Finally you need to edit bin/named/main.c. Below where it says -"#include "xxdb.h"", add the line "#include ". Below where -it says "xxdb_init();" add the line "ldapdb_init();", and finally -below where it says "xxdb_clear();", add "ldapdb_clear();". - -Now you should hopefully be able to build it. - - -CONFIGURING - -Before you do any configuring of LDAP stuff, please try to configure -and start bind as usual to see if things work. - -To do anything useful, you need to store a zone in some LDAP server. -From this release on, you must use a schema called dNSZone. Note that -it relies on some attribute definitions in the Cosine schema, so that -must be included as well. The Cosine schema probably comes with your -LDAP server. You can find dNSZone and further details on how to store -the data in your LDAP server at -http://www.venaas.no/ldap/bind-sdb/ - -For an example, have a look at my venaas.com zone. Try a subtree search -for objectClass=* at -ldap ldap://129.241.20.67/dc=venaas,dc=com,o=DNS,dc=venaas,dc=no - -To use it with BIND, I've added the following to named.conf: -zone "venaas.com" { - type master; - database "ldap ldap://129.241.20.67/dc=venaas,dc=com,o=DNS,dc=venaas,dc=no 172800"; -}; - -When doing lookups BIND will do a sub-tree search below the base in the -URL. The number 172800 is the TTL which will be used for all entries that -haven't got the dNSTTL attribute. - -Stig Venaas 2001-04-12 diff --git a/contrib/sdb/README.ldap b/contrib/sdb/README.ldap deleted file mode 100644 index 102d0ac969..0000000000 --- a/contrib/sdb/README.ldap +++ /dev/null @@ -1,18 +0,0 @@ -This is an attempt at an LDAP back-end for BIND 9 using the new simplified -database interface "sdb". This is the fifth release (0.5) and is not ready -for production use yet. Note that this version (and 0.4) uses a new schema -and is not backwards compatible with versions before 0.4. The big changes in -0.5 are thread support and improved connection handling. Multiple threads -can now access the back-end simultaneously, and rather than having one -connection per zone, there is now one connection per thread per LDAP server. -This should help people with multiple CPUs and people with a huge number of -zones. One final change is support for literal IPv6 addresses in LDAP URLs. -At least OpenLDAP 2 has IPv6 support, so if you use OpenLDAP 2 libraries and -server, you got all you need. - -If you have bug reports, fixes, comments, questions or whatever, please -contact me. See also http://www.venaas.no/ldap/bind-sdb/ for information. - -See INSTALL for how to build, install and use. - -Stig Venaas 2001-05-06 diff --git a/contrib/sdb/README.zone2ldap b/contrib/sdb/README.zone2ldap deleted file mode 100644 index edb367b122..0000000000 --- a/contrib/sdb/README.zone2ldap +++ /dev/null @@ -1,17 +0,0 @@ -INSTALLATION - -To Compile zone2ldap from contrib/sdb directory: - - gcc -g `../../isc-config.sh --cflags isc dns` -c zone2ldap.c - gcc -g -o zone2ldap zone2ldap.o `isc-config.sh --libs isc dns` -lldap -llber -lresolv - -USAGE: - -See zone2ldap.1 - -BUGS: - -Jeff McNeil - - - diff --git a/contrib/sdb/dirdb.c b/contrib/sdb/dirdb.c deleted file mode 100644 index b5970ff77b..0000000000 --- a/contrib/sdb/dirdb.c +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (C) 2000, 2001 Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, - * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING - * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION - * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* $Id: dirdb.c,v 1.9 2001/01/09 21:46:22 bwelling Exp $ */ - -/* - * A simple database driver that returns basic information about - * files and directories in the Unix file system as DNS data. - */ - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -#include - -#include "dirdb.h" - -static dns_sdbimplementation_t *dirdb = NULL; - -#define CHECK(op) \ - do { result = (op); \ - if (result != ISC_R_SUCCESS) return (result); \ - } while (0) - -#define CHECKN(op) \ - do { n = (op); \ - if (n < 0) return (ISC_R_FAILURE); \ - } while (0) - - -/* - * This database operates on relative names. - * - * Any name will be interpreted as a pathname offset from the directory - * specified in the configuration file. - */ -static isc_result_t -dirdb_lookup(const char *zone, const char *name, void *dbdata, - dns_sdblookup_t *lookup) -{ - char filename[255]; - char filename2[255]; - char buf[1024]; - struct stat statbuf; - isc_result_t result; - int n; - - UNUSED(zone); - UNUSED(dbdata); - - if (strcmp(name, "@") == 0) - snprintf(filename, sizeof(filename), "%s", (char *)dbdata); - else - snprintf(filename, sizeof(filename), "%s/%s", - (char *)dbdata, name); - CHECKN(lstat(filename, &statbuf)); - - if (S_ISDIR(statbuf.st_mode)) - CHECK(dns_sdb_putrr(lookup, "txt", 3600, "dir")); - else if (S_ISCHR(statbuf.st_mode) || S_ISBLK(statbuf.st_mode)) { - CHECKN(snprintf(buf, sizeof(buf), - "\"%sdev\" \"major %d\" \"minor %d\"", - S_ISCHR(statbuf.st_mode) ? "chr" : "blk", - major(statbuf.st_rdev), - minor(statbuf.st_rdev))); - CHECK(dns_sdb_putrr(lookup, "txt", 3600, buf)); - } else if (S_ISFIFO(statbuf.st_mode)) - CHECK(dns_sdb_putrr(lookup, "txt", 3600, "pipe")); - else if (S_ISSOCK(statbuf.st_mode)) - CHECK(dns_sdb_putrr(lookup, "txt", 3600, "socket")); - else if (S_ISLNK(statbuf.st_mode)) { - CHECKN(readlink(filename, filename2, sizeof(filename2) - 1)); - buf[n] = 0; - CHECKN(snprintf(buf, sizeof(buf), "\"symlink\" \"%s\"", - filename2)); - CHECK(dns_sdb_putrr(lookup, "txt", 3600, buf)); - } else if (!S_ISREG(statbuf.st_mode)) - CHECK(dns_sdb_putrr(lookup, "txt", 3600, "unknown")); - else { - CHECKN(snprintf(buf, sizeof(buf), "\"file\" \"size = %u\"", - (unsigned int)statbuf.st_size)); - CHECK(dns_sdb_putrr(lookup, "txt", 3600, buf)); - } - - return (ISC_R_SUCCESS); -} - -/* - * lookup () does not return SOA or NS records, so authority() must be defined. - */ -static isc_result_t -dirdb_authority(const char *zone, void *dbdata, dns_sdblookup_t *lookup) { - isc_result_t result; - - UNUSED(zone); - UNUSED(dbdata); - - result = dns_sdb_putsoa(lookup, "ns", "hostmaster", 0); - INSIST(result == ISC_R_SUCCESS); - result = dns_sdb_putrr(lookup, "ns", 86400, "ns1"); - INSIST(result == ISC_R_SUCCESS); - result = dns_sdb_putrr(lookup, "ns", 86400, "ns2"); - INSIST(result == ISC_R_SUCCESS); - return (ISC_R_SUCCESS); -} - -/* - * Each database stores the top-level directory as the dbdata opaque - * object. The create() function allocates it. argv[0] holds the top - * level directory. - */ -static isc_result_t -dirdb_create(const char *zone, int argc, char **argv, - void *driverdata, void **dbdata) -{ - UNUSED(zone); - UNUSED(driverdata); - - if (argc < 1) - return (ISC_R_FAILURE); - *dbdata = isc_mem_strdup((isc_mem_t *)driverdata, argv[0]); - if (*dbdata == NULL) - return (ISC_R_NOMEMORY); - return (ISC_R_SUCCESS); -} - -/* - * The destroy() function frees the memory allocated by create(). - */ -static void -dirdb_destroy(const char *zone, void *driverdata, void **dbdata) { - UNUSED(zone); - UNUSED(driverdata); - isc_mem_free((isc_mem_t *)driverdata, *dbdata); -} - -/* - * This zone does not support zone transfer, so allnodes() is NULL. - */ -static dns_sdbmethods_t dirdb_methods = { - dirdb_lookup, - dirdb_authority, - NULL, /* allnodes */ - dirdb_create, - dirdb_destroy -}; - -/* - * Wrapper around dns_sdb_register(). Note that the first ns_g_mctx is - * being passed as the "driverdata" parameter, so that will it will be - * passed to create() and destroy(). - */ -isc_result_t -dirdb_init(void) { - unsigned int flags; - flags = DNS_SDBFLAG_RELATIVEOWNER | DNS_SDBFLAG_RELATIVERDATA | - DNS_SDBFLAG_THREADSAFE; - return (dns_sdb_register("dir", &dirdb_methods, ns_g_mctx, flags, - ns_g_mctx, &dirdb)); -} - -/* - * Wrapper around dns_sdb_unregister(). - */ -void -dirdb_clear(void) { - if (dirdb != NULL) - dns_sdb_unregister(&dirdb); -} diff --git a/contrib/sdb/dirdb.h b/contrib/sdb/dirdb.h deleted file mode 100644 index bd25280ddb..0000000000 --- a/contrib/sdb/dirdb.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2000, 2001 Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, - * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING - * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION - * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* $Id: dirdb.h,v 1.2 2001/01/09 21:46:23 bwelling Exp $ */ - -#include - -isc_result_t dirdb_init(void); - -void dirdb_clear(void); - diff --git a/contrib/sdb/ldapdb.c b/contrib/sdb/ldapdb.c deleted file mode 100644 index 0b6e88b48d..0000000000 --- a/contrib/sdb/ldapdb.c +++ /dev/null @@ -1,466 +0,0 @@ -/* - * Copyright (C) 2001 Stig Venaas - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - */ - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include "ldapdb.h" - -/* - * A simple database driver for LDAP. Not production quality yet - */ - -static dns_sdbimplementation_t *ldapdb = NULL; - -struct ldapdb_data { - char *hostport; - char *hostname; - int portno; - char *base; - int defaultttl; -}; - -/* used by ldapdb_getconn */ - -struct ldapdb_entry { - void *index; - size_t size; - void *data; - struct ldapdb_entry *next; -}; - -static struct ldapdb_entry *ldapdb_find(struct ldapdb_entry *stack, - const void *index, size_t size) { - while (stack != NULL) { - if (stack->size == size && !memcmp(stack->index, index, size)) - return stack; - stack = stack->next; - } - return NULL; -} - -static void ldapdb_insert(struct ldapdb_entry **stack, - struct ldapdb_entry *item) { - item->next = *stack; - *stack = item; -} - -static void ldapdb_lock(int what) { - static isc_mutex_t lock; - - switch (what) { - case 0: - isc_mutex_init(&lock); - break; - case 1: - LOCK(&lock); - break; - case -1: - UNLOCK(&lock); - break; - } -} - -/* data == NULL means cleanup */ -static LDAP ** -ldapdb_getconn(struct ldapdb_data *data) -{ - static struct ldapdb_entry *allthreadsdata = NULL; - struct ldapdb_entry *threaddata, *conndata; - unsigned long threadid; - - if (data == NULL) { - /* cleanup */ - /* lock out other threads */ - ldapdb_lock(1); - while (allthreadsdata != NULL) { - threaddata = allthreadsdata; - free(threaddata->index); - while (threaddata->data != NULL) { - conndata = threaddata->data; - free(conndata->index); - if (conndata->data != NULL) - ldap_unbind((LDAP *)conndata->data); - threaddata->data = conndata->next; - free(conndata); - } - allthreadsdata = threaddata->next; - free(threaddata); - } - ldapdb_lock(-1); - return (NULL); - } - - /* look for connection data for current thread */ - threadid = isc_thread_self(); - threaddata = ldapdb_find(allthreadsdata, &threadid, sizeof(threadid)); - if (threaddata == NULL) { - /* no data for this thread, create empty connection list */ - threaddata = malloc(sizeof(*threaddata)); - if (threaddata == NULL) - return (NULL); - threaddata->index = malloc(sizeof(threadid)); - if (threaddata->index == NULL) { - free(threaddata); - return (NULL); - } - *(unsigned long *)threaddata->index = threadid; - threaddata->size = sizeof(threadid); - threaddata->data = NULL; - - /* need to lock out other threads here */ - ldapdb_lock(1); - ldapdb_insert(&allthreadsdata, threaddata); - ldapdb_lock(-1); - } - - /* threaddata points at the connection list for current thread */ - /* look for existing connection to our server */ - conndata = ldapdb_find((struct ldapdb_entry *)threaddata->data, - data->hostport, strlen(data->hostport)); - if (conndata == NULL) { - /* no connection data structure for this server, create one */ - conndata = malloc(sizeof(*conndata)); - if (conndata == NULL) - return (NULL); - (char *)conndata->index = data->hostport; - conndata->size = strlen(data->hostport); - conndata->data = NULL; - ldapdb_insert((struct ldapdb_entry **)&threaddata->data, - conndata); - } - - return (LDAP **)&conndata->data; -} - -/* callback routines */ -static isc_result_t -ldapdb_create(const char *zone, int argc, char **argv, - void *driverdata, void **dbdata) -{ - struct ldapdb_data *data; - char *s; - int defaultttl; - - UNUSED(zone); - UNUSED(driverdata); - - /* we assume that only one thread will call create at a time */ - /* want to do this only once for all instances */ - - if ((argc < 2) - || (argv[0] != strstr( argv[0], "ldap://")) - || ((defaultttl = atoi(argv[1])) < 1)) - return (ISC_R_FAILURE); - data = isc_mem_get(ns_g_mctx, sizeof(struct ldapdb_data)); - if (data == NULL) - return (ISC_R_NOMEMORY); - data->hostport = isc_mem_strdup(ns_g_mctx, argv[0] + strlen("ldap://")); - if (data->hostport == NULL) { - isc_mem_put(ns_g_mctx, data, sizeof(struct ldapdb_data)); - return (ISC_R_NOMEMORY); - } - data->defaultttl = defaultttl; - s = strchr(data->hostport, '/'); - if (s != NULL) { - *s++ = '\0'; - data->base = *s != '\0' ? s : NULL; - } - - /* support URLs with literal IPv6 addresses */ - data->hostname = isc_mem_strdup(ns_g_mctx, data->hostport + - (*data->hostport == '[' ? 1 : 0)); - if (data->hostname == NULL) { - isc_mem_free(ns_g_mctx, data->hostport); - isc_mem_put(ns_g_mctx, data, sizeof(struct ldapdb_data)); - return (ISC_R_NOMEMORY); - } - - if (*data->hostport == '[' && - (s = strchr(data->hostname, ']')) != NULL ) - *s++ = '\0'; - else - s = data->hostname; - s = strchr(s, ':'); - if (s != NULL) { - *s++ = '\0'; - data->portno = atoi(s); - } else - data->portno = LDAP_PORT; - - *dbdata = data; - return (ISC_R_SUCCESS); -} - -static void -ldapdb_destroy(const char *zone, void *driverdata, void **dbdata) { - struct ldapdb_data *data = *dbdata; - - UNUSED(zone); - UNUSED(driverdata); - - if (data->hostport != NULL) - isc_mem_free(ns_g_mctx, data->hostport); - if (data->hostname != NULL) - isc_mem_free(ns_g_mctx, data->hostname); - isc_mem_put(ns_g_mctx, data, sizeof(struct ldapdb_data)); -} - -static void -ldapdb_bind(struct ldapdb_data *data, LDAP **ldp) -{ - if (*ldp != NULL) - ldap_unbind(*ldp); - *ldp = ldap_open(data->hostname, data->portno); - if (*ldp == NULL) - return; - if (ldap_simple_bind_s(*ldp, NULL, NULL) != LDAP_SUCCESS) { - ldap_unbind(*ldp); - *ldp = NULL; - } -} - -static isc_result_t -ldapdb_lookup(const char *zone, const char *name, void *dbdata, - dns_sdblookup_t *lookup) -{ - isc_result_t result = ISC_R_NOTFOUND; - struct ldapdb_data *data = dbdata; - LDAP **ldp; - LDAPMessage *res, *e; - char *fltr, *a, **vals; - char type[64]; - BerElement *ptr; - int i; - - ldp = ldapdb_getconn(data); - if (ldp == NULL) - return (ISC_R_FAILURE); - if (*ldp == NULL) { - ldapdb_bind(data, ldp); - if (*ldp == NULL) - return (ISC_R_FAILURE); - } - fltr = isc_mem_get(ns_g_mctx, strlen(zone) + strlen(name) + - strlen("(&(zoneName=)(relativeDomainName=))") + 1); - if (fltr == NULL) - return (ISC_R_NOMEMORY); - - strcpy(fltr, "(&(zoneName="); - strcat(fltr, zone); - strcat(fltr, ")(relativeDomainName="); - strcat(fltr, name); - strcat(fltr, "))"); - - if (ldap_search_s(*ldp, data->base, LDAP_SCOPE_SUBTREE, fltr, NULL, 0, - &res) != LDAP_SUCCESS) { - ldapdb_bind(data, ldp); - if (*ldp != NULL) - ldap_search_s(*ldp, data->base, LDAP_SCOPE_SUBTREE, - fltr, NULL, 0, &res); - } - - isc_mem_put(ns_g_mctx, fltr, strlen(fltr) + 1); - - if (*ldp == NULL) - goto exit; - - for (e = ldap_first_entry(*ldp, res); e != NULL; - e = ldap_next_entry(*ldp, e)) { - LDAP *ld = *ldp; - int ttl = data->defaultttl; - - for (a = ldap_first_attribute(ld, e, &ptr); a != NULL; - a = ldap_next_attribute(ld, e, ptr)) { - if (!strcmp(a, "dNSTTL")) { - vals = ldap_get_values(ld, e, a); - ttl = atoi(vals[0]); - ldap_value_free(vals); - ldap_memfree(a); - break; - } - ldap_memfree(a); - } - for (a = ldap_first_attribute(ld, e, &ptr); a != NULL; - a = ldap_next_attribute(ld, e, ptr)) { - char *s; - - for (s = a; *s; s++) - *s = toupper(*s); - s = strstr(a, "RECORD"); - if ((s == NULL) || (s == a) - || (s - a >= (signed int)sizeof(type))) { - ldap_memfree(a); - continue; - } - strncpy(type, a, s - a); - type[s - a] = '\0'; - vals = ldap_get_values(ld, e, a); - for (i=0; vals[i] != NULL; i++) { - result = dns_sdb_putrr(lookup, type, ttl, - vals[i]); - if (result != ISC_R_SUCCESS) { - ldap_value_free(vals); - ldap_memfree(a); - result = ISC_R_FAILURE; - goto exit; - } - } - ldap_value_free(vals); - ldap_memfree(a); - } - } - exit: - ldap_msgfree(res); - return (result); -} - -static isc_result_t -ldapdb_allnodes(const char *zone, void *dbdata, - dns_sdballnodes_t *allnodes) { - isc_result_t result = ISC_R_NOTFOUND; - struct ldapdb_data *data = dbdata; - LDAP **ldp; - LDAPMessage *res, *e; - char type[64]; - char *fltr, *a, **vals; - BerElement *ptr; - int i; - - ldp = ldapdb_getconn(data); - if (ldp == NULL) - return (ISC_R_FAILURE); - if (*ldp == NULL) { - ldapdb_bind(data, ldp); - if (*ldp == NULL) - return (ISC_R_FAILURE); - } - - fltr = isc_mem_get(ns_g_mctx, strlen(zone) + strlen("(zoneName=)") + 1); - if (fltr == NULL) - return (ISC_R_NOMEMORY); - - strcpy(fltr, "(zoneName="); - strcat(fltr, zone); - strcat(fltr, ")"); - - if (ldap_search_s(*ldp, data->base, LDAP_SCOPE_SUBTREE, fltr, NULL, 0, - &res) != LDAP_SUCCESS) { - ldapdb_bind(data, ldp); - if (*ldp != NULL) - ldap_search_s(*ldp, data->base, LDAP_SCOPE_SUBTREE, - fltr, NULL, 0, &res); - } - - isc_mem_put(ns_g_mctx, fltr, strlen(fltr) + 1); - - for (e = ldap_first_entry(*ldp, res); e != NULL; - e = ldap_next_entry(*ldp, e)) { - LDAP *ld = *ldp; - char *name = NULL; - int ttl = data->defaultttl; - - for (a = ldap_first_attribute(ld, e, &ptr); a != NULL; - a = ldap_next_attribute(ld, e, ptr)) { - if (!strcmp(a, "dNSTTL")) { - vals = ldap_get_values(ld, e, a); - ttl = atoi(vals[0]); - ldap_value_free(vals); - } else if (!strcmp(a, "relativeDomainName")) { - vals = ldap_get_values(ld, e, a); - name = isc_mem_strdup(ns_g_mctx, vals[0]); - ldap_value_free(vals); - } - ldap_memfree(a); - } - - if (name == NULL) - continue; - - for (a = ldap_first_attribute(ld, e, &ptr); a != NULL; - a = ldap_next_attribute(ld, e, ptr)) { - char *s; - - for (s = a; *s; s++) - *s = toupper(*s); - s = strstr(a, "RECORD"); - if ((s == NULL) || (s == a) - || (s - a >= (signed int)sizeof(type))) { - ldap_memfree(a); - continue; - } - strncpy(type, a, s - a); - type[s - a] = '\0'; - vals = ldap_get_values(ld, e, a); - for (i=0; vals[i] != NULL; i++) { - result = dns_sdb_putnamedrr(allnodes, name, - type, ttl, vals[i]); - if (result != ISC_R_SUCCESS) { - ldap_value_free(vals); - ldap_memfree(a); - isc_mem_free(ns_g_mctx, name); - result = ISC_R_FAILURE; - goto exit; - } - } - ldap_value_free(vals); - ldap_memfree(a); - } - isc_mem_free(ns_g_mctx, name); - } - - exit: - ldap_msgfree(res); - return (result); -} - -static dns_sdbmethods_t ldapdb_methods = { - ldapdb_lookup, - NULL, /* authority */ - ldapdb_allnodes, - ldapdb_create, - ldapdb_destroy -}; - -/* Wrapper around dns_sdb_register() */ -isc_result_t -ldapdb_init(void) { - unsigned int flags = - DNS_SDBFLAG_RELATIVEOWNER | - DNS_SDBFLAG_RELATIVERDATA | - DNS_SDBFLAG_THREADSAFE; - - ldapdb_lock(0); - return (dns_sdb_register("ldap", &ldapdb_methods, NULL, flags, - ns_g_mctx, &ldapdb)); -} - -/* Wrapper around dns_sdb_unregister() */ -void -ldapdb_clear(void) { - if (ldapdb != NULL) { - /* clean up thread data */ - ldapdb_getconn(NULL); - dns_sdb_unregister(&ldapdb); - } -} diff --git a/contrib/sdb/ldapdb.h b/contrib/sdb/ldapdb.h deleted file mode 100644 index a08eb20bf3..0000000000 --- a/contrib/sdb/ldapdb.h +++ /dev/null @@ -1,6 +0,0 @@ -#include - -isc_result_t ldapdb_init(void); - -void ldapdb_clear(void); - diff --git a/contrib/sdb/lookup.tcl b/contrib/sdb/lookup.tcl deleted file mode 100644 index b4defe65fb..0000000000 --- a/contrib/sdb/lookup.tcl +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright (C) 2000, 2001 Internet Software Consortium. -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM -# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL -# INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, -# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING -# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -# $Id: lookup.tcl,v 1.7 2001/01/09 21:46:24 bwelling Exp $ - -# -# Sample lookup procedure for tcldb -# -# This lookup procedure defines zones with identical SOA, NS, and MX -# records at the apex and a single A record that varies from zone to -# zone at the name "www". -# -# Something like this could be used by a web hosting company to serve -# a number of domains without needing to create a separate master file -# for each domain. Instead, all per-zone data (in this case, a single -# IP address) specified in the named.conf file like this: -# -# zone "a.com." { type master; database "tcl 10.0.0.42"; }; -# zone "b.com." { type master; database "tcl 10.0.0.99"; }; -# -# Since the tcldb driver doesn't support zone transfers, there should -# be at least two identically configured master servers. In the -# example below, they are assumed to be called ns1.isp.nil and -# ns2.isp.nil. -# - -proc lookup {zone name} { - global dbargs - switch -- $name { - @ { return [list \ - {SOA 86400 "ns1.isp.nil. hostmaster.isp.nil. \ - 1 3600 1800 1814400 3600"} \ - {NS 86400 "ns1.isp.nil."} \ - {NS 86400 "ns2.isp.nil."} \ - {MX 86400 "10 mail.isp.nil."} ] } - www { return [list [list A 3600 $dbargs($zone)] ] } - } - return NXDOMAIN -} diff --git a/contrib/sdb/pgsqldb.c b/contrib/sdb/pgsqldb.c deleted file mode 100644 index 6982b2b546..0000000000 --- a/contrib/sdb/pgsqldb.c +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright (C) 2000, 2001 Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, - * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING - * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION - * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* $Id: pgsqldb.c,v 1.12 2001/02/28 23:42:37 bwelling Exp $ */ - -#include - -#include -#include -#include - -#include - -#include -#include -#include -#include - -#include -#include - -#include - -#include "pgsqldb.h" - -/* - * A simple database driver that interfaces to a PostgreSQL database. This - * is not complete, and not designed for general use. It opens one - * connection to the database per zone, which is inefficient. It also may - * not handle quoting correctly. - * - * The table must contain the fields "name", "rdtype", and "rdata", and - * is expected to contain a properly constructed zone. The program "zonetodb" - * creates such a table. - */ - -static dns_sdbimplementation_t *pgsqldb = NULL; - -struct dbinfo { - PGconn *conn; - char *database; - char *table; - char *host; - char *user; - char *passwd; -}; - -static void -pgsqldb_destroy(const char *zone, void *driverdata, void **dbdata); - -/* - * Canonicalize a string before writing it to the database. - * "dest" must be an array of at least size 2*strlen(source) + 1. - */ -static void -quotestring(const char *source, char *dest) { - while (*source != 0) { - if (*source == '\'') - *dest++ = '\''; - /* SQL doesn't treat \ as special, but PostgreSQL does */ - else if (*source == '\\') - *dest++ = '\\'; - *dest++ = *source++; - } - *dest++ = 0; -} - -/* - * Connect to the database. - */ -static isc_result_t -db_connect(struct dbinfo *dbi) { - dbi->conn = PQsetdbLogin(dbi->host, NULL, NULL, NULL, dbi->database, - dbi->user, dbi->passwd); - - if (PQstatus(dbi->conn) == CONNECTION_OK) - return (ISC_R_SUCCESS); - else - return (ISC_R_FAILURE); -} - -/* - * Check to see if the connection is still valid. If not, attempt to - * reconnect. - */ -static isc_result_t -maybe_reconnect(struct dbinfo *dbi) { - if (PQstatus(dbi->conn) == CONNECTION_OK) - return (ISC_R_SUCCESS); - - return (db_connect(dbi)); -} - -/* - * This database operates on absolute names. - * - * Queries are converted into SQL queries and issued synchronously. Errors - * are handled really badly. - */ -static isc_result_t -pgsqldb_lookup(const char *zone, const char *name, void *dbdata, - dns_sdblookup_t *lookup) -{ - isc_result_t result; - struct dbinfo *dbi = dbdata; - PGresult *res; - char str[1500]; - char *canonname; - int i; - - UNUSED(zone); - - canonname = isc_mem_get(ns_g_mctx, strlen(name) * 2 + 1); - if (canonname == NULL) - return (ISC_R_NOMEMORY); - quotestring(name, canonname); - snprintf(str, sizeof(str), - "SELECT TTL,RDTYPE,RDATA FROM \"%s\" WHERE " - "lower(NAME) = lower('%s')", dbi->table, canonname); - isc_mem_put(ns_g_mctx, canonname, strlen(name) * 2 + 1); - - result = maybe_reconnect(dbi); - if (result != ISC_R_SUCCESS) - return (result); - - res = PQexec(dbi->conn, str); - if (!res || PQresultStatus(res) != PGRES_TUPLES_OK) { - PQclear(res); - return (ISC_R_FAILURE); - } - if (PQntuples(res) == 0) { - PQclear(res); - return (ISC_R_NOTFOUND); - } - - for (i = 0; i < PQntuples(res); i++) { - char *ttlstr = PQgetvalue(res, i, 0); - char *type = PQgetvalue(res, i, 1); - char *data = PQgetvalue(res, i, 2); - dns_ttl_t ttl; - char *endp; - ttl = strtol(ttlstr, &endp, 10); - if (*endp != '\0') { - PQclear(res); - return (DNS_R_BADTTL); - } - result = dns_sdb_putrr(lookup, type, ttl, data); - if (result != ISC_R_SUCCESS) { - PQclear(res); - return (ISC_R_FAILURE); - } - } - - PQclear(res); - return (ISC_R_SUCCESS); -} - -/* - * Issue an SQL query to return all nodes in the database and fill the - * allnodes structure. - */ -static isc_result_t -pgsqldb_allnodes(const char *zone, void *dbdata, dns_sdballnodes_t *allnodes) { - struct dbinfo *dbi = dbdata; - PGresult *res; - isc_result_t result; - char str[1500]; - int i; - - UNUSED(zone); - - snprintf(str, sizeof(str), - "SELECT TTL,NAME,RDTYPE,RDATA FROM \"%s\" ORDER BY NAME", - dbi->table); - - result = maybe_reconnect(dbi); - if (result != ISC_R_SUCCESS) - return (result); - - res = PQexec(dbi->conn, str); - if (!res || PQresultStatus(res) != PGRES_TUPLES_OK ) { - PQclear(res); - return (ISC_R_FAILURE); - } - if (PQntuples(res) == 0) { - PQclear(res); - return (ISC_R_NOTFOUND); - } - - for (i = 0; i < PQntuples(res); i++) { - char *ttlstr = PQgetvalue(res, i, 0); - char *name = PQgetvalue(res, i, 1); - char *type = PQgetvalue(res, i, 2); - char *data = PQgetvalue(res, i, 3); - dns_ttl_t ttl; - char *endp; - ttl = strtol(ttlstr, &endp, 10); - if (*endp != '\0') { - PQclear(res); - return (DNS_R_BADTTL); - } - result = dns_sdb_putnamedrr(allnodes, name, type, ttl, data); - if (result != ISC_R_SUCCESS) { - PQclear(res); - return (ISC_R_FAILURE); - } - } - - PQclear(res); - return (ISC_R_SUCCESS); -} - -/* - * Create a connection to the database and save any necessary information - * in dbdata. - * - * argv[0] is the name of the database - * argv[1] is the name of the table - * argv[2] (if present) is the name of the host to connect to - * argv[3] (if present) is the name of the user to connect as - * argv[4] (if present) is the name of the password to connect with - */ -static isc_result_t -pgsqldb_create(const char *zone, int argc, char **argv, - void *driverdata, void **dbdata) -{ - struct dbinfo *dbi; - isc_result_t result; - - UNUSED(zone); - UNUSED(driverdata); - - if (argc < 2) - return (ISC_R_FAILURE); - - dbi = isc_mem_get(ns_g_mctx, sizeof(struct dbinfo)); - if (dbi == NULL) - return (ISC_R_NOMEMORY); - dbi->conn = NULL; - dbi->database = NULL; - dbi->table = NULL; - dbi->host = NULL; - dbi->user = NULL; - dbi->passwd = NULL; - -#define STRDUP_OR_FAIL(target, source) \ - do { \ - target = isc_mem_strdup(ns_g_mctx, source); \ - if (target == NULL) { \ - result = ISC_R_NOMEMORY; \ - goto cleanup; \ - } \ - } while (0); - - STRDUP_OR_FAIL(dbi->database, argv[0]); - STRDUP_OR_FAIL(dbi->table, argv[1]); - if (argc > 2) - STRDUP_OR_FAIL(dbi->host, argv[2]); - if (argc > 3) - STRDUP_OR_FAIL(dbi->user, argv[3]); - if (argc > 4) - STRDUP_OR_FAIL(dbi->passwd, argv[4]); - - result = db_connect(dbi); - if (result != ISC_R_SUCCESS) - goto cleanup; - - *dbdata = dbi; - return (ISC_R_SUCCESS); - - cleanup: - pgsqldb_destroy(zone, driverdata, (void **)&dbi); - return (result); -} - -/* - * Close the connection to the database. - */ -static void -pgsqldb_destroy(const char *zone, void *driverdata, void **dbdata) { - struct dbinfo *dbi = *dbdata; - - UNUSED(zone); - UNUSED(driverdata); - - if (dbi->conn != NULL) - PQfinish(dbi->conn); - if (dbi->database != NULL) - isc_mem_free(ns_g_mctx, dbi->database); - if (dbi->table != NULL) - isc_mem_free(ns_g_mctx, dbi->table); - if (dbi->host != NULL) - isc_mem_free(ns_g_mctx, dbi->host); - if (dbi->user != NULL) - isc_mem_free(ns_g_mctx, dbi->user); - if (dbi->passwd != NULL) - isc_mem_free(ns_g_mctx, dbi->passwd); - if (dbi->database != NULL) - isc_mem_free(ns_g_mctx, dbi->database); - isc_mem_put(ns_g_mctx, dbi, sizeof(struct dbinfo)); -} - -/* - * Since the SQL database corresponds to a zone, the authority data should - * be returned by the lookup() function. Therefore the authority() function - * is NULL. - */ -static dns_sdbmethods_t pgsqldb_methods = { - pgsqldb_lookup, - NULL, /* authority */ - pgsqldb_allnodes, - pgsqldb_create, - pgsqldb_destroy -}; - -/* - * Wrapper around dns_sdb_register(). - */ -isc_result_t -pgsqldb_init(void) { - unsigned int flags; - flags = 0; - return (dns_sdb_register("pgsql", &pgsqldb_methods, NULL, flags, - ns_g_mctx, &pgsqldb)); -} - -/* - * Wrapper around dns_sdb_unregister(). - */ -void -pgsqldb_clear(void) { - if (pgsqldb != NULL) - dns_sdb_unregister(&pgsqldb); -} diff --git a/contrib/sdb/pgsqldb.h b/contrib/sdb/pgsqldb.h deleted file mode 100644 index b46ce83b77..0000000000 --- a/contrib/sdb/pgsqldb.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2000, 2001 Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, - * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING - * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION - * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* $Id: pgsqldb.h,v 1.2 2001/01/09 21:46:27 bwelling Exp $ */ - -#include - -isc_result_t pgsqldb_init(void); - -void pgsqldb_clear(void); - diff --git a/contrib/sdb/tcldb.c b/contrib/sdb/tcldb.c deleted file mode 100644 index 6ceb29caf5..0000000000 --- a/contrib/sdb/tcldb.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright (C) 2000, 2001 Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, - * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING - * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION - * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* $Id: tcldb.c,v 1.7 2001/01/09 21:46:28 bwelling Exp $ */ - -/* - * A simple database driver that calls a Tcl procedure to define - * the contents of the DNS namespace. The procedure is loaded - * from the file lookup.tcl; look at the comments there for - * more information. - */ - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include - -#include - -#include - -#define CHECK(op) \ - do { result = (op); \ - if (result != ISC_R_SUCCESS) return (result); \ - } while (0) - -typedef struct tcldb_driver { - isc_mem_t *mctx; - Tcl_Interp *interp; -} tcldb_driver_t; - -static tcldb_driver_t *the_driver = NULL; - -static dns_sdbimplementation_t *tcldb = NULL; - -static isc_result_t -tcldb_driver_create(isc_mem_t *mctx, tcldb_driver_t **driverp) { - int tclres; - isc_result_t result = ISC_R_SUCCESS; - tcldb_driver_t *driver = isc_mem_get(mctx, sizeof(tcldb_driver_t)); - if (driver == NULL) - return (ISC_R_NOMEMORY); - driver->mctx = mctx; - driver->interp = Tcl_CreateInterp(); - - tclres = Tcl_EvalFile(driver->interp, (char *) "lookup.tcl"); - if (tclres != TCL_OK) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL, - DNS_LOGMODULE_SDB, ISC_LOG_ERROR, - "initializing tcldb: " - "loading 'lookup.tcl' failed: %s", - driver->interp->result); - result = ISC_R_FAILURE; - goto cleanup; - } - *driverp = driver; - return (ISC_R_SUCCESS); - - cleanup: - isc_mem_put(mctx, driver, sizeof(tcldb_driver_t)); - return (result); - -} - -static void -tcldb_driver_destroy(tcldb_driver_t **driverp) { - tcldb_driver_t *driver = *driverp; - Tcl_DeleteInterp(driver->interp); - isc_mem_put(driver->mctx, driver, sizeof(tcldb_driver_t)); -} - -/* - * Perform a lookup, by invoking the Tcl procedure "lookup". - */ -static isc_result_t -tcldb_lookup(const char *zone, const char *name, void *dbdata, - dns_sdblookup_t *lookup) -{ - isc_result_t result = ISC_R_SUCCESS; - int tclres; - int rrc; /* RR count */ - char **rrv; /* RR vector */ - int i; - char *cmdv[3]; - char *cmd; - - tcldb_driver_t *driver = (tcldb_driver_t *) dbdata; - - cmdv[0] = "lookup"; - cmdv[1] = zone; - cmdv[2] = name; - cmd = Tcl_Merge(3, cmdv); - tclres = Tcl_Eval(driver->interp, cmd); - Tcl_Free(cmd); - - if (tclres != TCL_OK) { - isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL, - DNS_LOGMODULE_SDB, ISC_LOG_ERROR, - "zone '%s': tcl lookup function failed: %s", - zone, driver->interp->result); - return (ISC_R_FAILURE); - } - - if (strcmp(driver->interp->result, "NXDOMAIN") == 0) { - result = ISC_R_NOTFOUND; - goto fail; - } - - tclres = Tcl_SplitList(driver->interp, driver->interp->result, - &rrc, &rrv); - if (tclres != TCL_OK) - goto malformed; - - for (i = 0; i < rrc; i++) { - isc_result_t tmpres; - int fieldc; /* Field count */ - char **fieldv; /* Field vector */ - tclres = Tcl_SplitList(driver->interp, rrv[i], - &fieldc, &fieldv); - if (tclres != TCL_OK) { - tmpres = ISC_R_FAILURE; - goto failrr; - } - if (fieldc != 3) - goto malformed; - tmpres = dns_sdb_putrr(lookup, fieldv[0], atoi(fieldv[1]), - fieldv[2]); - Tcl_Free((char *) fieldv); - failrr: - if (tmpres != ISC_R_SUCCESS) - result = tmpres; - } - Tcl_Free((char *) rrv); - if (result == ISC_R_SUCCESS) - return (result); - - malformed: - isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL, - DNS_LOGMODULE_SDB, ISC_LOG_ERROR, - "zone '%s': " - "malformed return value from tcl lookup function: %s", - zone, driver->interp->result); - result = ISC_R_FAILURE; - fail: - return (result); -} - -/* - * Set up per-zone state. In our case, the database arguments of the - * zone are collected into a Tcl list and assigned to an element of - * the global array "dbargs". - */ -static isc_result_t -tcldb_create(const char *zone, int argc, char **argv, - void *driverdata, void **dbdata) -{ - tcldb_driver_t *driver = (tcldb_driver_t *) driverdata; - - char *list = Tcl_Merge(argc, argv); - - Tcl_SetVar2(driver->interp, (char *) "dbargs", (char *) zone, list, 0); - - Tcl_Free(list); - - *dbdata = driverdata; - - return (ISC_R_SUCCESS); -} - -/* - * This driver does not support zone transfer, so allnodes() is NULL. - */ -static dns_sdbmethods_t tcldb_methods = { - tcldb_lookup, - NULL, /* authority */ - NULL, /* allnodes */ - tcldb_create, - NULL /* destroy */ -}; - -/* - * Initialize the tcldb driver. - */ -isc_result_t -tcldb_init(void) { - isc_result_t result; - int flags = DNS_SDBFLAG_RELATIVEOWNER | DNS_SDBFLAG_RELATIVERDATA; - - result = tcldb_driver_create(ns_g_mctx, &the_driver); - if (result != ISC_R_SUCCESS) - return (result); - - return (dns_sdb_register("tcl", &tcldb_methods, the_driver, flags, - ns_g_mctx, &tcldb)); -} - -/* - * Wrapper around dns_sdb_unregister(). - */ -void -tcldb_clear(void) { - if (tcldb != NULL) - dns_sdb_unregister(&tcldb); - if (the_driver != NULL) - tcldb_driver_destroy(&the_driver); -} diff --git a/contrib/sdb/tcldb.h b/contrib/sdb/tcldb.h deleted file mode 100644 index 162b9054c6..0000000000 --- a/contrib/sdb/tcldb.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2000, 2001 Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, - * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING - * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION - * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* $Id: tcldb.h,v 1.4 2001/01/09 21:46:29 bwelling Exp $ */ - -#include - -isc_result_t tcldb_init(void); - -void tcldb_clear(void); - diff --git a/contrib/sdb/timedb.c b/contrib/sdb/timedb.c deleted file mode 100644 index d7db814709..0000000000 --- a/contrib/sdb/timedb.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (C) 2000, 2001 Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, - * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING - * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION - * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* $Id: timedb.c,v 1.7 2001/01/09 21:46:30 bwelling Exp $ */ - -/* - * A simple database driver that enables the server to return the - * current time in a DNS record. - */ - -#include - -#include -#include -#include - -#include -#include -#include - -#include - -#include - -#include "timedb.h" - -static dns_sdbimplementation_t *timedb = NULL; - -/* - * This database operates on relative names. - * - * "time" and "@" return the time in a TXT record. - * "clock" is a CNAME to "time" - * "current" is a DNAME to "@" (try time.current.time) - */ -static isc_result_t -timedb_lookup(const char *zone, const char *name, void *dbdata, - dns_sdblookup_t *lookup) -{ - isc_result_t result; - - UNUSED(zone); - UNUSED(dbdata); - - if (strcmp(name, "@") == 0 || strcmp(name, "time") == 0) { - time_t now = time(NULL); - char buf[100]; - int n; - - /* - * Call ctime to create the string, put it in quotes, and - * remove the trailing newline. - */ - n = snprintf(buf, sizeof(buf), "\"%s", ctime(&now)); - if (n < 0) - return (ISC_R_FAILURE); - buf[n - 1] = '\"'; - result = dns_sdb_putrr(lookup, "txt", 1, buf); - if (result != ISC_R_SUCCESS) - return (ISC_R_FAILURE); - } else if (strcmp(name, "clock") == 0) { - result = dns_sdb_putrr(lookup, "cname", 1, "time"); - if (result != ISC_R_SUCCESS) - return (ISC_R_FAILURE); - } else if (strcmp(name, "current") == 0) { - result = dns_sdb_putrr(lookup, "dname", 1, "@"); - if (result != ISC_R_SUCCESS) - return (ISC_R_FAILURE); - } else - return (ISC_R_NOTFOUND); - - return (ISC_R_SUCCESS); -} - -/* - * lookup() does not return SOA or NS records, so authority() must be defined. - */ -static isc_result_t -timedb_authority(const char *zone, void *dbdata, dns_sdblookup_t *lookup) { - isc_result_t result; - - UNUSED(zone); - UNUSED(dbdata); - - result = dns_sdb_putsoa(lookup, "localhost.", "root.localhost.", 0); - if (result != ISC_R_SUCCESS) - return (ISC_R_FAILURE); - - result = dns_sdb_putrr(lookup, "ns", 86400, "ns1.localdomain."); - if (result != ISC_R_SUCCESS) - return (ISC_R_FAILURE); - result = dns_sdb_putrr(lookup, "ns", 86400, "ns2.localdomain."); - if (result != ISC_R_SUCCESS) - return (ISC_R_FAILURE); - - return (ISC_R_SUCCESS); -} - -/* - * This zone does not support zone transfer, so allnodes() is NULL. There - * is no database specific data, so create() and destroy() are NULL. - */ -static dns_sdbmethods_t timedb_methods = { - timedb_lookup, - timedb_authority, - NULL, /* allnodes */ - NULL, /* create */ - NULL /* destroy */ -}; - -/* - * Wrapper around dns_sdb_register(). - */ -isc_result_t -timedb_init(void) { - unsigned int flags; - flags = DNS_SDBFLAG_RELATIVEOWNER | DNS_SDBFLAG_RELATIVERDATA; - return (dns_sdb_register("time", &timedb_methods, NULL, flags, - ns_g_mctx, &timedb)); -} - -/* - * Wrapper around dns_sdb_unregister(). - */ -void -timedb_clear(void) { - if (timedb != NULL) - dns_sdb_unregister(&timedb); -} diff --git a/contrib/sdb/timedb.h b/contrib/sdb/timedb.h deleted file mode 100644 index 018ff8e992..0000000000 --- a/contrib/sdb/timedb.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2000, 2001 Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, - * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING - * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION - * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* $Id: timedb.h,v 1.2 2001/01/09 21:46:31 bwelling Exp $ */ - -#include - -isc_result_t timedb_init(void); - -void timedb_clear(void); - diff --git a/contrib/sdb/zone2ldap.1 b/contrib/sdb/zone2ldap.1 deleted file mode 100644 index 781114bce8..0000000000 --- a/contrib/sdb/zone2ldap.1 +++ /dev/null @@ -1,64 +0,0 @@ -.TH zone2ldap 1 "8 March 2001" -.SH NAME -zone2ldap /- Load BIND 9 Zone files into LDAP Directory -.SH SYNOPSIS -zone2ldap [-D Bind DN] [-w Bind Password] [-b Base DN] [-z Zone] [-f Zone File ] [-h Ldap Host] [-cd] [-v] -.SH DESCRIPTION -zone2ldap will parse a complete BIND 9 format DNS zone file, and load -the contents into an LDAP directory, for use with the LDAP sdb back-end. - -If the zone already exists, zone2ldap will exit succesfully. If the zone does not exists, or -partially exists, zone2ldap will attempt to add all/missing zone data. - -.SS Options -.TP --b -LDAP Base DN. LDAP systems require a "base dn", which is generally considered the LDAP Directory root. -If the zone you are loading is different from the base, then you will need to tell zone2ldap what your LDAP -base is. -.TP --v -Print version information, and immediatly exit. -.TP --f -Zone file. Bind 9.1 compatible zone file, from which zone information will be read. -.TP --d -Dump debug information to standard out. -.TP --w -LDAP Bind password, corresponding the the value of "-b". -.TP --h -LDAP Directory host. This is the hostname of the LDAP system you wish to store zone information on. -An LDAP server should be listening on port 389 of the target system. This may be ommited, and will default -to "localhost". -.TP --c -This will create the zone portion of the DN you are importing. For instance, if you are creating a domain.com zone, -zone2ldap should first create "dc=domain,dc=com". This is useful if you are creating multiple domains. -.TP --z -This is the name of the zone specified in the SOA record. -.SH EXAMPLES -Following are brief examples of how to import a zone file into your LDAP DIT. -.SS Loading zone domain.com, with an LDAP Base DN of dc=domain,dc=com -zone2ldap -D dc=root -w secret -h localhost -z domain.com -f domain.com.zone - -This will add Resource Records into an ALREADY EXISTING dc=domain,dc=com. The final SOA DN in this case, will be -dc=@,dc=domain,dc=com - -.SS Loading customer.com, if your LDAP Base DN is dc=provider,dc=net. -zone2ldap -D dc=root -w secret -h localhost -z customer.com -b dc=provider,dc=net -f customer.com.zone -c - -This will create dc=customer,dc=com under dc=provider,dc=net, and add all necessary Resource Records. The final -root DN to the SOA will be dc=@,dc=customer,dc=com,dc=provider,dc=net. - -.SH "SEE ALSO" -named(8) ldap(3) -http://www.venaas.no/ldap/bind-sdb/ -.SH "BUGS" -Send all bug reports to Jeff McNeil -.SH AUTHOR -Jeff McNeil - diff --git a/contrib/sdb/zone2ldap.c b/contrib/sdb/zone2ldap.c deleted file mode 100644 index badc06ce2e..0000000000 --- a/contrib/sdb/zone2ldap.c +++ /dev/null @@ -1,721 +0,0 @@ -/* - * Copyright (C) 2001 Jeff McNeil - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * Change Log - * - * Tue May 1 19:19:54 EDT 2001 - Jeff McNeil - * Update to objectClass code, and add_to_rr_list function - * (I need to rename that) to support the dNSZone schema, - * ditched dNSDomain2 schema support. Version 0.3-ALPHA - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#define DNS_OBJECT 6 -#define DNS_TOP 2 - -#define VERSION "0.4-ALPHA" - -#define NO_SPEC 0 -#define WI_SPEC 1 - -/* Global Zone Pointer */ -char *gbl_zone = NULL; - -typedef struct LDAP_INFO -{ - char *dn; - LDAPMod **attrs; - struct LDAP_INFO *next; - int attrcnt; -} -ldap_info; - -/* usage Info */ -void usage (); - -/* Add to the ldap dit */ -void add_ldap_values (ldap_info * ldinfo); - -/* Init an ldap connection */ -void init_ldap_conn (); - -/* Ldap error checking */ -void ldap_result_check (char *msg, char *dn, int err); - -/* Put a hostname into a char ** array */ -char **hostname_to_dn_list (char *hostname, char *zone, unsigned int flags); - -/* Find out how many items are in a char ** array */ -int get_attr_list_size (char **tmp); - -/* Get a DN */ -char *build_dn_from_dc_list (char **dc_list, unsigned int ttl, int flag); - -/* Add to RR list */ -void add_to_rr_list (char *dn, char *name, char *type, char *data, - unsigned int ttl, unsigned int flags); - -/* Error checking */ -void isc_result_check (isc_result_t res, char *errorstr); - -/* Generate LDIF Format files */ -void generate_ldap (dns_name_t * dnsname, dns_rdata_t * rdata, - unsigned int ttl); - -/* head pointer to the list */ -ldap_info *ldap_info_base = NULL; - -char *argzone, *ldapbase, *binddn, *bindpw = NULL; -char *ldapsystem = "localhost"; -static char *objectClasses[] = - { "top", "dNSZone", NULL }; -static char *topObjectClasses[] = { "top", NULL }; -LDAP *conn; -unsigned int debug = 0; - -#ifdef DEBUG -debug = 1; -#endif - -int -main (int *argc, char **argv) -{ - isc_mem_t *isc_ctx = NULL; - isc_result_t result; - char *basedn; - ldap_info *tmp; - LDAPMod *base_attrs[2]; - LDAPMod base; - isc_buffer_t buff; - char *zonefile; - char fullbasedn[1024]; - char *ctmp; - dns_fixedname_t fixedzone, fixedname; - dns_rdataset_t rdataset; - char **dc_list; - dns_rdata_t rdata = DNS_RDATA_INIT; - dns_rdatasetiter_t *riter; - dns_name_t *zone, *name; - dns_db_t *db = NULL; - dns_dbiterator_t *dbit = NULL; - dns_dbnode_t *node; - extern char *optarg; - extern int optind, opterr, optopt; - int create_base = 0; - int topt; - - if ((int) argc < 2) - { - usage (); - exit (-1); - } - - while ((topt = getopt ((int) argc, argv, "D:w:b:z:f:h:?dcv")) != -1) - { - switch (topt) - { - case 'v': - printf("%s\n", VERSION); - exit(0); - case 'c': - create_base++; - break; - case 'd': - debug++; - break; - case 'D': - binddn = strdup (optarg); - break; - case 'w': - bindpw = strdup (optarg); - break; - case 'b': - ldapbase = strdup (optarg); - break; - case 'z': - argzone = strdup (optarg); - // We wipe argzone all to hell when we parse it for the DN */ - gbl_zone = strdup(argzone); - break; - case 'f': - zonefile = strdup (optarg); - break; - case 'h': - ldapsystem = strdup (optarg); - break; - case '?': - default: - usage (); - exit (0); - } - } - - if ((argzone == NULL) || (zonefile == NULL)) - { - usage (); - exit (-1); - } - - if (debug) - printf ("Initializing ISC Routines, parsing zone file\n"); - - result = isc_mem_create (0, 0, &isc_ctx); - isc_result_check (result, "isc_mem_create"); - - isc_buffer_init (&buff, argzone, strlen (argzone)); - isc_buffer_add (&buff, strlen (argzone)); - dns_fixedname_init (&fixedzone); - zone = dns_fixedname_name (&fixedzone); - result = dns_name_fromtext (zone, &buff, dns_rootname, ISC_FALSE, NULL); - isc_result_check (result, "dns_name_fromtext"); - - result = - dns_db_create (isc_ctx, "rbt", zone, dns_dbtype_zone, dns_rdataclass_in, - 0, NULL, &db); - isc_result_check (result, "dns_db_create"); - - result = dns_db_load (db, zonefile); - isc_result_check (result, "Check Zone Syntax: dns_db_load"); - - result = dns_db_createiterator (db, ISC_FALSE, &dbit); - isc_result_check (result, "dns_db_createiterator"); - - result = dns_dbiterator_first (dbit); - isc_result_check (result, "dns_dbiterator_first"); - - dns_fixedname_init (&fixedname); - name = dns_fixedname_name (&fixedname); - dns_rdataset_init (&rdataset); - dns_rdata_init (&rdata); - - while (result == ISC_R_SUCCESS) - { - node = NULL; - result = dns_dbiterator_current (dbit, &node, name); - - if (result == ISC_R_NOMORE) - break; - - isc_result_check (result, "dns_dbiterator_current"); - - riter = NULL; - result = dns_db_allrdatasets (db, node, NULL, 0, &riter); - isc_result_check (result, "dns_db_allrdatasets"); - - result = dns_rdatasetiter_first (riter); - //isc_result_check(result, "dns_rdatasetiter_first"); - - while (result == ISC_R_SUCCESS) - { - dns_rdatasetiter_current (riter, &rdataset); - result = dns_rdataset_first (&rdataset); - isc_result_check (result, "dns_rdatasetiter_current"); - - while (result == ISC_R_SUCCESS) - { - dns_rdataset_current (&rdataset, &rdata); - generate_ldap (name, &rdata, rdataset.ttl); - dns_rdata_reset (&rdata); - result = dns_rdataset_next (&rdataset); - } - dns_rdataset_disassociate (&rdataset); - result = dns_rdatasetiter_next (riter); - - } - dns_rdatasetiter_destroy (&riter); - result = dns_dbiterator_next (dbit); - - } - - /* Initialize the LDAP Connection */ - if (debug) - printf ("Initializing LDAP Connection to %s as %s\n", ldapsystem, binddn); - - init_ldap_conn (); - - if (create_base) - { - if (debug) - printf ("Creating base zone DN %s\n", argzone); - - dc_list = hostname_to_dn_list (argzone, argzone, DNS_TOP); - basedn = build_dn_from_dc_list (dc_list, 0, NO_SPEC); - - for (ctmp = &basedn[strlen (basedn)]; ctmp >= &basedn[0]; ctmp--) - { - if ((*ctmp == ',') || (ctmp == &basedn[0])) - { - base.mod_op = LDAP_MOD_ADD; - base.mod_type = "objectClass"; - base.mod_values = topObjectClasses; - base_attrs[0] = &base; - base_attrs[1] = NULL; - - if (ldapbase) - { - if (ctmp != &basedn[0]) - sprintf (fullbasedn, "%s,%s", ctmp + 1, ldapbase); - else - sprintf (fullbasedn, "%s,%s", ctmp, ldapbase); - - } - else - { - if (ctmp != &basedn[0]) - sprintf (fullbasedn, "%s", ctmp + 1); - else - sprintf (fullbasedn, "%s", ctmp); - } - result = ldap_add_s (conn, fullbasedn, base_attrs); - ldap_result_check ("intial ldap_add_s", fullbasedn, result); - } - - } - } - else - { - if (debug) - printf ("Skipping zone base dn creation for %s\n", argzone); - } - - for (tmp = ldap_info_base; tmp != NULL; tmp = tmp->next) - { - - if (debug) - printf ("Adding DN: %s\n", tmp->dn); - - add_ldap_values (tmp); - } - -if (debug) - printf("Operation Complete.\n"); - - return 0; -} - - -/* Check the status of an isc_result_t after any isc routines. - * I should probably rename this function, as not to cause any - * confusion with the isc* routines. Will exit on error. */ -void -isc_result_check (isc_result_t res, char *errorstr) -{ - if (res != ISC_R_SUCCESS) - { - fprintf (stderr, " %s: %s\n", errorstr, isc_result_totext (res)); - exit (-1); - } -} - - -/* Takes DNS information, in bind data structure format, and adds textual - * zone information to the LDAP run queue. */ -void -generate_ldap (dns_name_t * dnsname, dns_rdata_t * rdata, unsigned int ttl) -{ - unsigned char name[DNS_NAME_MAXTEXT + 1]; - unsigned int len; - unsigned char type[20]; - unsigned char data[2048]; - char **dc_list; - char *dn; - - isc_buffer_t buff; - isc_result_t result; - - isc_buffer_init (&buff, name, sizeof (name)); - result = dns_name_totext (dnsname, ISC_TRUE, &buff); - isc_result_check (result, "dns_name_totext"); - name[isc_buffer_usedlength (&buff)] = 0; - - isc_buffer_init (&buff, type, sizeof (type)); - result = dns_rdatatype_totext (rdata->type, &buff); - isc_result_check (result, "dns_rdatatype_totext"); - type[isc_buffer_usedlength (&buff)] = 0; - - isc_buffer_init (&buff, data, sizeof (data)); - result = dns_rdata_totext (rdata, NULL, &buff); - isc_result_check (result, "dns_rdata_totext"); - data[isc_buffer_usedlength (&buff)] = 0; - - dc_list = hostname_to_dn_list (name, argzone, DNS_OBJECT); - len = (get_attr_list_size (dc_list) - 2); - dn = build_dn_from_dc_list (dc_list, ttl, WI_SPEC); - - if (debug) - printf ("Adding %s (%s %s) to run queue list.\n", dn, type, data); - - add_to_rr_list (dn, dc_list[len], type, data, ttl, DNS_OBJECT); -} - - -/* Locate an item in the Run queue linked list, by DN. Used by functions - * which add items to the run queue. - */ -ldap_info * -locate_by_dn (char *dn) -{ - ldap_info *tmp; - for (tmp = ldap_info_base; tmp != (ldap_info *) NULL; tmp = tmp->next) - { - if (!strncmp (tmp->dn, dn, strlen (dn))) - return tmp; - } - return (ldap_info *) NULL; -} - - - -/* Take textual zone data, and add to the LDAP Run queue. This works like so: - * If locate_by_dn does not return, alloc a new ldap_info structure, and then - * calloc a LDAPMod array, fill in the default "everyone needs this" information, - * including object classes and dc's. If it locate_by_dn does return, then we'll - * realloc for more LDAPMod structs, and appened the new data. If an LDAPMod exists - * for the parameter we're adding, then we'll realloc the mod_values array, and - * add the new value to the existing LDAPMod. Finnaly, it assures linkage exists - * within the Run queue linked ilst*/ - -void -add_to_rr_list (char *dn, char *name, char *type, - char *data, unsigned int ttl, unsigned int flags) -{ - int i; - int x; - ldap_info *tmp; - int attrlist; - char ldap_type_buffer[128]; - char charttl[64]; - - - if ((tmp = locate_by_dn (dn)) == NULL) - { - - /* There wasn't one already there, so we need to allocate a new one, - * and stick it on the list */ - - tmp = (ldap_info *) malloc (sizeof (ldap_info)); - if (tmp == (ldap_info *) NULL) - { - fprintf (stderr, "malloc: %s\n", strerror (errno)); - ldap_unbind_s (conn); - exit (-1); - } - - tmp->dn = strdup (dn); - tmp->attrs = (LDAPMod **) calloc (sizeof (LDAPMod *), flags); - if (tmp->attrs == (LDAPMod **) NULL) - { - fprintf (stderr, "calloc: %s\n", strerror (errno)); - ldap_unbind_s (conn); - exit (-1); - } - - for (i = 0; i < flags; i++) - { - tmp->attrs[i] = (LDAPMod *) malloc (sizeof (LDAPMod)); - if (tmp->attrs[i] == (LDAPMod *) NULL) - { - fprintf (stderr, "malloc: %s\n", strerror (errno)); - exit (-1); - } - } - tmp->attrs[0]->mod_op = LDAP_MOD_ADD; - tmp->attrs[0]->mod_type = "objectClass"; - - if (flags == DNS_OBJECT) - tmp->attrs[0]->mod_values = objectClasses; - else - { - tmp->attrs[0]->mod_values = topObjectClasses; - tmp->attrs[1] = NULL; - tmp->attrcnt = 2; - tmp->next = ldap_info_base; - ldap_info_base = tmp; - return; - } - - tmp->attrs[1]->mod_op = LDAP_MOD_ADD; - tmp->attrs[1]->mod_type = "relativeDomainName"; - tmp->attrs[1]->mod_values = (char **) calloc (sizeof (char *), 2); - - if (tmp->attrs[1]->mod_values == (char **)NULL) - exit(-1); - - tmp->attrs[1]->mod_values[0] = strdup (name); - tmp->attrs[1]->mod_values[2] = NULL; - - sprintf (ldap_type_buffer, "%sRecord", type); - - tmp->attrs[2]->mod_op = LDAP_MOD_ADD; - tmp->attrs[2]->mod_type = strdup (ldap_type_buffer); - tmp->attrs[2]->mod_values = (char **) calloc (sizeof (char *), 2); - - if (tmp->attrs[2]->mod_values == (char **)NULL) - exit(-1); - - tmp->attrs[2]->mod_values[0] = strdup (data); - tmp->attrs[2]->mod_values[1] = NULL; - - tmp->attrs[3]->mod_op = LDAP_MOD_ADD; - tmp->attrs[3]->mod_type = "dNSTTL"; - tmp->attrs[3]->mod_values = (char **) calloc (sizeof (char *), 2); - - if (tmp->attrs[3]->mod_values == (char **)NULL) - exit(-1); - - sprintf (charttl, "%d", ttl); - tmp->attrs[3]->mod_values[0] = strdup (charttl); - tmp->attrs[3]->mod_values[1] = NULL; - - tmp->attrs[4]->mod_op = LDAP_MOD_ADD; - tmp->attrs[4]->mod_type = "zoneName"; - tmp->attrs[4]->mod_values = (char **)calloc(sizeof(char *), 2); - tmp->attrs[4]->mod_values[0] = gbl_zone; - tmp->attrs[4]->mod_values[1] = NULL; - - tmp->attrs[5] = NULL; - tmp->attrcnt = flags; - tmp->next = ldap_info_base; - ldap_info_base = tmp; - } - else - { - - for (i = 0; tmp->attrs[i] != NULL; i++) - { - sprintf (ldap_type_buffer, "%sRecord", type); - if (!strncmp - (ldap_type_buffer, tmp->attrs[i]->mod_type, - strlen (tmp->attrs[i]->mod_type))) - { - attrlist = get_attr_list_size (tmp->attrs[i]->mod_values); - tmp->attrs[i]->mod_values = - (char **) realloc (tmp->attrs[i]->mod_values, - sizeof (char *) * (attrlist + 1)); - - if (tmp->attrs[i]->mod_values == (char **) NULL) - { - fprintf (stderr, "realloc: %s\n", strerror (errno)); - ldap_unbind_s (conn); - exit (-1); - } - for (x = 0; tmp->attrs[i]->mod_values[x] != NULL; x++); - - tmp->attrs[i]->mod_values[x] = strdup (data); - tmp->attrs[i]->mod_values[x + 1] = NULL; - return; - } - } - tmp->attrs = - (LDAPMod **) realloc (tmp->attrs, - sizeof (LDAPMod) * ++(tmp->attrcnt)); - if (tmp->attrs == NULL) - { - fprintf (stderr, "realloc: %s\n", strerror (errno)); - ldap_unbind_s (conn); - exit (-1); - } - - for (x = 0; tmp->attrs[x] != NULL; x++); - tmp->attrs[x] = (LDAPMod *) malloc (sizeof (LDAPMod)); - tmp->attrs[x]->mod_op = LDAP_MOD_ADD; - tmp->attrs[x]->mod_type = strdup (ldap_type_buffer); - tmp->attrs[x]->mod_values = (char **) calloc (sizeof (char *), 2); - tmp->attrs[x]->mod_values[0] = strdup (data); - tmp->attrs[x]->mod_values[1] = NULL; - tmp->attrs[x + 1] = NULL; - } -} - -/* Size of a mod_values list, plus the terminating NULL field. */ -int -get_attr_list_size (char **tmp) -{ - int i = 0; - char **ftmp = tmp; - while (*ftmp != NULL) - { - i++; - ftmp++; - } - return ++i; -} - - -/* take a hostname, and split it into a char ** of the dc parts, - * example, we have www.domain.com, this function will return: - * array[0] = com, array[1] = domain, array[2] = www. */ - -char ** -hostname_to_dn_list (char *hostname, char *zone, unsigned int flags) -{ - char *tmp; - static char *dn_buffer[64]; - int i = 0; - char *zname; - char *hnamebuff; - - zname = strdup (hostname); - - if (flags == DNS_OBJECT) - { - - if (strlen (zname) != strlen (zone)) - { - tmp = &zname[strlen (zname) - strlen (zone)]; - *--tmp = '\0'; - hnamebuff = strdup (zname); - zname = ++tmp; - } - else - hnamebuff = "@"; - } - else - { - zname = zone; - hnamebuff = NULL; - } - - for (tmp = strrchr (zname, '.'); tmp != (char *) 0; - tmp = strrchr (zname, '.')) - { - *tmp++ = '\0'; - dn_buffer[i++] = tmp; - } - dn_buffer[i++] = zname; - dn_buffer[i++] = hnamebuff; - dn_buffer[i] = NULL; - - return dn_buffer; -} - - -/* build an sdb compatible LDAP DN from a "dc_list" (char **). - * will append dNSTTL information to each RR Record, with the - * exception of "@"/SOA. */ - -char * -build_dn_from_dc_list (char **dc_list, unsigned int ttl, int flag) -{ - int size; - int x; - static char dn[1024]; - char tmp[128]; - - bzero (tmp, sizeof (tmp)); - bzero (dn, sizeof (dn)); - size = get_attr_list_size (dc_list); - for (x = size - 2; x > 0; x--) - { - if (flag == WI_SPEC) - { - if (x == (size - 2) && (strncmp (dc_list[x], "@", 1) == 0) && (ttl)) - sprintf (tmp, "relativeDomainName=%s + dNSTTL=%d,", dc_list[x], ttl); - else if (x == (size - 2)) - sprintf(tmp, "relativeDomainName=%s,",dc_list[x]); - else - sprintf(tmp,"dc=%s,", dc_list[x]); - } - else - { - sprintf(tmp, "dc=%s,", dc_list[x]); - } - - - strncat (dn, tmp, sizeof (dn) - strlen (dn)); - } - - sprintf (tmp, "dc=%s", dc_list[0]); - strncat (dn, tmp, sizeof (dn) - strlen (dn)); - - fflush(NULL); - return dn; -} - - -/* Initialize LDAP Conn */ -void -init_ldap_conn () -{ - int result; - conn = ldap_open (ldapsystem, LDAP_PORT); - if (conn == NULL) - { - fprintf (stderr, "Error opening Ldap connection: %s\n", - strerror (errno)); - exit (-1); - } - - result = ldap_simple_bind_s (conn, binddn, bindpw); - ldap_result_check ("ldap_simple_bind_s", "LDAP Bind", result); -} - -/* Like isc_result_check, only for LDAP */ -void -ldap_result_check (char *msg, char *dn, int err) -{ - if ((err != LDAP_SUCCESS) && (err != LDAP_ALREADY_EXISTS)) - { - fprintf(stderr, "Error while adding %s (%s):\n", - dn, msg); - ldap_perror (conn, dn); - ldap_unbind_s (conn); - exit (-1); - } -} - - - -/* For running the ldap_info run queue. */ -void -add_ldap_values (ldap_info * ldinfo) -{ - int result; - char dnbuffer[1024]; - - - if (ldapbase != NULL) - sprintf (dnbuffer, "%s,%s", ldinfo->dn, ldapbase); - else - sprintf (dnbuffer, "%s", ldinfo->dn); - - result = ldap_add_s (conn, dnbuffer, ldinfo->attrs); - ldap_result_check ("ldap_add_s", dnbuffer, result); -} - - - - -/* name says it all */ -void -usage () -{ - fprintf (stderr, - "zone2ldap -D [BIND DN] -w [BIND PASSWORD] -b [BASE DN] -z [ZONE] -f [ZONE FILE] -h [LDAP HOST] - [-c Create LDAP Base structure][-d Debug Output (lots !)] \n ");} diff --git a/contrib/sdb/zonetodb.c b/contrib/sdb/zonetodb.c deleted file mode 100644 index 2259d0b4a9..0000000000 --- a/contrib/sdb/zonetodb.c +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright (C) 2000, 2001 Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM - * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL - * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, - * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING - * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION - * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* $Id: zonetodb.c,v 1.10 2001/03/17 01:53:01 bwelling Exp $ */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -/* - * Generate a PostgreSQL table from a zone. - * - * This is compiled this with something like the following (assuming bind9 has - * been installed): - * - * gcc -g `isc-config.sh --cflags isc dns` -c zonetodb.c - * gcc -g -o zonetodb zonetodb.o `isc-config.sh --libs isc dns` -lpq - */ - -PGconn *conn = NULL; -char *dbname, *dbtable; -char str[10240]; - -void -closeandexit(int status) { - if (conn != NULL) - PQfinish(conn); - exit(status); -} - -void -check_result(isc_result_t result, const char *message) { - if (result != ISC_R_SUCCESS) { - fprintf(stderr, "%s: %s\n", message, - isc_result_totext(result)); - closeandexit(1); - } -} - -/* - * Canonicalize a string before writing it to the database. - * "dest" must be an array of at least size 2*strlen(source) + 1. - */ -static void -quotestring(const char *source, char *dest) { - while (*source != 0) { - if (*source == '\'') - *dest++ = '\''; - else if (*source == '\\') - *dest++ = '\\'; - *dest++ = *source++; - } - *dest++ = 0; -} - -void -addrdata(dns_name_t *name, dns_ttl_t ttl, dns_rdata_t *rdata) { - unsigned char namearray[DNS_NAME_MAXTEXT + 1]; - unsigned char canonnamearray[2 * DNS_NAME_MAXTEXT + 1]; - unsigned char typearray[20]; - unsigned char canontypearray[40]; - unsigned char dataarray[2048]; - unsigned char canondataarray[4096]; - isc_buffer_t b; - isc_result_t result; - PGresult *res; - - isc_buffer_init(&b, namearray, sizeof(namearray) - 1); - result = dns_name_totext(name, ISC_TRUE, &b); - check_result(result, "dns_name_totext"); - namearray[isc_buffer_usedlength(&b)] = 0; - quotestring(namearray, canonnamearray); - - isc_buffer_init(&b, typearray, sizeof(typearray) - 1); - result = dns_rdatatype_totext(rdata->type, &b); - check_result(result, "dns_rdatatype_totext"); - typearray[isc_buffer_usedlength(&b)] = 0; - quotestring(typearray, canontypearray); - - isc_buffer_init(&b, dataarray, sizeof(dataarray) - 1); - result = dns_rdata_totext(rdata, NULL, &b); - check_result(result, "dns_rdata_totext"); - dataarray[isc_buffer_usedlength(&b)] = 0; - quotestring(dataarray, canondataarray); - - snprintf(str, sizeof(str), - "INSERT INTO %s (NAME, TTL, RDTYPE, RDATA)" - " VALUES ('%s', %d, '%s', '%s')", - dbtable, canonnamearray, ttl, canontypearray, canondataarray); - printf("%s\n", str); - res = PQexec(conn, str); - if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) { - fprintf(stderr, "INSERT INTO command failed: %s\n", - PQresultErrorMessage(res)); - PQclear(res); - closeandexit(1); - } - PQclear(res); -} - -int -main(int argc, char **argv) { - char *porigin, *zonefile; - dns_fixedname_t forigin, fname; - dns_name_t *origin, *name; - dns_db_t *db = NULL; - dns_dbiterator_t *dbiter; - dns_dbnode_t *node; - dns_rdatasetiter_t *rdsiter; - dns_rdataset_t rdataset; - dns_rdata_t rdata = DNS_RDATA_INIT; - isc_mem_t *mctx = NULL; - isc_buffer_t b; - isc_result_t result; - PGresult *res; - - if (argc != 5) { - printf("usage: %s origin file dbname dbtable\n", argv[0]); - printf("Note that dbname must be an existing database.\n"); - exit(1); - } - - porigin = argv[1]; - zonefile = argv[2]; - dbname = argv[3]; - dbtable = argv[4]; - - mctx = NULL; - result = isc_mem_create(0, 0, &mctx); - check_result(result, "isc_mem_create"); - - isc_buffer_init(&b, porigin, strlen(porigin)); - isc_buffer_add(&b, strlen(porigin)); - dns_fixedname_init(&forigin); - origin = dns_fixedname_name(&forigin); - result = dns_name_fromtext(origin, &b, dns_rootname, ISC_FALSE, NULL); - check_result(result, "dns_name_fromtext"); - - db = NULL; - result = dns_db_create(mctx, "rbt", origin, dns_dbtype_zone, - dns_rdataclass_in, 0, NULL, &db); - check_result(result, "dns_db_create"); - - result = dns_db_load(db, zonefile); - check_result(result, "dns_db_load"); - - printf("Connecting to '%s'\n", dbname); - conn = PQsetdb(NULL, NULL, NULL, NULL, dbname); - if (PQstatus(conn) == CONNECTION_BAD) { - fprintf(stderr, "Connection to database '%s' failed: %s\n", - dbname, PQerrorMessage(conn)); - closeandexit(1); - } - - snprintf(str, sizeof(str), - "DROP TABLE %s", dbtable); - printf("%s\n", str); - res = PQexec(conn, str); - if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) - fprintf(stderr, "DROP TABLE command failed: %s\n", - PQresultErrorMessage(res)); - PQclear(res); - - snprintf(str, sizeof(str), "BEGIN"); - printf("%s\n", str); - res = PQexec(conn, str); - if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) { - fprintf(stderr, "BEGIN command failed: %s\n", - PQresultErrorMessage(res)); - PQclear(res); - closeandexit(1); - } - PQclear(res); - - snprintf(str, sizeof(str), - "CREATE TABLE %s " - "(NAME TEXT, TTL INTEGER, RDTYPE TEXT, RDATA TEXT)", - dbtable); - printf("%s\n", str); - res = PQexec(conn, str); - if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) { - fprintf(stderr, "CREATE TABLE command failed: %s\n", - PQresultErrorMessage(res)); - PQclear(res); - closeandexit(1); - } - PQclear(res); - - dbiter = NULL; - result = dns_db_createiterator(db, ISC_FALSE, &dbiter); - check_result(result, "dns_db_createiterator()"); - - result = dns_dbiterator_first(dbiter); - check_result(result, "dns_dbiterator_first"); - - dns_fixedname_init(&fname); - name = dns_fixedname_name(&fname); - dns_rdataset_init(&rdataset); - dns_rdata_init(&rdata); - - while (result == ISC_R_SUCCESS) { - node = NULL; - result = dns_dbiterator_current(dbiter, &node, name); - if (result == ISC_R_NOMORE) - break; - check_result(result, "dns_dbiterator_current"); - - rdsiter = NULL; - result = dns_db_allrdatasets(db, node, NULL, 0, &rdsiter); - check_result(result, "dns_db_allrdatasets"); - - result = dns_rdatasetiter_first(rdsiter); - - while (result == ISC_R_SUCCESS) { - dns_rdatasetiter_current(rdsiter, &rdataset); - result = dns_rdataset_first(&rdataset); - check_result(result, "dns_rdataset_first"); - while (result == ISC_R_SUCCESS) { - dns_rdataset_current(&rdataset, &rdata); - addrdata(name, rdataset.ttl, &rdata); - dns_rdata_reset(&rdata); - result = dns_rdataset_next(&rdataset); - } - dns_rdataset_disassociate(&rdataset); - result = dns_rdatasetiter_next(rdsiter); - } - dns_rdatasetiter_destroy(&rdsiter); - dns_db_detachnode(db, &node); - result = dns_dbiterator_next(dbiter); - } - - snprintf(str, sizeof(str), "COMMIT TRANSACTION"); - printf("%s\n", str); - res = PQexec(conn, str); - if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) { - fprintf(stderr, "COMMIT command failed: %s\n", - PQresultErrorMessage(res)); - PQclear(res); - closeandexit(1); - } - PQclear(res); - dns_dbiterator_destroy(&dbiter); - dns_db_detach(&db); - isc_mem_destroy(&mctx); - closeandexit(0); -}