| Net-DNS-Method documentation | Contained in the Net-DNS-Method distribution. |
Net::DNS::Method::Regexp - Build answers based on regular expressions
use Net::DNS::Method::Regexp;
my $ans = new Net::DNS::Method::Regexp {
/^www.test.com\.? IN A$/ => {
answer => [ Net::DNS::RR->new("www.test.com. 10 IN A 192.168.0.1"),
Net::DNS::RR->new("www.test.com. 10 IN A 192.168.0.2") ],
authority => [],
additional => [],
question => [],
code => 'NOERROR',
ra => 1,
rd => 1,
aa => 1,
tc => 1,
return => NS_OK | NS_STOP
}
}
This module provides a simple but powerful DNS answer generator based in the idea of matching a DNS question with a regular expression and building the answer using the supplied rules.
Its ->new() method receives as its only parameter, a reference
to a hash whose keys are regular expressions that must match the
question section of a DNS packet. The value associated with these keys
is a hash with the following possible pair - value entries:
The value stored on these keys is a reference to a list of
Net::DNS::RR objects that will be safe_push()ed into the
corresponding sections of the answer. This requires a fairly recent
version of Net::DNS.
Specify a value for the corresponding call in the answer packet,
setting the corresponding bit to the specified value. For instance, an
authoritative answer should specify aa = 1>.
Sets the answer's return code to the specified value. If left unspecified, the fault value of 'NOERROR' will be used.
Specifies the return value at the Net::DNS::Method level. This can be used to allow further classes to attempt a match on the packet, abort the search, skip the answer altogether, etc.
If this is omitted, the default value of NS_OK | NS_STOP will be
returning, causing the answer to be returned immediately.
Note that the regular expression match will always be attempted with extended syntax (ie, spaces are meaningless) and case sensitivity turned off. Also, matches are attempted from the longest regular expression to the shortest, allowing for a trivial "priority" mechanism to be used. You can simply add whitespace to your regular expression to have it execute before a shorter regular expression.
Original version; created by h2xs 1.20 with options
-ACOXfn Net::DNS::Method::Regexp -v 1.00
Repackaged for public distribution.
Luis E. Munoz <luismunoz@cpan.org>
perl(1), Net::DNS::Method(3), Net::DNS(3), Net::DNS::RR(3).
| Net-DNS-Method documentation | Contained in the Net-DNS-Method distribution. |
package Net::DNS::Method::Regexp; require 5.005_62; use Carp; use strict; use warnings; use Net::DNS::Method; use vars qw($VERSION @ISA $AUTOLOAD); $VERSION = '2.00'; our $DEBUG = 0; our @ISA = qw(Net::DNS::Method); sub new { my $type = shift; my $class = ref($type) || $type || "Net::DNS::Method::Regexp"; my $ref = shift; croak "Missing initialization parameters\n" unless ref($ref) eq 'HASH'; return bless { ref => $ref }, $class; } sub ANY { my $self = shift; my $q = shift; my $ans = shift; warn "inside ANY" if $DEBUG; return NS_FAIL unless $self and $q and $ans; my $qs = $q->qname . ' ' . $q->qclass . ' ' . $q->qtype; for my $re (sort { length $b <=> length $a } keys %{$self->{ref}}) { if ($qs =~ /$re/ix) { warn "match on $re for question $qs" if $DEBUG; my $s = $self->{ref}->{$re}; # First, push RRs in the corresponding zones for my $z (qw(answer authority additional question)) { next unless exists $s->{$z} and defined $s->{$z}; croak "$re->$z must be undef or an array reference" unless ref($s->{$z}) eq 'ARRAY'; for my $rr (@{$s->{$z}}) { $ans->safe_push($z, $rr); } } # Next, set the answer bits to the requested # values $ans->header->ra($s->{ra}) if exists $s->{ra} and defined $s->{ra}; $ans->header->rd($s->{rd}) if exists $s->{rd} and defined $s->{rd}; $ans->header->aa($s->{aa}) if exists $s->{aa} and defined $s->{aa}; $ans->header->tc($s->{tc}) if exists $s->{tc} and defined $s->{tc}; # Next, set the answer's result code if (exists $s->{code} and defined $s->{code}) { $ans->header->rcode($s->{code}); } else { $ans->header->rcode('NOERROR'); } # Finally, return the requested value or our # default if (exists $s->{return} and defined $s->{return}) { return $s->{return}; } else { return NS_OK | NS_STOP; } } } return NS_FAIL; } sub AUTOLOAD { return undef if $AUTOLOAD eq 'Net::DNS::Method::Regexp::DESTROY'; warn "call to $AUTOLOAD" if $DEBUG; goto &ANY; } 1; __END__