1 package Tak::ConnectorService;
7 use Tak::ConnectionService;
12 with 'Tak::Role::Service';
14 has connections => (is => 'ro', default => sub { Tak::Router->new });
16 has ssh => (is => 'ro', default => sub { {} });
19 my ($self, $on, %args) = @_;
20 die [ mistake => "No target supplied to create" ] unless $on;
21 my $log_level = $args{log_level}||'info';
22 my ($kid_in, $kid_out, $kid_pid) = $self->_open($on, $log_level);
23 $kid_in->print($Tak::STDIONode::DATA, "__END__\n") unless $on eq '-';
24 # Need to get a handshake to indicate STDIOSetup has finished
25 # messing around with file descriptors, otherwise we can severely
26 # confuse things by sending before the dup.
28 die [ failure => "Garbled response from child: $up" ]
29 unless $up eq "Ssyshere\n";
30 my $connection = Tak::ConnectionService->new(
31 read_fh => $kid_out, write_fh => $kid_in,
32 listening_service => Tak::Router->new
34 my $client = Tak::Client->new(service => $connection);
35 # actually, we should register with a monotonic id and
36 # stash the pid elsewhere. but meh for now.
37 my $pid = $client->do(meta => 'pid');
38 my $name = $on.':'.$pid;
39 my $conn_router = Tak::Router->new;
40 $conn_router->register(local => $connection->receiver->service);
41 $conn_router->register(remote => $connection);
42 $self->connections->register($name, $conn_router);
47 my ($self, $on, @args) = @_;
49 my $kid_pid = IPC::Open2::open2(my $kid_out, my $kid_in, 'tak-stdio-node', '-', @args)
50 or die "Couldn't open2 child: $!";
51 return ($kid_in, $kid_out, $kid_pid);
53 my $ssh = $self->ssh->{$on} ||= Net::OpenSSH->new($on);
55 die "Couldn't establish ssh connection: ".$ssh->error;
56 return $ssh->open2('perl','-', $on, @args);
59 sub start_connection_request {
60 my ($self, $req, @payload) = @_;;
61 $self->connections->start_request($req, @payload);
64 sub receive_connection {
65 my ($self, @payload) = @_;
66 $self->connections->receive(@payload);