man DNS::ZoneParse () - Parse and manipulate DNS Zone Files.
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 CW$zonefile = DNS::ZoneParse->new(/path/to/zonefile.db);
You can also initialise the object with the contents of a file:
my CW$zonefile = DNS::ZoneParse->new( \$zone_contents );
You can pass a second, optional parameter to the constructor to supply an
CW$origin if none can be found in the zone file.
my $zonefile = DNS::ZoneParse->new( \$zone_contents, $origin );
- a(), cname(), 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 and PTR records have the following properties: 'ttl', 'class', 'host', 'name' MX records also have a 'priority' property. - 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
-
CWnew_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(5); # adds 50 to the original serial number
- output
- CWoutput() returns the new zonefile output as a string. If you wish your output formatted differently, you can pass the output of CWdump() 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 CW$ORIGIN and CW$TTL is quite basic. It would also be nice to support the CWINCLUDE 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
LICENSE
DNS::ZoneParse is free software which you can redistribute and/or modify under the same terms as Perl itself.