in reply to Re^2: loop ending b4 I want it to
in thread loop ending b4 I want it to

It is not clear what you are trying to achieve.

Your code shows attempts to explicitly specify domain name servers. Some issues that leave your approach and objectives hazy are:

If your "sub nsqry" works as you expect, the only change necessary is to "return $rr->ptrdname" after (or instead of) printing it.On failure, "return undef".

You can also use a modified example from the Net::DNS docs:

sub new-nsqry{ my ($res, $IP) = @_; # Note: $res is created OUTSIDE the sub ... my $query = $res->query($IP, "PTR"); if ($query) { foreach $rr (grep { $_->type eq 'PTR' } $query->answer) { print $rr->ptrdname, " : $IP\n"; return $rr->ptrdname; } return undef; } else { warn "query failed for $IP: ", $res->errorstring, "\n"; return undef; } }

     "As you get older three things happen. The first is your memory goes, and I can't remember the other two... " - Sir Norman Wisdom

Replies are listed 'Best First'.
Re^4: loop ending b4 I want it to
by mikejones (Scribe) on Nov 02, 2007 at 20:06 UTC
    I am trying to achieve lookups for each IP in each nameserver, telling me success or no success.

    We can disregard your first three bullet points, but the fourth yes I should only need to create one object. But since I have two nameservers, I need to lookup all these IPs twice, once in each nameserver. So do I still need one object? If so how do I dereference it? This code right below works, but no sure how to implement in the $res object code?

    #for my $ns (@namesvr) { # for my $keys (sort keys %$ns) { # print "$keys => $ns->{$keys}\n"; # } # print "\n"; #} #exit;

    #!/usr/bin/perl use strict; use warnings; use Carp; use Net::DNS; use Data::Dumper; ## AoH my @namesvr = ( { NAME => 'ns#.xxxx.com', IPLIST => [] } , +## Autovivification { NAME => 'wrnaxxxx.xx.xxxxx.com', IPLIST => [] } ) ; #print Dumper(\@namesvr);exit; my %IPinfo; ## HoH for my $IP (qw ( 10.220.84.30 10.220.84.51 10.220.84.52 10.220.84.54 10.220.84.55 10.220.84.56 10.220.84.57 10.220.84.58 )) { $IPinfo{$IP} = {DOMAININDEX => undef, TYPE => "CLIEN +T" } ; } our ( $res, $IP ) ; for my $ns (@namesvr) { for my $keys (sort keys %$ns) { $res = Net::DNS::Resolver->new ( nameservers => [$ns->{$keys}], recurse => 1, ## do recursive lookups retry => 1, debug => 0, ); } } for my $ip (keys %IPinfo) { for my $ids (0..$#namesvr) { my $ptr = nsqry($namesvr[$ids]->{NAME}, $ip) ; # nsqry has bee +n modified to return the info next unless $ptr ; # No change, if $ptr is empty $IPinfo{$ip}{DOMAININDEX} = $ids ; # Forward ref from IP to DO +MAIN $IPinfo{$ip}{PTR} = $ptr ; push @{$namesvr[$ids]->{IPLIST}}, $ip ; # Keep a list of IP's +that live in this domain } } sub nsqry { ( $res, $IP ) = @_ ; my $query = $res->query($IP, 'PTR') ; if ($query) { for my $rr ($query->answer) { next unless ($rr->type eq 'PTR') ; ## skip record if not e +q PTR ## print $rr->ptrdname ; return $rr->ptrdname ; } return undef ; } else { carp "query failed for $IP: ", $res->errorstring, "\n" ; return undef ; } }
      Looks like you are having trouble de-referencing the AOH @nameserver. Here is how I would do it:
      for my $nshash (@namesvr) { $nshash->{RESOLVER} = Net::DNS::Resolver->new ( nameservers => [$nshash->{NAME}], recurse => 1, ## do recursive lookups retry => 1, debug => 0, ); }
      This produces and saves a RESOLVER object entry for each name server. You can now pass this into nsquery thus:
      my $ptr = nsqry($namesvr[$ids]->{RESOLVER}, $ip) ;
      By the way, you should really have a my in front of ($res, $IP) inside the sub nsqry. Without that, you will be using globals, which may have un-intended side-effects, and is bad practice anyway.

           "As you get older three things happen. The first is your memory goes, and I can't remember the other two... " - Sir Norman Wisdom