lib::Net::DNS(3User Contributed Perl Documentatiolib::Net::DNS(3)NAMENet::DNS - Perl interface to the DNS resolver
SYNOPSIS
use Net::DNS;
DESCRIPTIONNet::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:
o The header section, a Net::DNS::Header object.
o The question section, a list of Net::DNS::Question
objects.
o The answer section, a list of Net::DNS::RR objects.
o The authority section, a list of Net::DNS::RR objects.
o The additional section, a list of Net::DNS::RR objects.
The Net::DNS::Update package is a front-end to
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.
24/Aug/1997 perl 5.005, patch 03 1
lib::Net::DNS(3User Contributed Perl Documentatiolib::Net::DNS(3)
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;
@mx = mx("foo.com");
# Use your own resolver object.
use Net::DNS;
$res = new Net::DNS::Resolver;
@mx = mx($res, "foo.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 the EXAMPLES entry elsewhere in this documentfor 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)
$packet->push("pre", yxrrset("foo.bar.com A"));
Meaning: At least one RR with the specified name and type
24/Aug/1997 perl 5.005, patch 03 2
lib::Net::DNS(3User Contributed Perl Documentatiolib::Net::DNS(3)
must exist.
# RRset exists (value-dependent)
$packet->push("pre", yxrrset("foo.bar.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("foo.bar.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("foo.bar.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("foo.bar.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("foo.bar.com A 10.1.2.3"));
24/Aug/1997 perl 5.005, patch 03 3
lib::Net::DNS(3User Contributed Perl Documentatiolib::Net::DNS(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("foo.bar.com A"));
Meaning: Delete all RRs having the specified name and
type.
# Delete all RRsets.
$packet->push("update", rr_del("foo.bar.com"));
Meaning: Delete all RRs having the specified name.
# Delete an RR.
$packet->push("update", rr_del("foo.bar.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.
24/Aug/1997 perl 5.005, patch 03 4
lib::Net::DNS(3User Contributed Perl Documentatiolib::Net::DNS(3)
use Net::DNS;
$res = new Net::DNS::Resolver;
$query = $res->search("foo.bar.com");
if ($query) {
foreach $rr ($query->answer) {
next unless $rr->type eq "A";
print $rr->address, "\n";
}
}
else {
print "query failed: ", $res->errorstring, "\n";
}
Find the nameservers for a domain.
use Net::DNS;
$res = new Net::DNS::Resolver;
$query = $res->query("foo.com", "NS");
if ($query) {
foreach $rr ($query->answer) {
next unless $rr->type eq "NS";
print $rr->nsdname, "\n";
}
}
else {
print "query failed: ", $res->errorstring, "\n";
}
Find the MX records for a domain.
use Net::DNS;
$name = "foo.com";
$res = new Net::DNS::Resolver;
@mx = mx($res, $name);
if (@mx) {
foreach $rr (@mx) {
print $rr->preference, " ", $rr->exchange, "\n";
}
}
else {
print "can't find MX records for $name: ", $res->errorstring, "\n";
}
Print a domain's SOA record in zone file format.
24/Aug/1997 perl 5.005, patch 03 5
lib::Net::DNS(3User Contributed Perl Documentatiolib::Net::DNS(3)
use Net::DNS;
$res = new Net::DNS::Resolver;
$query = $res->query("foo.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;
$res = new Net::DNS::Resolver;
$res->nameservers("ns.foo.com");
@zone = $res->axfr("foo.com");
foreach $rr (@zone) {
$rr->print;
}
Perform a background query and do some other work while
waiting for the answer.
use Net::DNS;
$res = new Net::DNS::Resolver;
$socket = $res->bgsend("foo.bar.com");
until ($res->bgisready($socket)) {
# do some work here while waiting for the answer
# ...and some more here
}
$packet = $res->bgread($socket);
$packet->print;
Send a background query and use select to determine when
the answer has arrived.
24/Aug/1997 perl 5.005, patch 03 6
lib::Net::DNS(3User Contributed Perl Documentatiolib::Net::DNS(3)
use Net::DNS;
$res = new Net::DNS::Resolver;
$socket = $res->bgsend("foo.bar.com");
$rin = "";
vec($rin, $socket->fileno, 1) = 1;
# Add more descriptors to $rin if desired.
$timeout = 5;
$nfound = select($rout=$rin, undef, undef, $timeout);
if ($nfound < 1) {
print "timed out after $timeout seconds\n";
}
elsif (vec($rout, $socket->fileno, 1) == 1) {
$packet = $res->bgread($socket);
$packet->print;
}
else {
# Check for the other descriptors.
}
BUGSNet::DNS is slow. Real slow.
For other items to be fixed, please see the TODO file
included with the source distribution.
COPYRIGHT
Copyright (c) 1997 Michael Fuhr. All rights reserved.
This program is free software; you can redistribute it
and/or modify it under the same terms as Perl itself.
AUTHOR INFORMATION
Michael Fuhr <mfuhr@dimensional.com>
http://www.dimensional.com/~mfuhr/perldns/
SEE ALSO the perl(1) manpage, the Net::DNS::Resolver manpage,
the Net::DNS::Packet manpage, the Net::DNS::Update
manpage, the Net::DNS::Header manpage, the
Net::DNS::Question manpage, the Net::DNS::RR manpage, RFC
1035, DNS and BIND by Paul Albitz & Cricket Liu
24/Aug/1997 perl 5.005, patch 03 7