More preview releases from the Net::SSH family
I’ve got lots of code to share with you all today:
Net::SSH 2.0 Preview Release #3
Not very many external changes, but channels now have an on_open_failure
callback that you can employ to be told when a channel could not be opened.
1 2 3 4 5 6 7 |
channel = ssh.open_channel do |ch| # ... end channel.on_open_failure do |ch, code, reason| puts "could not open channel because #{reason.inspect} #{code}" end |
This change was necessary to make port forwarding a bit more reliable for Net::SSH::Gateway (see below).
Also, individual Net::SSH sessions may contain their own custom properties, much as Net::SSH channel objects do, which can be quite handy when you need to keep some state associated with the session.
ssh[:key] = "value"
This change (and several other internal refactorings) was necessary for the correct working of the Net::SSH::Multi library (see below).
To get the preview release #3 (version 1.99.2):
gem install --source http://gems.jamisbuck.org net-ssh
You can follow development via GitHub:
http://github.com/jamis/net-ssh/tree/master
Net::SFTP 2.0 Preview Release #2
All that was added in this preview release was custom properties on Upload instances:
1 2 3 |
uploader = sftp.upload("local.file", "remote.file") uploader[:failed] = false # ... |
This was necessary to get Capistrano file transfers to work with Net::SFTP 2.0.
To get the preview release #2 (version 1.99.1):
gem install --source http://gems.jamisbuck.org net-sftp
You can follow development via GitHub:
http://github.com/jamis/net-sftp/tree/master
Net::SSH::Gateway 1.0 Preview Release #1
Net::SSH::Gateway is (in essence) the extraction of the gateway code from Capistrano into its own library. It lets you tunnel SSH connections through some “gateway” server to servers that would be otherwise inaccessible.
1 2 3 4 5 6 |
require 'net/ssh/gateway' gateway = Net::SSH::Gateway.new('gateway.host', 'username') gateway.ssh('remote.host', 'user') do |ssh| # ... end |
You can also use it as a general facilitator for forwarding connections over a local port, when you don’t care what port is to be used—you just want to connect to a remote server.
1 2 3 |
gateway.open('remote.host', 80) do |port| Net::HTTP.get_print '127.0.0.1', '/path', port end |
The current thinking is that the next release of Capistrano will ditch its own gateway implementation in favor of Net::SSH::Gateway. To get this first preview release (version 0.99.0):
gem install --source http://gems.jamisbuck.org net-ssh-gateway
You can follow development via GitHub:
http://github.com/jamis/net-ssh-gateway/tree/master
Net::SSH::Multi 1.0 Preview Release #1
Net::SSH::Multi is the guts of Capistrano, extracted into a library of their own. It allows you to define and categorize servers, and then execute commands in parallel on them, or on subsets of them, using an interface similar, if not identical, to that of Net::SSH::Connection::Session and Channel.
Eventually, Capistrano will be refactored to take advantage of Net::SSH::Multi, but doing so will require some significant changes to Capistrano’s innards, and would almost certainly break many third-party libraries. Thus, you won’t see Capistrano on Net::SSH::Multi until Capistrano 3.0 or so (which will not be the next release of Capistrano). However, you can use Net::SSH::Multi to implement most of Capistrano’s functionality in whatever form you like. Want Capistrano-in-a-rakefile? Have at it!
1 2 3 4 5 6 7 8 9 |
require 'net/ssh/multi' Net::SSH::Multi.start do |session| session.use '[email protected]' session.use '[email protected]' session.exec 'hostname' session.loop end |
Grab the first preview release (version 0.99.0):
gem install --source http://gems.jamisbuck.org net-ssh-multi
You can follow development via GitHub:
http://github.com/jamis/net-ssh-multi/tree/master
For all of these libraries I’ve tried to make the rdoc and ri documentation as informative as possible, so please refer to those to get started. If those aren’t helpful enough, let me know what could make them more useful!