Hi,
Today I wrote a script for validate a dns record from the specified DNS
server, the subroutine is:
sub validate_dns {
my $host = shift; # a host, for example, www.google.com
my $value = shift; # the host's DNS value, may be a CNAME or an iP
address
my $dns = shift; # DNS server, for example, 8.8.8.8
my $method = $value =~ /^\d+\.\d+\.\d+\.\d+$/ ? "address" : "cname";
my $res = Net::DNS::Resolver->new(nameservers => [$dns]);
my $answer = $res->query($host);
if (defined $answer) {
return 1 if ($answer->answer)[0]->$method eq $value;
}
return 0;
}
Sometime the $host's value is an A record, thus it has a address() method.
Sometime the $host's value is a CNAME record, it has a cname() method.
When calling the subroutine abve with the wrong arguments, it will cause
warnings.
For example,
validate_dns("www.nsbeta.info","1.2.3.4","8.8.8.8");
This will throw up warnings, because www.nsbeta.info is a CNAME but the
subroutine calls address() method which belongs to the A record.
So I modified the subroutine as:
sub validate_dns {
my $host = shift;
my $value = shift;
my $dns = shift;
my $res = Net::DNS::Resolver->new(nameservers => [$dns]);
my $answer = $res->query($host);
if (defined $answer) {
my $obj = ($answer->answer)[0];
if ($ojb->can("address") ) {
return 1 if $obj->address eq $value;
} elsif ($ojb->can("cname") ) {
return 1 if $obj->cname eq $value;
}
}
return 0;
}
This totally can't work, it seems $obj->can() method has no effect.
What's wrong with my code? thanks.
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/