######################################################################
    DNS::ZoneParse 0.96
######################################################################

NAME
    DNS::ZoneParse - Parse and manipulate DNS Zone Files.

SYNOPSIS
        use DNS::ZoneParse;
    
        my $zonefile = DNS::ZoneParse->new("/path/to/dns/zonefile.db", $origin);
    
        # Get a reference to the MX records
        my $mx = $zonefile->mx;
    
        # Change the first mailserver on the list
        $mx->[0] = { host => 'mail.localhost.com',
                     priority => 10,
                     name => '@' };
    
        # update the serial number
        $zonefile->new_serial();
    
        # write the new zone file to disk 
        open NEWZONE, ">/path/to/dns/zonefile.db" or die "error";
        print NEWZONE $zonefile->output();
        close NEWZONE;

INSTALLATION
       perl Makefile.PL
       make
       make test
       make install

    Win32 users substitute "make" with "nmake" or equivalent. nmake is
    available at
    http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15
    .exe

DESCRIPTION
    This module will parse a Zone File and put all the Resource Records
    (RRs) into an anonymous hash structure. At the moment, the following
    types of RRs are supported: SOA, NS, MX, A, CNAME, TXT, PTR. It could be
    useful for maintaining DNS zones, or for transferring DNS zones to other
    servers. If you want to generate an XML-friendly version of your zone
    files, it is easy to use XML::Simple with this module once you have
    parsed the zonefile.

    DNS::ZoneParse scans the DNS zonefile - removes comments and seperates
    the file into its constituent records. It then parses each record and
    stores the records internally. See below for information on the accessor
    methods.

  METHODS
    new This creates the DNS::ZoneParse Object and loads the zonefile

        Example: my $zonefile = DNS::ZoneParse->new("/path/to/zonefile.db");

        You can also initialise the object with the contents of a file: my
        $zonefile = DNS::ZoneParse->new( \$zone_contents );

        You can pass a second, optional parameter to the constructor to
        supply an $origin if none can be found in the zone file.

            my $zonefile = DNS::ZoneParse->new( \$zone_contents, $origin );

    a(), cname(), srv(), mx(), ns(), ptr()
        These methods return references to the resource records. For
        example:

            my $mx = $zonefile->mx;

        Returns the mx records in an array reference.

        A, CNAME, NS, MX, PTR, and SRV records have the following
        properties: 'ttl', 'class', 'host', 'name'

        MX records also have a 'priority' property.

        SRV records also have 'priority', 'weight' and 'port' properties

    soa()
        Returns a hash reference with the following properties: 'serial',
        'origin', 'primary', 'refresh', 'retry', 'ttl', 'minimumTTL',
        'email', 'expire'

    dump
        Returns a copy of the datastructute that stores all the resource
        records. This might be useful if you want to quickly transform the
        data into another format, such as XML.

    new_serial
        "new_serial()" incriments the Zone serial number. It will generate a
        date-based serial number. Or you can pass a positive number to add
        to the current serial number.

        Examples:

            $zonefile->new_serial(); 
                    # generates a new serial number based on date:
                    # YYYYmmddHH format, incriments current serial
                    # by 1 if the new serial is still smaller

            $zonefile->new_serial(50);  
                    # adds 50 to the original serial number

    output
        "output()" returns the new zonefile output as a string. If you wish
        your output formatted differently, you can pass the output of
        "dump()" to your favourite templating module.

  EXAMPLES
    This script will print the A records in a zone file, add a new A record
    for the name "new" and then return the zone file.

        use strict;
        use DNS::ZoneParse;
    
        my $zonefile = DNS::ZoneParse->new("/path/to/zonefile.db");
    
        print "Current A Records\n";
        my $a_records = $zonefile->a();
    
        foreach my $record (@$a_records) {
            print "$record->{name} resolves at $record->{host}\n";
        }
    
        push (@$a_records, { name => 'new', class => 'IN',
                             host => '127.0.0.1', ttl => '' });
    
        $zonefile->new_serial();
        my $newfile = $zonefile->output();

    This script will convert a DNS Zonefile to an XML file using
    XML::Simple.

        use strict;
        use DNS::ZoneParse;
        use XML::Simple;

        my $zonefile = DNS::ZoneParse->new("/path/to/zonefile.db");

        my $new_xml = XMLout($zonefile->dump,
                             noattr => 1,
                             suppressempty => 1,
                             rootname => $zonefile->origin);

CHANGES
    see Changes

API
    The DNS::ZoneParse API may change in future versions. At present, the
    parsing is not as strict as it should be and support for $ORIGIN and
    $TTL is quite basic. It would also be nice to support the "INCLUDE"
    statement. Furthermore, parsing large zonefiles with thousands of
    records can use lots of memory - some people have requested a callback
    interface.

BUGS
    I can squash more bugs with your help. Please let me know if you spot
    something that doesn't work as expected.

    You can report bugs via the CPAN RT:
    <http://rt.cpan.org/NoAuth/Bugs.html?Dist=DNS-ZoneParse>

    If possible, please provide a diff against t/dns-zoneparse.t and
    t/test-zone.db that demonstrates the bug(s).

SEE ALSO
    Other modules with similar functionality:

    Net::DNS::ZoneParser, Net::DNS::ZoneFile, DNS::ZoneFile

AUTHOR
    Simon Flack

MAINTENANCE
    Maintainer: Mike Schilli, m@perlmeister.com, Bug queue:
    http://rt.cpan.org/Public/Dist/Display.html?Name=DNS-ZoneParse

LICENSE
    DNS::ZoneParse is free software which you can redistribute and/or modify
    under the same terms as Perl itself.

