Net::DNS - Perl interface to the DNS resolver |
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.
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.
Net::DNS::Resolver queries return Net::DNS::Packet objects. Packet objects have five sections:
The Net::DNS::Update package is a subclass of Net::DNS::Packet for creating packet objects to be used in dynamic updates.
Net::DNS::Header objects represent the header section of a DNS packet.
Net::DNS::Question objects represent the question section of a DNS packet.
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.
print Net::DNS->version, "\n";
Returns the version of Net::DNS.
# 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.
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.
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.
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.
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.
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.
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.
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"; }
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"; }
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"; }
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"; }
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; }
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;
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.
Portions Copyright (c) 2005 Olaf Kolkman (RIPE NCC)
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: Olaf Kolkman olaf@net-dns.org
Between 2002 and 2004 Net::DNS was maintained by: Chris Reinhardt
Net::DNS was created by: | |
Michael Fuhr | |
mike@fuhr.org |
For more information see: http://www.net-dns.org/
L<perl(1)>, L<Net::DNS::Resolver>, L<Net::DNS::Packet>, L<Net::DNS::Update>, L<Net::DNS::Header>, L<Net::DNS::Question>, L<Net::DNS::RR>, RFC 1035, I<DNS and BIND> by Paul Albitz & Cricket Liu
Net::DNS - Perl interface to the DNS resolver |