2013-08-06 4 views
1

J'essaye d'écrire un script Perl qui vérifie si le nom du périphérique existe dans le DNS et s'il ne le fait pas, il imprime le nom du périphérique. À l'heure actuelle, voici comment je fais ça:Nom du périphérique DNS Test

my $host_result = `host $device`; 
my @host_result = split(/ /, $host_result); 
my $dns = $host_result[0]; 

# host normally puts out something like this if there is an error: 
# Host blah not found: 3(NXDOMAIN) 
# So I check to see if the first word is 'Host' 
if ($dns eq "Host") { 
    print $device; 
} 

Comme vous pouvez le voir, j'utiliser la commande host du système pour le faire. Plus précisément, je vérifie pour voir si host peut trouver le nom de l'appareil ou non. Je sais que ce n'est pas le but de host et je ne veux pas utiliser les appels système sauf si je dois vraiment, alors j'espérais que quelqu'un pourrait me diriger vers un module Perl qui me permet de vérifier ces périphériques noms contre DNS. Je devine Net::DNS, mais ce qui est spécifiquement à l'intérieur Net :: DNS devrais-je utiliser pour accomplir ceci?

J'ai fait des recherches, mais j'ai du mal à trouver quelque chose parce que je ne sais pas quoi chercher (est-ce une requête DNS ou une résolution DNS?), Parce que je ne connais que le DNS et la terminologie qui s'y rapporte.

En outre, je passe beaucoup de noms de périphériques, donc tous les conseils sur la façon d'accélérer le contrôle sont les bienvenus!

Répondre

2

Je ne suis pas très bien informé sur DNS non plus, mais je pense que ce serait un équivalent approximatif à l'approche host utilisant Net::DNS::Resolver:

#!/usr/bin/perl 

use strict; 
use warnings; 
use feature 'say'; 

use Net::DNS::Resolver; 

my $device = shift; 
my $res = Net::DNS::Resolver->new; 
say $device unless $res->search($device); # Returns undef if not found 

En termes de vitesse, je l'ai fait une référence simple et Net::DNS::Resolver est bien plus vite que system("host $device") si vous réutilisez le même objet résolveur pour chaque requête. Voici les résultats de mon timing lorsque l'hôte n'est pas dans le DNS:

  Rate system Net::DNS 
system 233/s  --  -60% 
Net::DNS 578/s  148%  -- 

Il y a une différence encore plus grande lorsque l'hôte est dans le DNS:

  Rate system Net::DNS 
system 232/s  --  -69% 
Net::DNS 758/s  227%  -- 

Voici le code que j'utilisé pour la référence :

#!/usr/bin/perl 

use strict; 
use warnings; 
use feature 'say'; 

use Benchmark qw(cmpthese); 
use Net::DNS::Resolver; 

our $device = shift; 
our $res = Net::DNS::Resolver->new; 

cmpthese(1000, { 
    system  => sub { system("host $device > /dev/null 2>&1"); }, 
    'Net::DNS' => sub { $res->search($device); } 
}); 

Je vois aussi que Net::DNS::Resolver a une fonction à run a query in the background et revient immédiatement. Si la vitesse est vraiment un problème, vous pouvez essayer d'envoyer vos requêtes comme ceci et forger un nouveau processus pour vérifier les résultats dès qu'ils sont prêts. Alternativement, vous pourriez juste fourchette un processus pour chaque appel à la fonction search() de premier plan normal. Bien sûr, en fonction du nombre d'hôtes que vous vérifiez, sachez que vous pourriez rencontrer des limites de mémoire ou de processus avec cette approche.

+0

Parfait! Je l'avais déjà utilisé et ça ne fonctionnait pas. Cependant, votre utilisation de 'say' m'a fait réaliser que je devrais probablement' chomp' mes cordes avant de les vérifier et maintenant ça marche! –

+0

Si vous l'avez toujours, pourriez-vous poster votre code de benchmarking? –

+0

@AustinMoore Voir ma dernière modification. – ThisSuitIsBlackNot

Questions connexes