<!--
Copyright Internet Systems Consortium, Inc. ("ISC")

This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, you can obtain one at https://mozilla.org/MPL/2.0/.

Copyright (C) Stichting NLnet, Netherlands, stichting@nlnet.nl.

The development of Dynamically Loadable Zones (DLZ) for Bind 9 was
conceived and contributed by Rob Butler.

SPDX-License-Identifier: ISC and MPL-2.0

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 STICHTING NLNET DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL STICHTING NLNET 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.
-->

BIND 9 DLZ MySQL module with support for dynamic DNS (DDNS)

Adapted from code contributed by Marty Lee, Maui Systems Ltd.

This is a dynamically loadable zone (DLZ) plugin that uses a fixed-
schema MySQL database for back-end storage. It allows zone data
to be updated via dynamic DNS updates, and sends DNS NOTIFY packets
to other name servers when appropriate.

The database for this module uses the following schema:

    CREATE TABLE `Zones` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `domain` varchar(128) NOT NULL DEFAULT '',
        `host` varchar(128) NOT NULL DEFAULT '',
        `admin` varchar(128) NOT NULL DEFAULT '',
        `serial` int(11) NOT NULL DEFAULT '1',
        `expire` int(11) NOT NULL DEFAULT '86400',
        `refresh` int(11) NOT NULL DEFAULT '86400',
        `retry` int(11) NOT NULL DEFAULT '86400',
        `minimum` int(11) NOT NULL DEFAULT '86400',
        `ttl` int(11) NOT NULL DEFAULT '86400',
        `writeable` tinyint(1) NOT NULL DEFAULT '0',
        PRIMARY KEY (`id`),
        KEY `domain_idx` (`domain`)
    );

    CREATE TABLE `ZoneData` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `zone_id` int(11) NOT NULL,
        `name` varchar(128) NOT NULL DEFAULT '',
        `type` varchar(16) NOT NULL DEFAULT '',
        `ttl` int(11) NOT NULL DEFAULT '86400',
        `data` varchar(128) NOT NULL DEFAULT '',
        PRIMARY KEY (`id`),
        KEY `zone_idx` (`zone_id`),
        KEY `name_idx` (`zone_id`, `name`),
        KEY `type_idx` (`type`)
    );

'Zones' contains information about specific zones:
 - domain: the zone name
 - admin: the zone administrator
 - serial, expire, reresh, retry, minimum: values in the SOA record
 - ttl: default zone TTL
 - writeable: set to true if the zone can be updated via DDNS

'ZoneData' contains the individual records within the zone:
 - zone_id: the 'id' from the corresponding record in Zones 
 - name: domain name, relative to the zone apex. (Data at the zone
   apex itself may use a blank name or "@".)
 - type: the RR type, expressed as text
 - ttl: the record's TTL
 - data: the records rdata, expressed as text.

To configure this module in named.conf:

dlz "mysqldlz" {
    database "dlopen <path to>/dlz_mysqldyn_mod.so <dbname> [dbhost [dbuser [dbpass]]]";
};
