The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Ping::Action::AddPing;
use strict;
use Jifty::Param::Schema;
use Jifty::Action schema {

param host =>
    label is 'Hostname',
    is mandatory;

param only_failure =>
    type is 'checkbox',
    label is 'Failure only?',
    hints is 'Show only failed pings to me.',
    default is 0;

};

sub take_action {
    my $self = shift;
    my $host = $self->argument_value('host');
    my $only_failure = $self->argument_value('only_failure');

    Jifty->bus->modify(hosts => sub {
        $_->{$host} ||= do {
            if (my $pid = fork) {
                $pid;
            }
            else {
                exec($^X => "-Ilib", "-MPing::PingServer", "-e", "Ping::PingServer->ping('$host')");
            }
        }
    });

    my $id = Jifty->web->session->id;

    Jifty->bus->modify("$id-ping" => sub {
        my $sid = $_->{$host}; 
        Jifty->subs->cancel($sid) if $sid;
        $_->{$host} = Jifty->subs->add(
            class       => 'Pong',
            queries     => [{ host => $host }, $only_failure ? { fail => 1 } : ()],
            mode        => 'Bottom',
            region      => 'pong',
            render_with => '/fragments/pong',
        );
    });

    $self->result->message( "Added host: $host" );
}

1;