/Parse-DNS-Zone

Perl module for parsing zone files

Primary LanguagePerlOtherNOASSERTION

Parse::DNS::Zone parses a Zonefile, defining a zone in a domain name hierarchy. The module then offers an object oriented way of getting values out of the zone.

Validation of RRs or RR-names are out of the scope of this module.

Synopsis

Consider the following zonefile, let's call it db.example.org:

@             3600  IN  SOA  ns1.example.net. hostmaster.example.net. (
                                 2020121120
                                 7200
                                 3600
                                 1209600
                                 3600
                             )

              86400 IN  NS   ns1.example.net.
              86400 IN  NS   ns2.example.net.

              86400 IN  A    192.0.2.34
	      86400 IN  MX   0 .
www           86400 IN  A    192.0.2.34

And imagine we would want to programmatically extract information from that. Maybe this module can help?

use 5.020;
use Parse::DNS::Zone;

my $pdz = Parse::DNS::Zone->new(
	zonefile=>'db.example.org',
	origin=>'example.org.',
);

# Get the A record of www.example.org:
say "A ", $pdz->get_rdata(name=>'www', rr=>'A');

# Get example.org's MX record:
say "MX ", $pdz->get_rdata(name=>'@', rr=>'MX');

# Get example.org's NS records:
say "NS ", join(", ", $pdz->get_rdata(name=>'@', rr=>'NS'));
# or only the first:
say "NS ", scalar $pdz->get_rdata(name=>'@', rr=>'NS');
# or only the second (counting from 0):
say "NS ", scalar $pdz->get_rdata(name=>'@', rr=>'NS', n=>1);

# Getting SOA values
say "mname=", $pdz->get_mname();
say "rname=", $pdz->get_rname();
say "serial=", $pdz->get_serial();

Installation

perl Makefile.PL
make
make test
make install

(Note that the last step, make install, may require you to have root permissions. But avoid running it as root unless you trust me for some weird reason. There are various solutions, but one of the simpler is local::lib, this sets up a user local perl module install path in your home directory.)

Status and limitations

This module is tested against simple Bind9 and nsd3 zones, please report success or failures on other nameds, with similar RFC1034 format. Patches/suggestions to the test suite for edge cases are especially appreciated, regardless if the module already handles it or not.

A design goal of this module is to have minimum knowledge of the RRTYPEs available, so that it does not need to kept up to date with further extensions of the DNS protocol.

The module is not designed to handle very large zones.

Availability

Latest stable version is available on CPAN. Current development version is available on https://github.com/olof/Parse-DNS-Zone.

Version numbering

Up until version 0.51, the version numbers should be interpreted as floating point numbers, and 0.5 is thus higher than 0.42. This is true for later versions as well, but I will make sure the ordering is correct also for lexical sorting (by appending zeroes). For instance, 0.51 was followed by 0.60, not 0.6.

Closing remarks

Have fun with DNS.