Skip to content

Instantly share code, notes, and snippets.

@viliampucik
Created June 5, 2011 19:55
Show Gist options
  • Save viliampucik/1009340 to your computer and use it in GitHub Desktop.
Save viliampucik/1009340 to your computer and use it in GitHub Desktop.
Example of using POE::Component::Client::DNS
#!/usr/bin/env perl
use strict;
use warnings;
use POE;
use POE::Component::Client::DNS;
my @ips = qw( 127.0.0.1 10.0.0.1 192.168.0.1 192.168.1.1 1.2.3.4
8.8.4.4 8.8.8.8 208.67.220.220 208.67.222.222 );
my $resolver = POE::Component::Client::DNS->spawn(
Alias => 'resolver',
Timeout => 10,
);
POE::Session->create(
inline_states => {
_start => sub { $_[KERNEL]->yield('lookup') for 1..5; },
lookup => sub {
my $ip = shift @ips;
return unless defined $ip;
# Example of using POE::Component::Client::DNS Version 2 API
$_[KERNEL]->post( 'resolver',
'resolve',
'response',
$ip, 'PTR', 'IN' );
},
response => sub {
my $request_address = $_[ARG0]->[0];
my ( $net_dns_packet, $net_dns_errorstring ) = @{ $_[ARG1] };
unless ( defined $net_dns_packet ) {
print "$request_address: error ($net_dns_errorstring)\n";
$_[KERNEL]->yield('lookup');
return;
}
my @net_dns_answers = $net_dns_packet->answer();
unless ( scalar @net_dns_answers ) {
print "$request_address: no answer\n";
$_[KERNEL]->yield('lookup');
return;
}
foreach ( @net_dns_answers ) {
if ( $_->type eq 'PTR' ) {
( my $fqdn = $_->rdatastr ) =~ s/\.$//;
print "$request_address: $fqdn\n";
last;
}
}
$_[KERNEL]->yield('lookup');
},
}
);
$poe_kernel->run();
exit 0;
#!/usr/bin/env perl
use strict;
use warnings;
use POE;
use POE::Component::Client::DNS;
my @ips = qw( 127.0.0.1 10.0.0.1 192.168.0.1 192.168.1.1 1.2.3.4
8.8.4.4 8.8.8.8 208.67.220.220 208.67.222.222 );
my $resolver = POE::Component::Client::DNS->spawn(
Alias => 'resolver',
Timeout => 10,
);
POE::Session->create(
inline_states => {
_start => sub { $_[KERNEL]->yield('lookup') for 1..5; },
lookup => sub {
my $ip = shift @ips;
return unless defined $ip;
# Example of using POE::Component::Client::DNS Version 3 API
my $response = $resolver->resolve(
event => 'response',
host => $ip,
type => 'PTR',
context => { },
);
$_[KERNEL]->yield(response => $response) if $response;
},
response => sub {
my $request_address = $_[ARG0]->{'host'};
my $net_dns_packet = $_[ARG0]->{'response'};
my $net_dns_errorstring = $_[ARG0]->{'error'};
unless ( defined $net_dns_packet ) {
print "$request_address: error ($net_dns_errorstring)\n";
$_[KERNEL]->yield('lookup');
return;
}
my @net_dns_answers = $net_dns_packet->answer();
unless ( scalar @net_dns_answers ) {
print "$request_address: no answer\n";
$_[KERNEL]->yield('lookup');
return;
}
foreach ( @net_dns_answers ) {
if ( $_->type eq "PTR" ) {
( my $fqdn = $_->rdatastr ) =~ s/\.$//;
print "$request_address: $fqdn\n";
last;
}
}
$_[KERNEL]->yield('lookup');
},
}
);
$poe_kernel->run();
exit 0;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment