lib/sup/mbox/ssh-file.rb in sup-0.0.7 vs lib/sup/mbox/ssh-file.rb in sup-0.0.8

- old
+ new

@@ -104,18 +104,16 @@ @fn = fn @ssh_opts = ssh_opts @file_size = nil @offset = 0 @say_id = nil - @broken_msg = nil @shell = nil @shell_mutex = nil @buf_mutex = Mutex.new end def to_s; "mbox+ssh://#@host/#@fn"; end ## TODO: remove this EVILness - def broken?; !@broken_msg.nil?; end def connect do_remote nil end @@ -162,58 +160,51 @@ BufferManager.clear @say_id if BufferManager.instantiated? && @say_id @say_id = nil end def unsafe_connect - raise SSHFileError, @broken_msg if broken? return if @shell @key = [@host, @ssh_opts[:username]] begin @shell, @shell_mutex = @@shells_mutex.synchronize do unless @@shells.member? @key say "Opening SSH connection to #{@host} for #@fn..." - #raise SSHFileError, "simulated SSH file error" session = Net::SSH.start @host, @ssh_opts say "Starting SSH shell..." @@shells[@key] = [session.shell.sync, Mutex.new] end @@shells[@key] end - + say "Checking for #@fn..." @shell_mutex.synchronize { raise Errno::ENOENT, @fn unless @shell.test("-e #@fn").status == 0 } ensure shutup end end def do_remote cmd, expected_size=0 retries = 0 result = nil + begin - begin - unsafe_connect - if cmd - # MBox::debug "sending command: #{cmd.inspect}" - result = @shell_mutex.synchronize { x = @shell.send_command cmd; sleep 0.25; x } - raise SSHFileError, "Failure during remote command #{cmd.inspect}: #{(result.stderr || result.stdout || "")[0 .. 100]}" unless result.status == 0 + unsafe_connect + if cmd + # MBox::debug "sending command: #{cmd.inspect}" + result = @shell_mutex.synchronize { x = @shell.send_command cmd; sleep 0.25; x } + raise SSHFileError, "Failure during remote command #{cmd.inspect}: #{(result.stderr || result.stdout || "")[0 .. 100]}" unless result.status == 0 + end + ## Net::SSH::Exceptions seem to happen every once in a while for + ## no good reason. + rescue Net::SSH::Exception, *RECOVERABLE_ERRORS + if (retries += 1) <= 3 + @@shells_mutex.synchronize do + @shell = nil + @@shells[@key] = nil end - - ## Net::SSH::Exceptions seem to happen every once in a while for - ## no good reason. - rescue Net::SSH::Exception, *RECOVERABLE_ERRORS - if (retries += 1) <= 3 - @@shells_mutex.synchronize do - @shell = nil - @@shells[@key] = nil - end - retry - end - raise + retry end - rescue Net::SSH::Exception, SSHFileError, SystemCallError => e - @broken_msg = e.message raise end result.stdout if cmd end