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: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to