NAME
   Net::DNS::Nameserver::Trivial - Trivial DNS server, that is based on
   Net::DNS::Nameserver module.

SYNOPSIS
           use Net::DNS::Nameserver::Trivial;

           # Configuration of zone(s) -----------------------------------------

           my $zones = {
                    '_'     => {
                                     'slaves'      => '10.1.0.1'
                                    },

                    'A'     => {
                                     'ns.example.com'   => '10.11.12.13',
                                     'mail.example.com' => '10.11.12.14',
                                     'web.example.com'  => '10.11.12.15',
                                     'srv.example.com'  => '10.11.12.16'
                                    },

                    'AAAA'  => {
                                      'v6.example.com'      =>     'fe80::20c:29ff:fee2:ed62',
                                    },

                    'CNAME' => {
                                             'srv.example.com' => 'dns.example.com'
                                    },

                    'MX'    => {
                                      'example.com' => 'mail.example.com'
                                    },

                    'NS'    => {
                                           'example.com' => 'ns.example.com'
                                    },

                    'SOA'   => {
                                           'example.com' => 'ns.example.com'
                                    }
              };

           # Configuration of server ------------------------------------------
           my $params = {

                   'FLAGS'         => {
                                           'ra' => 0,      # recursion available
                                    },

                   'RESOLVER'      => {
                                           'tcp_timeout'   => 50,
                                           'udp_timeout'   => 50
                                    },

                   'CACHE'         => {
                                           'size'                  => 32m, # size of cache
                                           'expire'        => 3d,  # expire time of cache
                                           'init'                  => 1,   # clear cache at startup
                                           'unlink'                => 1,   # destroy cache on exit
                                           'file'          => '../var/lib/cache.db'        # cache
                                    },

                   'SERVER'        => {
                                           'address'               => '0.0.0.0', # all interfaces
                                           'port'                  => 53,
                                           'verbose'               => 0,
                                           'truncate'      => 1,   # truncate too big
                                           'timeout'               => 5    # seconds
                                    },

                   'LOG'           => {
                                           'file'                  => '/var/log/dns/mainlog.log',
                                           'level'                 => 'INFO'
                                    },

           };

           # Run server -------------------------------------------------------

           my $ns = Net::DNS::Nameserver::Trivial->new( $zones, $params );
       $ns->main_loop;

           #
           # ...OR SHORT VERSION with configuration files
           #

           use Config::Tiny;
           use Net::DNS::Nameserver::Trivial;

           # Read in config of zone -------------------------------------------
           my $zones       = Config::Tiny->read( '../etc/dom.ini' );

           # Read in config of server -----------------------------------------
           my $params      = Config::Tiny->read( '../etc/dns.ini' );

           # Run server -------------------------------------------------------
           my $ns = Net::DNS::Nameserver::Trivial->new( $zones, $params );
           $ns->main_loop;

DESCRIPTION
   The "Net::DNS::Nameserver::Trivial" is a very simple nameserver, that is
   sufficient for local domains. It supports cacheing, slaves, zone
   transfer and common records such as A, AAAA, SOA, NS, MX, TXT, PTR,
   CNAME. This module was tested in an environment with over 1000 users and
   for now is running in a production environment.

   The main goal was to produce server, that is very easy in configuration
   and it can be setup in a few seconds. So You should consider BIND if for
   some reasons You need more powerful and complex nameserver.

   This module was prepared to cooperete with "Config::Tiny", so it is
   possible to prepare configuration files and run server with them, as it
   was shown in an example above.

WARNING
   This version is incompatible with previous versions, because of new
   format of second configuration file. However modifications are simple.

SUBROUTINES/METHODS
   new( $zones, $params )
       This is constructor. You have to pass to it hash with configuration
       of zones and second hash - with configuration for server.

       The first hash sould contains sections (as shown in a SINOPSIS):

       "_"     This section is a hash, that should contains information of
               slaves of our server. For example:

                       '_' => {
                               'slaves'      => '10.1.0.1'
                       }

       "A"     This section is a hash, that is a mapping FDQN to IPv4, for
               example:

                       'A' => {
                                 'ns.example.com'   => '10.11.12.13',
                                 'mail.example.com' => '10.11.12.14',
                                 'web.example.com'  => '10.11.12.15',
                                 'srv.example.com'  => '10.11.12.16'
                                }

       "AAAA"  This section is a hash, that is a mapping FDQN to IPv6, for
               example:

                       'AAAA' => {
                               'v6.example.com'  => 'fe80::20c:29ff:fee2:ed62',
                       }

       "MX"    This section is a hash, that contains information about mail
               servers for domains. For example, if *mail.example.com* is a
               mail server for domain *example.com*, a configuration should
               looks like this:

                       'MX' => {
                               'example.com' => 'mail.example.com'
                       }

       "CNAME" This section is a hash, that contains aliases for hosts. For
               example, if alias.example.com and alias1.example.com are
               aliases for a server srv.example.com, a configuration should
               looks like this:

                       'CNAME' => {
                               'srv.example.com' => 'alias.example.com, alias1.example.com'
                       }

       "NS"    This section is a hash, that contains information about
               nameservers for a domain. For example:

                       'NS' => {
                               'example.com' => 'ns.example.com'
                       }

       "SOA"   This section is a hash, that contains information about
               authoritative nameserver for a domain. For example:

                       'SOA' => {
                               'example.com' => 'ns.example.com'
                       }

       The second hash should contains variables sufficient for
       configuration of server, cache, logs, etc. The meaning of hash
       elements was shown below.

       "SERVER"
               This section describes options of server.

               "timeout"   Timeout for idle connections.

               "address"   Local IP address to listen on. Server will be
                           listenting on all interfecas if You specify
                           0.0.0.0.

               "port"      Local port to listen on.

               "truncate"  Truncates UDP packets that are to big for the
                           reply

               "verbose"   Be verbose. It is useful only for debugging.

       "CACHE" This section describes options of server's cache.

               "size"      A size of cache, that will be used by server.

               "expire"    Expiration time of entries in a cache. It can be
                           diffrent than TTL value. It is effective if
                           makeing of connection to other server is too
                           expensive (i.e. too long).

               "init"      Clear cache at startup.

               "file"      A path to cache file.

               "unlink"    Unlink a cache file on exit.

       "LOG"   This section describes options of server's log.

               "file"      A path to log file.

               "level"     Log level.

       "RESLOVER"
               This section describes options of resolver.

               "tcp_timeout"
                           A timeout for TCP connections.

               "udp_timeout"
                           A timeout for UDP connections.

   "main_loop()"
       This method starts main loop of a nameserver. See an example in a
       SINOPSIS.

USING CONFIGURATION FILES - examples
   "Net::DNS::Nameserver::Trivial" was prepared to cooperate with
   "Config::Tiny" module. It is possible to prepare configuration files for
   zones and for server and then make server server run using those files.

   Config file for zone *example.com* could looks like this:

           slaves              = 10.1.0.1

           [NS]
           example.com         = ns.example.com

           [SOA]
           example.com         = ns.example.com

           [MX]
           example.com         = mail.example.com'

           [AAAA]

           [CNAME]
           srv.example.com     = alias.example.com, alias1.example.com

           [A]
           ns.example.com      = 10.11.12.13
           mail.example.com    = 10.11.12.14
           web.example.com     = 10.11.12.15
           srv.example.com     = 10.11.12.16

   Config file for server could looks like this:

           [FLAGS]
           ra                              = 0

           [RESOLVER]
           tcp_timeout             = 50
           udp_timeout             = 50

           [CACHE]
           size                    = 32m
           expire                  = 3d
           init                    = 1
           unlink                  = 1
           file                    = /var/lib/cache.db

           [SERVER]
           address                 = 0.0.0.0
           port                    = 53
           verbose                 = 0
           truncate        = 1
           timeout                 = 5

           [LOG]
           file                    = /var/log/dns/mainlog.log
           level                   = INFO

   And then a code of server shold looks like this:

           use Config::Tiny;
           use Net::DNS::Nameserver::Trivial;

           # Read in config of zone -------------------------------------------
           my $zones       = Config::Tiny->read( '/path/to/zone/file.ini' );

           # Read in config of server -----------------------------------------
           my $params      = Config::Tiny->read( '/path/to/server/config.ini' );

           # Run server -------------------------------------------------------
           my $ns = Net::DNS::Nameserver::Trivial->new( $zones, $params );
           $ns->main_loop;

   A complete example is placed in the example directory.

DEPENDENCIES
   Net::IP::XS
   Net::DNS
   Log::Tiny
   List::MoreUtils
   Cache::FastMmap
   Regexp::IPv6

INCOMPATIBILITIES
   None known.

BUGS AND LIMITATIONS
   I'm sure, that they must be there :-) ...but if You found one, give me a
   feedback.

AUTHOR
   Strzelecki Ɓukasz <[email protected]>

LICENCE AND COPYRIGHT
   This program is free software; you can redistribute it and/or modify it
   under the same terms as Perl itself.

   See http://www.perl.com/perl/misc/Artistic.html