2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 14:35:26 +00:00

[master] mysql DLZ module

3569.	[contrib]	Ported mysql DLZ driver to dynamically-loadable
			module, and added multithread support. [RT #33394]
This commit is contained in:
Evan Hunt
2013-05-06 10:54:14 -07:00
parent 2147c42301
commit 5ba1d3dcc5
8 changed files with 1266 additions and 0 deletions

View File

@@ -1,3 +1,6 @@
3569. [contrib] Ported mysql DLZ driver to dynamically-loadable
module, and added multithread support. [RT #33394]
3568. [cleanup] Add a product description line to the version file,
to be reported by named -v/-V. [RT #33366]

View File

@@ -55,6 +55,7 @@
#include <stdarg.h>
#include <stdint.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/errno.h>
@@ -459,3 +460,34 @@ destroy_dbinstance(dbinstance_t *dbi) {
/* return, and detach the memory */
free(dbi);
}
char *
get_parameter_value(const char *input, const char* key) {
int keylen;
char *keystart;
char value[255];
int i;
if (key == NULL || input == NULL || *input == '\0')
return (NULL);
keylen = strlen(key);
if (keylen < 1)
return (NULL);
keystart = strstr(input, key);
if (keystart == NULL)
return (NULL);
for (i = 0; i < 255; i++) {
value[i] = keystart[keylen + i];
if (isspace(value[i]) || value[i] == '\0') {
value[i] = '\0';
break;
}
}
return (strdup(value));
}

View File

@@ -0,0 +1,21 @@
prefix = /usr
libdir = $(prefix)/lib/bind9
CFLAGS=-fPIC -g -I../include
MYSQL_LIBS=-lmysqlclient
all: dlz_mysql_dynamic.so
dlz_dbi.o: ../common/dlz_dbi.c
$(CC) $(CFLAGS) -c ../common/dlz_dbi.c
dlz_mysql_dynamic.so: dlz_mysql_dynamic.c dlz_dbi.o
$(CC) $(CFLAGS) -shared -o dlz_mysql_dynamic.so \
dlz_mysql_dynamic.c dlz_dbi.o $(MYSQL_LIBS)
clean:
rm -f dlz_mysql_dynamic.so *.o
install: dlz_mysql_dynamic.so
mkdir -p $(DESTDIR)$(libdir)
install dlz_mysql_dynamic.so $(DESTDIR)$(libdir)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
These files were used for testing on Ubuntu Linux using MySQL
- Install MySQL: sudo apt-get install mysql-server
- Run "mysql --user=USER --password=PASSWORD < dlz.schema" to set up database
- Run "mysql --user=USER --password=PASSWORD < dlz.data" to populate it
- update named.conf with correct USER and PASSWORD

View File

@@ -0,0 +1,11 @@
use BindDB;
INSERT INTO `records` (`id`, `zone`, `ttl`, `type`, `host`, `mx_priority`, `data`, `primary_ns`, `resp_contact`, `serial`, `refresh`, `retry`, `expire`, `minimum`) VALUES
('', 'example.com', 86400, 'SOA', '@', NULL, NULL, 'ns1.example.com.', 'info.example.com.', 2011043001, 10800, 7200, 604800, 86400),
('', 'example.com', 86400, 'NS', '@', NULL, 'ns1.example.com.', NULL, NULL, NULL, NULL, NULL, NULL, NULL),
('', 'example.com', 86400, 'NS', '@', NULL, 'ns2.example.com.', NULL, NULL, NULL, NULL, NULL, NULL, NULL), ('', 'example.com', 86400, 'MX', '@',
10, 'mail.example.com.', NULL, NULL, NULL, NULL, NULL, NULL, NULL), ('', 'example.com', 86400, 'A', '@', NULL, '192.168.0.2', NULL, NULL,
NULL, NULL, NULL, NULL, NULL), ('', 'example.com', 86400, 'CNAME', 'www', NULL, '@', NULL, NULL, NULL, NULL, NULL, NULL, NULL),
('', 'example.com', 86400, 'A', 'ns1', NULL, '192.168.0.111', NULL, NULL, NULL, NULL, NULL, NULL, NULL),
('', 'example.com', 86400, 'A', 'ns2', NULL, '192.168.0.222', NULL, NULL, NULL, NULL, NULL, NULL, NULL),
('', 'example.com', 86400, 'A', 'mail', NULL, '192.168.0.3', NULL, NULL, NULL, NULL, NULL, NULL, NULL),
('', 'example.com', 86400, 'TXT', '@', NULL, 'v=spf1 ip:192.168.0.3 ~all', NULL, NULL, NULL, NULL, NULL, NULL, NULL)

View File

@@ -0,0 +1,30 @@
CREATE DATABASE `BindDB` DEFAULT CHARACTER SET latin1;
USE `BindDB`;
CREATE TABLE IF NOT EXISTS `records` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`zone` varchar(255) NOT NULL,
`ttl` int(11) NOT NULL DEFAULT '86400',
`type` varchar(255) NOT NULL,
`host` varchar(255) NOT NULL DEFAULT '@',
`mx_priority` int(11) DEFAULT NULL,
`data` text,
`primary_ns` varchar(255) DEFAULT NULL,
`resp_contact` varchar(255) DEFAULT NULL,
`serial` bigint(20) DEFAULT NULL,
`refresh` int(11) DEFAULT NULL,
`retry` int(11) DEFAULT NULL,
`expire` int(11) DEFAULT NULL,
`minimum` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `type` (`type`),
KEY `host` (`host`),
KEY `zone` (`zone`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `xfr` (
`zone` varchar(255) NOT NULL,
`client` varchar(255) NOT NULL,
KEY `zone` (`zone`),
KEY `client` (`client`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

View File

@@ -0,0 +1,49 @@
/*
* Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS. IN NO EVENT SHALL ISC 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.
*/
controls { };
options {
directory ".";
port 5300;
pid-file "named.pid";
session-keyfile "session.key";
listen-on { any; };
listen-on-v6 { none; };
recursion no;
};
key rndc_key {
secret "1234abcd8765";
algorithm hmac-md5;
};
controls {
inet 127.0.0.1 port 9953 allow { any; } keys { rndc_key; };
};
dlz "test" {
database "dlopen ../dlz_mysql_dynamic.so
{
host=127.0.0.1 port=3306 socket=/tmp/mysql.sock
dbname=BindDB user=USER pass=PASSWORD threads=2
}
{SELECT zone FROM records WHERE zone = '$zone$'}
{SELECT ttl, type, mx_priority, IF(type = 'TXT', CONCAT('\"',data,'\"'), data) AS data FROM records WHERE zone = '$zone$' AND host = '$record$' AND type <> 'SOA' AND type <> 'NS'}
{SELECT ttl, type, data, primary_ns, resp_contact, serial, refresh, retry, expire, minimum FROM records WHERE zone = '$zone$' AND (type = 'SOA' OR type='NS')}
{SELECT ttl, type, host, mx_priority, IF(type = 'TXT', CONCAT('\"',data,'\"'), data) AS data, resp_contact, serial, refresh, retry, expire, minimum FROM records WHERE zone = '$zone$' AND type <> 'SOA' AND type <> 'NS'}
{SELECT zone FROM xfr where zone='$zone$' AND client = '$client$'}";
};