Amethyst
view release on metacpan or search on metacpan
Amethyst/Brain/Infobot/Module/Nslookup.pm view on Meta::CPAN
package Amethyst::Brain::Infobot::Module::Nslookup;
use strict;
use vars qw(@ISA);
use POE;
use POE::Component::Client::DNS;
use Amethyst::Message;
use Amethyst::Brain::Infobot;
use Amethyst::Brain::Infobot::Module;
@ISA = qw(Amethyst::Brain::Infobot::Module);
sub new {
my $class = shift;
my $self = $class->SUPER::new(
Name => 'Nslookup',
Regex => qr/^(?:resolve|nslookup)\s+(.*)$/i,
Usage => 'resolve|nslookup .*',
Description => "Resolve names/IPs",
@_
);
return bless $self, $class;
}
sub init {
my $self = shift;
spawn POE::Component::Client::DNS;
}
sub action {
my ($self, $message, $addr) = @_;
my %states = map { $_ => "handler_$_" } qw(
_start _stop answer
);
POE::Session->create(
package_states => [ ref($self) => \%states ],
args => [ $self, $message, $addr ],
);
return 1;
}
sub handler_answer {
my ($kernel, $heap, $session, $request, $response) =
@_[KERNEL, HEAP, SESSION, ARG0, ARG1];
my $addr = $request->[0];
my $packet = $response->[0];
my $module = $heap->{Module};
my $message = $heap->{Message};
unless (defined $packet) {
my $error = $response->[1];
my $reply = $module->reply_to($message, "$addr: Error: $error");
$reply->send;
return;
}
my @answers = $packet->answer;
unless (@answers) {
if ($request->[1] eq 'A') {
my $reply = $module->reply_to($message, "$addr: " .
"No records in packet");
$reply->send;
}
return;
}
foreach my $answer (@answers) {
my $reply = $module->reply_to($message, "$addr: " .
$answer->type . " " . $answer->rdatastr);
$reply->send;
}
}
sub handler__stop {
my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
( run in 0.883 second using v1.01-cache-2.11-cpan-39bf76dae61 )