Hi,

I need to check through a database of just over 19000 domains to check from an 
authoritative server of the root domain which nameservers are used by these 
domains.

so for host.com I want to get the nameserver of host.com from an SOA of com for 
example,  l.gtld-servers.net 

I've Googled about and put together this routine partially from the Net::DNS 
site and from the O'Reilly bind book.

This works great..  but it takes 68 minutes.. Am I doing something crazy here 
or is this normal. I'm not 100% sure if I'm doing it right and I'd appreciate 
you having a look. Note that this is something I put together to get it working 
and I will clean it up and have better error checking etc. I'm more interested 
in knowing if I'm doing the Net::DNS thing corretly. Thanks in advance.

This is the routine, see how I'm calling it below.

sub searchit {
        # Fix and handle errors so that it does not fall over.
        my ($domain, $nameserv) = @_;

        my $res = new Net::DNS::Resolver;
        $res->defnames(0);
        $res->retry(1);
        $res->tcp_timeout(15);
        $res->udp_timeout(15);
        $res->persistent_tcp(1);
        $res->persistent_udp(1);

        my $ns_req = $res->query($domain, "NS");

        unless (defined($ns_req) and ($ns_req->header->ancount > 0)) {
              return $res->errorstring;
        }

        my @nameservers = grep { $_->type eq "NS" } $ns_req->answer;

        $| = 1;
        $res->recurse(0);
        if (defined $nameserv) {
                $res->nameservers($nameserv);
        }

        my $new_nameserv;
        foreach my $nsrr (@nameservers) {
          my $ns = $nsrr->nsdname;

          unless ($res->nameservers($ns)) {
              return $res->errorstring;
          }
          $new_nameserv = $ns;
          last;

        }
        return $new_nameserv;
}

I have a loaded array of the domain names and I run the above like this:


for $domain (@domain_array) {
        $root_dom = $domain; 
        $root_dom =~ s/^.*\.//;
        # I get the root domain and only look it up the once..
        if (defined $dom_auth{$root_dom}) {
                $answer = searchit($domain,$dom_auth{$root_dom});
        } else  {
                # User my resolv.conf's nameserver for the top domain NS
                $answer = searchit($root_dom,"");
                $dom_auth{$root_dom} = $answer;
                $answer = searchit($domain,$dom_auth{$root_dom});
        }
        printf ("%-35s %-5s %-25s %-25s\n",  
$domain,$root_dom,$dom_auth{$root_dom},$answer);
}
-- 
      _        Jerry Rocteur    [EMAIL PROTECTED]                               
                                                    
    _|_|_                   http://www.rocteur.cc                               
                                                    
    (0 0)                   MSN [EMAIL PROTECTED]                               
                                                    
ooO--(_)--Ooo      Jabber [EMAIL PROTECTED]                                     
                                              
_________________________________________________ 
[06:23:57 rocteur.cc /Users/jerry]

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to