GNU/Linux |
CentOS 4.8 |
i386 |
Net::DNS(3pm) |
Net::DNS − Perl interface to the DNS resolver
"use Net::DNS;"
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.
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.
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"; }
"Net::DNS" is slow.
For other items to be fixed, please see the TODO file included with the source distribution.
Copyright (c) 1997−2002 Michael Fuhr.
Portions Copyright (c) 2002−2004 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.
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/
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
Net::DNS(3pm) |