Skip to content

Instantly share code, notes, and snippets.

@dynax60
Created August 6, 2010 12:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dynax60/511253 to your computer and use it in GitHub Desktop.
Save dynax60/511253 to your computer and use it in GitHub Desktop.
any '/fast-ping' => sub {
my $self = shift;
my $request = $self->req->json || return $self->render_json( { 'status' => 'Request error' } );
my $remote_addr = $self->tx->remote_address;
app->log->info("$remote_addr requested ".Dumper($request));
my $prefix = $request->{'prefix'};
return $self->render_json( { 'status' => 'Have no network prefix in request, nothing to do!' } ) unless $prefix;
my $t = new Net::Netmask($prefix);
my $payload = { map { $_ => '' } $t->enumerate() };
delete $payload->{$_} foreach ($t->first, $t->nth(1), $t->last);
POE::Component::Client::Ping->spawn(
Alias => 'pinger',
Timeout => 5,
);
POE::Session->create(
inline_states => {
_start => sub {
my ($kernel, $session) = @_[KERNEL, SESSION];
for my $ip (keys %{$payload}) {
$kernel->post(pinger => ping => pong => $ip)
}
},
pong => sub {
my ($kernel, $session) = @_[KERNEL, SESSION];
my $response_packet = $_[ARG1];
my ($response_address, $roundtrip_time, $reply_time) = @{$response_packet};
if (defined $response_address) {
$payload->{ $response_address } = sprintf("%6.3fs", $roundtrip_time);
}
},
}
);
$poe_kernel->run();
$self->render_json( {'status' => 'OK', 'result' => $payload } );
} => 'fast-ping';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment