NAME
Net::DNS - Perl interface to the DNS resolver
SYNOPSIS
use Net::DNS;
DESCRIPTION
Net::DNS is a collection of Perl modules that act as a Domain Name System (DNS) resolver. It allows the programmer to perform DNS queries that are beyond the capabilities of gethostbyname
and gethostbyaddr
.
The programmer should be somewhat familiar with the format of a DNS packet and its various sections. See RFC 1035 or DNS and BIND (Albitz & Liu) for details.
Resolver Objects
A resolver object is an instance of the Net::DNS::Resolver class. A program can have multiple resolver objects, each maintaining its own state information such as the nameservers to be queried, whether recursion is desired, etc.
Packet Objects
Net::DNS::Resolver queries return Net::DNS::Packet objects. Packet objects have five sections:
The header section, a Net::DNS::Header object.
The question section, a list of Net::DNS::Question objects.
The answer section, a list of Net::DNS::RR objects.
The authority section, a list of Net::DNS::RR objects.
The additional section, a list of Net::DNS::RR objects.
Update Objects
The Net::DNS::Update package is a subclass of Net::DNS::Packet for creating packet objects to be used in dynamic updates.
Header Objects
Net::DNS::Header objects represent the header section of a DNS packet.
Question Objects
Net::DNS::Question objects represent the question section of a DNS packet.
RR Objects
Net::DNS::RR is the base class for DNS resource record (RR) objects in the answer, authority, and additional sections of a DNS packet.
Don't assume that RR objects will be of the type you requested -- always check an RR object's type before calling any of its methods.
METHODS
See the manual pages listed above for other class-specific methods.
version
print Net::DNS->version, "\n";
Returns the version of Net::DNS.
mx
# Use a default resolver -- can't get an error string this way.
use Net::DNS;
my @mx = mx("example.com");
# Use your own resolver object.
use Net::DNS;
my $res = Net::DNS::Resolver->new;
my @mx = mx($res, "example.com");
Returns a list of Net::DNS::RR::MX objects representing the MX records for the specified name; the list will be sorted by preference. Returns an empty list if the query failed or no MX records were found.
This method does not look up A records -- it only performs MX queries.
See "EXAMPLES" for a more complete example.
yxrrset
Use this method to add an "RRset exists" prerequisite to a dynamic update packet. There are two forms, value-independent and value-dependent:
# RRset exists (value-independent)
$update->push(pre => yxrrset("host.example.com A"));
Meaning: At least one RR with the specified name and type must exist.
# RRset exists (value-dependent)
$packet->push(pre => yxrrset("host.example.com A 10.1.2.3"));
Meaning: At least one RR with the specified name and type must exist and must have matching data.
Returns a Net::DNS::RR
object or undef
if the object couldn't be created.
nxrrset
Use this method to add an "RRset does not exist" prerequisite to a dynamic update packet.
$packet->push(pre => nxrrset("host.example.com A"));
Meaning: No RRs with the specified name and type can exist.
Returns a Net::DNS::RR
object or undef
if the object couldn't be created.
yxdomain
Use this method to add a "name is in use" prerequisite to a dynamic update packet.
$packet->push(pre => yxdomain("host.example.com"));
Meaning: At least one RR with the specified name must exist.
Returns a Net::DNS::RR
object or undef
if the object couldn't be created.
nxdomain
Use this method to add a "name is not in use" prerequisite to a dynamic update packet.
$packet->push(pre => nxdomain("host.example.com"));
Meaning: No RR with the specified name can exist.
Returns a Net::DNS::RR
object or undef
if the object couldn't be created.
rr_add
Use this method to add RRs to a zone.
$packet->push(update => rr_add("host.example.com A 10.1.2.3"));
Meaning: Add this RR to the zone.
RR objects created by this method should be added to the "update" section of a dynamic update packet. The TTL defaults to 86400 seconds (24 hours) if not specified.
Returns a Net::DNS::RR
object or undef
if the object couldn't be created.
rr_del
Use this method to delete RRs from a zone. There are three forms: delete an RRset, delete all RRsets, and delete an RR.
# Delete an RRset.
$packet->push(update => rr_del("host.example.com A"));
Meaning: Delete all RRs having the specified name and type.
# Delete all RRsets.
$packet->push(update => rr_del("host.example.com"));
Meaning: Delete all RRs having the specified name.
# Delete an RR.
$packet->push(update => rr_del("host.example.com A 10.1.2.3"));
Meaning: Delete all RRs having the specified name, type, and data.
RR objects created by this method should be added to the "update" section of a dynamic update packet.
Returns a Net::DNS::RR
object or undef
if the object couldn't be created.
EXAMPLES
The following examples show how to use the Net::DNS
modules. See the other manual pages and the demo scripts included with the source code for additional examples.
See the Net::DNS::Update
manual page for an example of performing dynamic updates.
Look up a host's addresses.
use Net::DNS;
my $res = Net::DNS::Resolver->new;
my $query = $res->search("host.example.com");
if ($query) {
foreach my $rr ($query->answer) {
next unless $rr->type eq "A";
print $rr->address, "\n";
}
} else {
warn "query failed: ", $res->errorstring, "\n";
}
Find the nameservers for a domain.
use Net::DNS;
my $res = Net::DNS::Resolver->new;
my $query = $res->query("example.com", "NS");
if ($query) {
foreach $rr (grep { $_->type eq 'NS' } $query->answer) {
print $rr->nsdname, "\n";
}
}
else {
warn "query failed: ", $res->errorstring, "\n";
}
Find the MX records for a domain.
use Net::DNS;
my $name = "example.com";
my $res = Net::DNS::Resolver->new;
my @mx = mx($res, $name);
if (@mx) {
foreach $rr (@mx) {
print $rr->preference, " ", $rr->exchange, "\n";
}
} else {
warn "Can't find MX records for $name: ", $res->errorstring, "\n";
}
Print a domain's SOA record in zone file format.
use Net::DNS;
my $res = Net::DNS::Resolver->new;
my $query = $res->query("example.com", "SOA");
if ($query) {
($query->answer)[0]->print;
} else {
print "query failed: ", $res->errorstring, "\n";
}
Perform a zone transfer and print all the records.
use Net::DNS;
my $res = Net::DNS::Resolver->new;
$res->nameservers("ns.example.com");
my @zone = $res->axfr("example.com");
foreach $rr (@zone) {
$rr->print;
}
Perform a background query and do some other work while waiting for the answer.
use Net::DNS;
my $res = Net::DNS::Resolver->new;
my $socket = $res->bgsend("host.example.com");
until ($res->bgisready($socket)) {
# do some work here while waiting for the answer
# ...and some more here
}
my $packet = $res->bgread($socket);
$packet->print;
Send a background query and use select to determine when the answer has arrived.
use Net::DNS;
use IO::Select;
my $timeout = 5;
my $res = Net::DNS::Resolver->new;
my $bgsock = $res->bgsend("host.example.com");
my $sel = IO::Select->new($bgsock);
# Add more sockets to $sel if desired.
my @ready = $sel->can_read($timeout);
if (@ready) {
foreach my $sock (@ready) {
if ($sock == $bgsock) {
my $packet = $res->bgread($bgsock);
$packet->print;
$bgsock = undef;
}
# Check for the other sockets.
$sel->remove($sock);
$sock = undef;
}
} else {
warn "timed out after $timeout seconds\n";
}
BUGS
Net::DNS
is slow.
For other items to be fixed, please see the TODO file included with the source distribution.
COPYRIGHT
Copyright (c) 1997-2002 Michael Fuhr.
Portions Copyright (c) 2002-2003 Chris Reinhardt.
All rights reserved. This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself.
AUTHOR INFORMATION
Net::DNS is currently maintained by a group, led by: Chris Reinhardt ctriv@net-dns.org
Net::DNS was created by: Michael Fuhr mike@fuhr.org
For more information see: http://www.net-dns.org/
SEE ALSO
perl(1), Net::DNS::Resolver, Net::DNS::Packet, Net::DNS::Update, Net::DNS::Header, Net::DNS::Question, Net::DNS::RR, RFC 1035, DNS and BIND by Paul Albitz & Cricket Liu