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 ofdump()
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.