AnyEvent-MP
view release on metacpan or search on metacpan
use common::sense;
# should come before anything else, so all modules
# will be loaded on each restart
BEGIN {
if (@ARGV == 1 && $ARGV[0] =~ /^\[/) {
require JSON::XS;
@ARGV = @{ JSON::XS->new->utf8->decode (shift) };
} else {
for (@ARGV) {
if (/^[\[\{\"]/) {
require JSON::XS;
$_ = JSON::XS->new->utf8->allow_nonref->decode ($_);
}
}
}
if ($ARGV[0] eq "run") {
shift;
# d'oh
require AnyEvent::Watchdog;
# only now can we load additional modules
require AnyEvent;
require AnyEvent::Watchdog::Util;
AnyEvent::Watchdog::Util::autorestart (1);
AnyEvent::Watchdog::Util::heartbeat (300);
require AnyEvent::MP::Kernel;
AnyEvent::MP::Kernel::configure (@ARGV);
AnyEvent::detect () eq "AnyEvent::Impl::EV"
? EV::loop ()
: AE::cv ()->recv;
}
}
use Carp ();
use JSON::XS;
use AnyEvent;
use AnyEvent::Util;
use AnyEvent::MP;
use AnyEvent::MP::Config;
sub my_run_cmd {
my ($cmd) = @_;
my $cv = &run_cmd;
my $status = $cv->recv;
$status
and die "@$cmd: command failed with exit status $status.";
}
sub gen_cert {
my_run_cmd [qw(openssl req
-new -nodes -x509 -days 3650
-newkey rsa:2048 -keyout /dev/fd/3
-batch -subj /CN=AnyEvent::MP
)],
"<", "/dev/null",
">" , \my $cert,
"3>", \my $key,
"2>", "/dev/null";
"$cert$key"
}
sub init {
configure profile => "aemp", nodeid => "aemp/%n/%u";
}
our $cfg = AnyEvent::MP::Config::config;
our $profile = $cfg;
sub trace {
my ($seed) = @_;
my $cv = AE::cv;
my %seen;
my $exit;
my %to;
init;
my $reply = port {
my ($node, undef, @neigh) = @_;
delete $to{$node};
@neigh = grep $_ ne $NODE, @neigh;
print $node, " -> ", (join " ", @neigh), "\n";
for my $neigh (@neigh) {
unless ($seen{$neigh}++) {
$cv->begin;
$to{$neigh} = AE::timer 15, 0, sub {
print "$neigh (timeout)\n";
$exit = 1;
$cv->end;
};
AnyEvent::MP::Kernel::eval_on $neigh, "AnyEvent::MP::Kernel::up_nodes" => $SELF => $neigh;
}
}
$cv->end;
};
$cv->begin;
snd $reply, seed => undef, $seed;
$cv->recv;
exit $exit;
}
( run in 0.467 second using v1.01-cache-2.11-cpan-acf6aa7dc9e )