Solaris9+Capistranoはダメだった
LinuxからSolaris9に対してカピストラーノをかけようとしてもどうしてもうまくいきませんでした.
試にVMware Player用にOpenSolarisをダウンロードして試してみたのですが,再現できませんでした(=Capistranoが使えてしまった).そしてもしやと思い,Solaris10に対してカピストラーノをかけると,やっぱり通ってしまいました...結局,Solaris9だけの問題に(私の環境では).
通信自体がうまくいっていない感じなので,CapistranoのせいじゃなくてNet::SSHがうまくいっていないと考え,こんなプログラムを実行してみると,どうやらビンゴっぽいです.
require 'rubygems' require 'net/ssh' Net::SSH.start('Solaris9 server','example user',:verbose=>:debug) do |ssh| puts ssh.exec("hostname") end;
結果を抜粋すると,
D, [2010-08-26T11:53:57.333482 #20617] DEBUG -- net.ssh.authentication.session[47273fc]: beginning authentication of`example user' D, [2010-08-26T11:53:57.333728 #20617] DEBUG -- tcpsocket[4782cf2]: queueing packet nr 3 type 5 len 28 D, [2010-08-26T11:53:57.333819 #20617] DEBUG -- tcpsocket[4782cf2]: sent 52 bytes D, [2010-08-26T11:53:57.333945 #20617] DEBUG -- tcpsocket[4782cf2]: read 0 bytes /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/transport/packet_stream.rb:100:in`block in next_packet': connection closed by remote host (Net::SSH::Disconnect) from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/transport/packet_stream.rb:90:in `loop' from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/transport/packet_stream.rb:90:in `next_packet' from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/transport/session.rb:169:in `block in poll_message' from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/transport/session.rb:164:in `loop' from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/transport/session.rb:164:in `poll_message' from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/transport/session.rb:149:in `next_message' from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/authentication/session.rb:82:in `block in next_message' from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/authentication/session.rb:81:in `loop' from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/authentication/session.rb:81:in `next_message' from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/authentication/session.rb:110:in `expect_message' from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh/authentication/session.rb:53:in `authenticate' from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.0.23/lib/net/ssh.rb:183:in `start' from test.rb:4:in `<main>'
原因は,transport/session.rbのここ.
def next_message poll_message(:block) end
ブロッキングモードを指定しているのに,ブロックしないでその時点で通信が無いとすぐに戻ってきてしまうので,
D, [2010-08-26T11:53:57.333819 #20617] DEBUG -- tcpsocket[4782cf2]: sent 52 bytes D, [2010-08-26T11:53:57.333945 #20617] DEBUG -- tcpsocket[4782cf2]: read 0 bytes
read 0 bytesになって,transport/packet_stream.rbのここではじかれてしまう.
if fill <= 0 raise Net::SSH::Disconnect, "connection closed by remote host" end
Net::SSHの作者も投げ出してるようなので...ダメかな...
Date: 2009-03-13 00:51 Sender: Jamis Buck Hey, thanks for the bug report. Sadly, I'm no longer actively maintaining the Net::SSH library (especially with regards to solaris--what a nightmare that OS is to support, almost as bad as windows sometimes). However, if you figure out what is happening, I'll be happy to accept a patch.
参考までに,Solaris10に対して実行すると,パスワード認証でも公開鍵認証でもちゃんとうまくいきます.
まぁ,ブロッキングモードがうまくいかない箇所を調べると,
loop do result = Net::SSH::Compat.io_select([self]) or next break if result.first.any? end if fill <= 0 raise Net::SSH::Disconnect, "connection closed by remote host" end
と,〜Compat〜と妙なことをやっているので(当時あったバグを回避しているつもりらしい),これを直したりとかやってみようかとは思います.
どうせ消えゆくSolaris9,無駄な作業になるでしょうが...Soraris9でコンパイルがそのままでは通らなかったmemcachedやlibmemcachedもパッチを作ったので,毒食らわば皿までです.