summaryrefslogtreecommitdiff
path: root/lib/net/ssh/multi/server.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/net/ssh/multi/server.rb')
-rw-r--r--lib/net/ssh/multi/server.rb92
1 files changed, 92 insertions, 0 deletions
diff --git a/lib/net/ssh/multi/server.rb b/lib/net/ssh/multi/server.rb
new file mode 100644
index 0000000..e6f337b
--- /dev/null
+++ b/lib/net/ssh/multi/server.rb
@@ -0,0 +1,92 @@
+require 'net/ssh'
+
+module Net; module SSH; module Multi
+ class Server
+ attr_reader :host
+ attr_reader :user
+ attr_reader :options
+ attr_reader :gateway
+
+ def initialize(host, user, options={})
+ @host = host
+ @user = user
+ @options = options.dup
+ @gateway = @options.delete(:via)
+ end
+
+ def port
+ options[:port] || 22
+ end
+
+ def eql?(server)
+ host == server.host &&
+ user == server.user &&
+ port == server.port
+ end
+
+ alias :== :eql?
+
+ def hash
+ @hash ||= [host, user, port].hash
+ end
+
+ def to_s
+ @to_s ||= begin
+ s = "#{user}@#{host}"
+ s << ":#{options[:port]}" if options[:port]
+ s
+ end
+ end
+
+ def session(ensure_open=false)
+ return @session if @session || !ensure_open
+ @session ||= begin
+ session = if gateway
+ gateway.ssh(host, user, options)
+ else
+ Net::SSH.start(host, user, options)
+ end
+
+ session[:server] = self
+ session
+ end
+ rescue Net::SSH::AuthenticationFailed => error
+ raise Net::SSH::AuthenticationFailed.new("#{error.message}@#{host}")
+ end
+
+ def close_channels
+ session.channels.each { |id, channel| channel.close } if session
+ end
+
+ def close
+ session.transport.close if session
+ end
+
+ def busy?(include_invisible=false)
+ session && session.busy?(include_invisible)
+ end
+
+ def preprocess(&block)
+ return true unless session
+ session.preprocess(&block)
+ end
+
+ def readers
+ return [] unless session
+ session.listeners.keys
+ end
+
+ def writers
+ return [] unless session
+ session.listeners.keys.select do |io|
+ io.respond_to?(:pending_write?) && io.pending_write?
+ end
+ end
+
+ def postprocess(readers, writers)
+ return true unless session
+ listeners = session.listeners.keys
+ session.postprocess(listeners & readers, listeners & writers)
+ end
+ end
+end; end; end \ No newline at end of file