X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=scpubgit%2FObject-Remote.git;a=blobdiff_plain;f=lib%2FObject%2FRemote%2FConnector%2FSSH.pm;h=7d6142c54bbb54b8a874b9ae72c7929b39ee5e79;hp=c9193d0d3512669b35c7b1bc4861b3ba7d28128f;hb=8ba4f2e3adb9a1fda64b463b34a4306c9034359a;hpb=47c83a1379a33fc8baa4a128edc1d75d780776b0 diff --git a/lib/Object/Remote/Connector/SSH.pm b/lib/Object/Remote/Connector/SSH.pm index c9193d0..7d6142c 100644 --- a/lib/Object/Remote/Connector/SSH.pm +++ b/lib/Object/Remote/Connector/SSH.pm @@ -1,23 +1,45 @@ package Object::Remote::Connector::SSH; use Object::Remote::FatNode; -use Net::OpenSSH; +use Object::Remote::ModuleSender; +use Object::Remote::Handle; +use IPC::Open2; use Moo; with 'Object::Remote::Role::Connector'; -has ssh_masters => (is => 'ro', default => sub { {} }); - sub _open2_for { my $self = shift; - my @res = $self->_ssh_object_for(@_)->open2('perl','-',@_); - print { $res[0] } $Object::Remote::FatNode::DATA, "__END__\n"; - return @res; + my $pid = open2(my $ssh_stdout, my $ssh_stdin, 'ssh', $_[0], 'perl', '-') + or die "Failed to start ssh connection: $!";; + print $ssh_stdin $Object::Remote::FatNode::DATA, "__END__\n"; + return ($ssh_stdin, $ssh_stdout, $pid); } +around connect => sub { + my ($orig, $self) = (shift, shift); + my $conn = $self->$orig(@_); + Object::Remote::Handle->new( + connection => $conn, + class => 'Object::Remote::ModuleLoader', + args => { module_sender => Object::Remote::ModuleSender->new } + )->disarm_free; + return $conn; +}; + sub _ssh_object_for { my ($self, $on) = @_; $self->ssh_masters->{$on} ||= Net::OpenSSH->new($on); } +push @Object::Remote::Connection::Guess, sub { + for ($_[0]) { + # 0-9 a-z _ - first char, those or . subsequent - hostnamish + if (defined and !ref and /^(?:.*?\@)?[\w\-][\w\-\.]*/) { + return __PACKAGE__->new->connect($_[0]); + } + } + return; +}; + 1;